]> git.deb.at Git - rhonda/theotherroles.git/commitdiff
files for Update V4.7.0
authorgendelo3 <gendelo3@gmail.com>
Sat, 18 Jan 2025 18:03:54 +0000 (19:03 +0100)
committergendelo3 <gendelo3@gmail.com>
Sat, 18 Jan 2025 18:03:54 +0000 (19:03 +0100)
475 files changed:
README.md
TheOtherRoles/Buttons.cs
TheOtherRoles/CustomGameModes/GameModePatches.cs
TheOtherRoles/CustomGameModes/GuesserGM.cs
TheOtherRoles/CustomGameModes/HideNSeekGM.cs
TheOtherRoles/CustomGameModes/PropHunt.cs
TheOtherRoles/CustomOptionHolder.cs
TheOtherRoles/Helpers.cs
TheOtherRoles/Main.cs
TheOtherRoles/Modules/BepInExUpdater.cs
TheOtherRoles/Modules/ChatCommands.cs
TheOtherRoles/Modules/CustomOptions.cs
TheOtherRoles/Modules/DynamicLobbies.cs
TheOtherRoles/Objects/Bomb.cs
TheOtherRoles/Objects/CustomButton.cs
TheOtherRoles/Objects/Footprint.cs
TheOtherRoles/Objects/JackInTheBox.cs
TheOtherRoles/Objects/NinjaTrace.cs
TheOtherRoles/Objects/Portal.cs
TheOtherRoles/Objects/Silhouette.cs
TheOtherRoles/Objects/Trap.cs
TheOtherRoles/Patches/CredentialsPatch.cs
TheOtherRoles/Patches/DangerMeterPatch.cs
TheOtherRoles/Patches/EndGamePatch.cs
TheOtherRoles/Patches/ExileControllerPatch.cs
TheOtherRoles/Patches/GameStartManagerPatch.cs
TheOtherRoles/Patches/HauntMenuMinigamePatch.cs
TheOtherRoles/Patches/IntroPatch.cs
TheOtherRoles/Patches/LobbyScreenPatch.cs [new file with mode: 0644]
TheOtherRoles/Patches/MapBehaviourPatch.cs
TheOtherRoles/Patches/MeetingPatch.cs
TheOtherRoles/Patches/PlayerControlPatch.cs
TheOtherRoles/Patches/RegionMenuPatch.cs
TheOtherRoles/Patches/RoleAssignmentPatch.cs
TheOtherRoles/Patches/TransportationToolPatches.cs
TheOtherRoles/Patches/UpdatePatch.cs
TheOtherRoles/Patches/UsablesPatch.cs
TheOtherRoles/RPC.cs
TheOtherRoles/Resources/AnimatedVentSealed.png
TheOtherRoles/Resources/Arrow.png
TheOtherRoles/Resources/Banner.png
TheOtherRoles/Resources/Banner2.png
TheOtherRoles/Resources/Blood1.png
TheOtherRoles/Resources/Blood2.png
TheOtherRoles/Resources/Blood3.png
TheOtherRoles/Resources/Bomb.png
TheOtherRoles/Resources/BombBackground.png
TheOtherRoles/Resources/Bomb_Button_Defuse.png
TheOtherRoles/Resources/Bomb_Button_Plant.png
TheOtherRoles/Resources/CamoButton.png
TheOtherRoles/Resources/CentralLowerBlocked.png
TheOtherRoles/Resources/CentralUpperBlocked.png
TheOtherRoles/Resources/CleanButton.png
TheOtherRoles/Resources/CloseVentButton.png
TheOtherRoles/Resources/Copy.png
TheOtherRoles/Resources/CopyActive.png
TheOtherRoles/Resources/CopyButton.png
TheOtherRoles/Resources/CopyPasteBG.png
TheOtherRoles/Resources/CreditsButton.png
TheOtherRoles/Resources/CurrentSettingsButton.png
TheOtherRoles/Resources/CurseButton.png
TheOtherRoles/Resources/CurseKillButton.png
TheOtherRoles/Resources/DeputizeButton.png
TheOtherRoles/Resources/DeputyHandcuffButton.png
TheOtherRoles/Resources/DeputyHandcuffed.png
TheOtherRoles/Resources/DisguiseButton.png
TheOtherRoles/Resources/DouseButton.png
TheOtherRoles/Resources/EmergencyButton.png
TheOtherRoles/Resources/EraserButton.png
TheOtherRoles/Resources/FindButton.png
TheOtherRoles/Resources/Footprint.png
TheOtherRoles/Resources/FungleVentSealed.png
TheOtherRoles/Resources/Garlic.png
TheOtherRoles/Resources/GarlicBackground.png
TheOtherRoles/Resources/GarlicButton.png
TheOtherRoles/Resources/HackerButton.png
TheOtherRoles/Resources/HideNSeekArrowButton.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat10.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat10_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat12.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat12_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat13.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat13_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat14.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat14_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat15.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat15_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat19.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat19_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat1_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat2.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat21.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat22.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat23_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat24_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat25_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat26.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat26_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat27.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat27_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat28.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat28_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat29_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat30_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat31_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat34.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat34_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat36_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat38_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat39.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat39_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat4.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat41_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat43_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat44_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive_flip.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat46.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat46_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat47_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat49_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat50_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat51_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat53_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat54_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat55_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat56.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_climb.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_flip.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_bounce_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_climb_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat5_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat7.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat7_back.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_back_adaptive.png
TheOtherRoles/Resources/HorseHats/HorseSpecialHat9.png
TheOtherRoles/Resources/HorseModeButtonOff.png
TheOtherRoles/Resources/HorseModeButtonOn.png
TheOtherRoles/Resources/IgniteButton.png
TheOtherRoles/Resources/IntroAnimation/intro [new file with mode: 0644]
TheOtherRoles/Resources/InvisButton.png
TheOtherRoles/Resources/LighterButton.png
TheOtherRoles/Resources/LightsOutButton.png
TheOtherRoles/Resources/MediumButton.png
TheOtherRoles/Resources/MinusButton.png
TheOtherRoles/Resources/Minus_Button.png
TheOtherRoles/Resources/Minus_ButtonActive.png
TheOtherRoles/Resources/ModStamp.png
TheOtherRoles/Resources/MorphButton.png
TheOtherRoles/Resources/NightVisionOverlay.png
TheOtherRoles/Resources/NinjaAssassinateButton.png
TheOtherRoles/Resources/NinjaMarkButton.png
TheOtherRoles/Resources/NinjaTraceW.png
TheOtherRoles/Resources/Paste.png
TheOtherRoles/Resources/PasteActive.png
TheOtherRoles/Resources/PasteButton.png
TheOtherRoles/Resources/PathfindButton.png
TheOtherRoles/Resources/PlaceCameraButton.png
TheOtherRoles/Resources/PlaceJackInTheBoxButton.png
TheOtherRoles/Resources/PlacePortalButton.png
TheOtherRoles/Resources/PlusButton.png
TheOtherRoles/Resources/Plus_Button.png
TheOtherRoles/Resources/Plus_ButtonActive.png
TheOtherRoles/Resources/PortalAnimation/plattform.png
TheOtherRoles/Resources/PortalAnimation/portal_000.png
TheOtherRoles/Resources/PortalAnimation/portal_001.png
TheOtherRoles/Resources/PortalAnimation/portal_002.png
TheOtherRoles/Resources/PortalAnimation/portal_003.png
TheOtherRoles/Resources/PortalAnimation/portal_004.png
TheOtherRoles/Resources/PortalAnimation/portal_005.png
TheOtherRoles/Resources/PortalAnimation/portal_006.png
TheOtherRoles/Resources/PortalAnimation/portal_007.png
TheOtherRoles/Resources/PortalAnimation/portal_008.png
TheOtherRoles/Resources/PortalAnimation/portal_009.png
TheOtherRoles/Resources/PortalAnimation/portal_010.png
TheOtherRoles/Resources/PortalAnimation/portal_011.png
TheOtherRoles/Resources/PortalAnimation/portal_012.png
TheOtherRoles/Resources/PortalAnimation/portal_013.png
TheOtherRoles/Resources/PortalAnimation/portal_014.png
TheOtherRoles/Resources/PortalAnimation/portal_015.png
TheOtherRoles/Resources/PortalAnimation/portal_016.png
TheOtherRoles/Resources/PortalAnimation/portal_017.png
TheOtherRoles/Resources/PortalAnimation/portal_018.png
TheOtherRoles/Resources/PortalAnimation/portal_019.png
TheOtherRoles/Resources/PortalAnimation/portal_020.png
TheOtherRoles/Resources/PortalAnimation/portal_021.png
TheOtherRoles/Resources/PortalAnimation/portal_022.png
TheOtherRoles/Resources/PortalAnimation/portal_023.png
TheOtherRoles/Resources/PortalAnimation/portal_024.png
TheOtherRoles/Resources/PortalAnimation/portal_025.png
TheOtherRoles/Resources/PortalAnimation/portal_026.png
TheOtherRoles/Resources/PortalAnimation/portal_027.png
TheOtherRoles/Resources/PortalAnimation/portal_028.png
TheOtherRoles/Resources/PortalAnimation/portal_029.png
TheOtherRoles/Resources/PortalAnimation/portal_030.png
TheOtherRoles/Resources/PortalAnimation/portal_031.png
TheOtherRoles/Resources/PortalAnimation/portal_032.png
TheOtherRoles/Resources/PortalAnimation/portal_033.png
TheOtherRoles/Resources/PortalAnimation/portal_034.png
TheOtherRoles/Resources/PortalAnimation/portal_035.png
TheOtherRoles/Resources/PortalAnimation/portal_036.png
TheOtherRoles/Resources/PortalAnimation/portal_037.png
TheOtherRoles/Resources/PortalAnimation/portal_038.png
TheOtherRoles/Resources/PortalAnimation/portal_039.png
TheOtherRoles/Resources/PortalAnimation/portal_040.png
TheOtherRoles/Resources/PortalAnimation/portal_041.png
TheOtherRoles/Resources/PortalAnimation/portal_042.png
TheOtherRoles/Resources/PortalAnimation/portal_043.png
TheOtherRoles/Resources/PortalAnimation/portal_044.png
TheOtherRoles/Resources/PortalAnimation/portal_045.png
TheOtherRoles/Resources/PortalAnimation/portal_046.png
TheOtherRoles/Resources/PortalAnimation/portal_047.png
TheOtherRoles/Resources/PortalAnimation/portal_048.png
TheOtherRoles/Resources/PortalAnimation/portal_049.png
TheOtherRoles/Resources/PortalAnimation/portal_050.png
TheOtherRoles/Resources/PortalAnimation/portal_051.png
TheOtherRoles/Resources/PortalAnimation/portal_052.png
TheOtherRoles/Resources/PortalAnimation/portal_053.png
TheOtherRoles/Resources/PortalAnimation/portal_054.png
TheOtherRoles/Resources/PortalAnimation/portal_055.png
TheOtherRoles/Resources/PortalAnimation/portal_056.png
TheOtherRoles/Resources/PortalAnimation/portal_057.png
TheOtherRoles/Resources/PortalAnimation/portal_058.png
TheOtherRoles/Resources/PortalAnimation/portal_059.png
TheOtherRoles/Resources/PortalAnimation/portal_060.png
TheOtherRoles/Resources/PortalAnimation/portal_061.png
TheOtherRoles/Resources/PortalAnimation/portal_062.png
TheOtherRoles/Resources/PortalAnimation/portal_063.png
TheOtherRoles/Resources/PortalAnimation/portal_064.png
TheOtherRoles/Resources/PortalAnimation/portal_065.png
TheOtherRoles/Resources/PortalAnimation/portal_066.png
TheOtherRoles/Resources/PortalAnimation/portal_067.png
TheOtherRoles/Resources/PortalAnimation/portal_068.png
TheOtherRoles/Resources/PortalAnimation/portal_069.png
TheOtherRoles/Resources/PortalAnimation/portal_070.png
TheOtherRoles/Resources/PortalAnimation/portal_071.png
TheOtherRoles/Resources/PortalAnimation/portal_072.png
TheOtherRoles/Resources/PortalAnimation/portal_073.png
TheOtherRoles/Resources/PortalAnimation/portal_074.png
TheOtherRoles/Resources/PortalAnimation/portal_075.png
TheOtherRoles/Resources/PortalAnimation/portal_076.png
TheOtherRoles/Resources/PortalAnimation/portal_077.png
TheOtherRoles/Resources/PortalAnimation/portal_078.png
TheOtherRoles/Resources/PortalAnimation/portal_079.png
TheOtherRoles/Resources/PortalAnimation/portal_080.png
TheOtherRoles/Resources/PortalAnimation/portal_081.png
TheOtherRoles/Resources/PortalAnimation/portal_082.png
TheOtherRoles/Resources/PortalAnimation/portal_083.png
TheOtherRoles/Resources/PortalAnimation/portal_084.png
TheOtherRoles/Resources/PortalAnimation/portal_085.png
TheOtherRoles/Resources/PortalAnimation/portal_086.png
TheOtherRoles/Resources/PortalAnimation/portal_087.png
TheOtherRoles/Resources/PortalAnimation/portal_088.png
TheOtherRoles/Resources/PortalAnimation/portal_089.png
TheOtherRoles/Resources/PortalAnimation/portal_090.png
TheOtherRoles/Resources/PortalAnimation/portal_091.png
TheOtherRoles/Resources/PortalAnimation/portal_092.png
TheOtherRoles/Resources/PortalAnimation/portal_093.png
TheOtherRoles/Resources/PortalAnimation/portal_094.png
TheOtherRoles/Resources/PortalAnimation/portal_095.png
TheOtherRoles/Resources/PortalAnimation/portal_096.png
TheOtherRoles/Resources/PortalAnimation/portal_097.png
TheOtherRoles/Resources/PortalAnimation/portal_098.png
TheOtherRoles/Resources/PortalAnimation/portal_099.png
TheOtherRoles/Resources/PortalAnimation/portal_100.png
TheOtherRoles/Resources/PortalAnimation/portal_101.png
TheOtherRoles/Resources/PortalAnimation/portal_102.png
TheOtherRoles/Resources/PortalAnimation/portal_103.png
TheOtherRoles/Resources/PortalAnimation/portal_104.png
TheOtherRoles/Resources/PortalAnimation/portal_105.png
TheOtherRoles/Resources/PortalAnimation/portal_106.png
TheOtherRoles/Resources/PortalAnimation/portal_107.png
TheOtherRoles/Resources/PortalAnimation/portal_108.png
TheOtherRoles/Resources/PortalAnimation/portal_109.png
TheOtherRoles/Resources/PortalAnimation/portal_110.png
TheOtherRoles/Resources/PortalAnimation/portal_111.png
TheOtherRoles/Resources/PortalAnimation/portal_112.png
TheOtherRoles/Resources/PortalAnimation/portal_113.png
TheOtherRoles/Resources/PortalAnimation/portal_114.png
TheOtherRoles/Resources/PortalAnimation/portal_115.png
TheOtherRoles/Resources/PortalAnimation/portal_116.png
TheOtherRoles/Resources/PortalAnimation/portal_117.png
TheOtherRoles/Resources/PortalAnimation/portal_118.png
TheOtherRoles/Resources/PortalAnimation/portal_119.png
TheOtherRoles/Resources/PortalAnimation/portal_120.png
TheOtherRoles/Resources/PortalAnimation/portal_121.png
TheOtherRoles/Resources/PortalAnimation/portal_122.png
TheOtherRoles/Resources/PortalAnimation/portal_123.png
TheOtherRoles/Resources/PortalAnimation/portal_124.png
TheOtherRoles/Resources/PortalAnimation/portal_125.png
TheOtherRoles/Resources/PortalAnimation/portal_126.png
TheOtherRoles/Resources/PortalAnimation/portal_127.png
TheOtherRoles/Resources/PortalAnimation/portal_128.png
TheOtherRoles/Resources/PortalAnimation/portal_129.png
TheOtherRoles/Resources/PortalAnimation/portal_130.png
TheOtherRoles/Resources/PortalAnimation/portal_131.png
TheOtherRoles/Resources/PortalAnimation/portal_132.png
TheOtherRoles/Resources/PortalAnimation/portal_133.png
TheOtherRoles/Resources/PortalAnimation/portal_134.png
TheOtherRoles/Resources/PortalAnimation/portal_135.png
TheOtherRoles/Resources/PortalAnimation/portal_136.png
TheOtherRoles/Resources/PortalAnimation/portal_137.png
TheOtherRoles/Resources/PortalAnimation/portal_138.png
TheOtherRoles/Resources/PortalAnimation/portal_139.png
TheOtherRoles/Resources/PortalAnimation/portal_140.png
TheOtherRoles/Resources/PortalAnimation/portal_141.png
TheOtherRoles/Resources/PortalAnimation/portal_142.png
TheOtherRoles/Resources/PortalAnimation/portal_143.png
TheOtherRoles/Resources/PortalAnimation/portal_144.png
TheOtherRoles/Resources/PortalAnimation/portal_145.png
TheOtherRoles/Resources/PortalAnimation/portal_146.png
TheOtherRoles/Resources/PortalAnimation/portal_147.png
TheOtherRoles/Resources/PortalAnimation/portal_148.png
TheOtherRoles/Resources/PortalAnimation/portal_149.png
TheOtherRoles/Resources/PortalAnimation/portal_150.png
TheOtherRoles/Resources/PortalAnimation/portal_151.png
TheOtherRoles/Resources/PortalAnimation/portal_152.png
TheOtherRoles/Resources/PortalAnimation/portal_153.png
TheOtherRoles/Resources/PortalAnimation/portal_154.png
TheOtherRoles/Resources/PortalAnimation/portal_155.png
TheOtherRoles/Resources/PortalAnimation/portal_156.png
TheOtherRoles/Resources/PortalAnimation/portal_157.png
TheOtherRoles/Resources/PortalAnimation/portal_158.png
TheOtherRoles/Resources/PortalAnimation/portal_159.png
TheOtherRoles/Resources/PortalAnimation/portal_160.png
TheOtherRoles/Resources/PortalAnimation/portal_161.png
TheOtherRoles/Resources/PortalAnimation/portal_162.png
TheOtherRoles/Resources/PortalAnimation/portal_163.png
TheOtherRoles/Resources/PortalAnimation/portal_164.png
TheOtherRoles/Resources/PortalAnimation/portal_165.png
TheOtherRoles/Resources/PortalAnimation/portal_166.png
TheOtherRoles/Resources/PortalAnimation/portal_167.png
TheOtherRoles/Resources/PortalAnimation/portal_168.png
TheOtherRoles/Resources/PortalAnimation/portal_169.png
TheOtherRoles/Resources/PortalAnimation/portal_170.png
TheOtherRoles/Resources/PortalAnimation/portal_171.png
TheOtherRoles/Resources/PortalAnimation/portal_172.png
TheOtherRoles/Resources/PortalAnimation/portal_173.png
TheOtherRoles/Resources/PortalAnimation/portal_174.png
TheOtherRoles/Resources/PortalAnimation/portal_175.png
TheOtherRoles/Resources/PortalAnimation/portal_176.png
TheOtherRoles/Resources/PortalAnimation/portal_177.png
TheOtherRoles/Resources/PortalAnimation/portal_178.png
TheOtherRoles/Resources/PortalAnimation/portal_179.png
TheOtherRoles/Resources/PortalAnimation/portal_180.png
TheOtherRoles/Resources/PortalAnimation/portal_181.png
TheOtherRoles/Resources/PortalAnimation/portal_182.png
TheOtherRoles/Resources/PortalAnimation/portal_183.png
TheOtherRoles/Resources/PortalAnimation/portal_184.png
TheOtherRoles/Resources/PortalAnimation/portal_185.png
TheOtherRoles/Resources/PortalAnimation/portal_186.png
TheOtherRoles/Resources/PortalAnimation/portal_187.png
TheOtherRoles/Resources/PortalAnimation/portal_188.png
TheOtherRoles/Resources/PortalAnimation/portal_189.png
TheOtherRoles/Resources/PortalAnimation/portal_190.png
TheOtherRoles/Resources/PortalAnimation/portal_191.png
TheOtherRoles/Resources/PortalAnimation/portal_192.png
TheOtherRoles/Resources/PortalAnimation/portal_193.png
TheOtherRoles/Resources/PortalAnimation/portal_194.png
TheOtherRoles/Resources/PortalAnimation/portal_195.png
TheOtherRoles/Resources/PortalAnimation/portal_196.png
TheOtherRoles/Resources/PortalAnimation/portal_197.png
TheOtherRoles/Resources/PortalAnimation/portal_198.png
TheOtherRoles/Resources/PortalAnimation/portal_199.png
TheOtherRoles/Resources/PortalAnimation/portal_200.png
TheOtherRoles/Resources/PortalAnimation/portal_201.png
TheOtherRoles/Resources/PortalAnimation/portal_202.png
TheOtherRoles/Resources/PortalAnimation/portal_203.png
TheOtherRoles/Resources/PortalAnimation/portal_204.png
TheOtherRoles/Resources/PursuerButton.png
TheOtherRoles/Resources/RepairButton.png
TheOtherRoles/Resources/Reveal.png
TheOtherRoles/Resources/RewindButton.png
TheOtherRoles/Resources/SampleButton.png
TheOtherRoles/Resources/SeerButton.png
TheOtherRoles/Resources/Settings_Button.png
TheOtherRoles/Resources/Settings_ButtonActive.png
TheOtherRoles/Resources/ShieldButton.png
TheOtherRoles/Resources/ShiftButton.png
TheOtherRoles/Resources/SidekickButton.png
TheOtherRoles/Resources/Silhouette.png
TheOtherRoles/Resources/Soul.png
TheOtherRoles/Resources/SoundEffects/toraudio [new file with mode: 0644]
TheOtherRoles/Resources/SpeedboostButton.png
TheOtherRoles/Resources/SpellButton.png
TheOtherRoles/Resources/SpellButtonMeeting.png
TheOtherRoles/Resources/StaticVentSealed.png
TheOtherRoles/Resources/StopClean.png
TheOtherRoles/Resources/SwapperCheck.png
TheOtherRoles/Resources/TabIcon.png
TheOtherRoles/Resources/TabIconClassicMode.png
TheOtherRoles/Resources/TabIconCrewmate.png
TheOtherRoles/Resources/TabIconGuesserMode.png
TheOtherRoles/Resources/TabIconGuesserSettings.png
TheOtherRoles/Resources/TabIconHideNSeekMode.png
TheOtherRoles/Resources/TabIconHideNSeekRoles.png
TheOtherRoles/Resources/TabIconHideNSeekSettings.png
TheOtherRoles/Resources/TabIconImpostor.png
TheOtherRoles/Resources/TabIconModifier.png
TheOtherRoles/Resources/TabIconNeutral.png
TheOtherRoles/Resources/TabIconPropHuntSettings.png
TheOtherRoles/Resources/TargetIcon.png
TheOtherRoles/Resources/TimeShieldButton.png
TheOtherRoles/Resources/TrackerButton.png
TheOtherRoles/Resources/Trapper_Place_Button.png
TheOtherRoles/Resources/Trapper_Trap_Ingame.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0001.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0002.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0003.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0004.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0005.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0006.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0007.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0008.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0009.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0010.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0011.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0012.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0013.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0014.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0015.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0016.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0017.png
TheOtherRoles/Resources/TricksterAnimation/trickster_box_0018.png
TheOtherRoles/Resources/TricksterVentButton.png
TheOtherRoles/Resources/UnStuck.png
TheOtherRoles/Resources/UsePortalButton.png
TheOtherRoles/Resources/VampireButton.png
TheOtherRoles/Resources/Vent.png
TheOtherRoles/Resources/VultureButton.png
TheOtherRoles/Resources/YoyoBlinkButtonSprite.png
TheOtherRoles/Resources/YoyoMarkButtonSprite.png
TheOtherRoles/Resources/bannerTheHorseRoles.png
TheOtherRoles/RoleInfo.cs
TheOtherRoles/SoundEffectsManager.cs
TheOtherRoles/SubmergedCompatibility.cs
TheOtherRoles/TasksHandler.cs
TheOtherRoles/TheOtherRoles.cs
TheOtherRoles/TheOtherRoles.csproj
TheOtherRoles/Utilities/EventUtility.cs
TheOtherRoles/Utilities/HandleGuesser.cs
TheOtherRoles/packages.lock.json

index 7ac7ef69f23ed4b59135e7a1f61779fea61ad99d..162d39fdf88bf75063a45facbaa1bf51a4759fcd 100644 (file)
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ Even more roles are coming soon. :)
 | [Cleaner](#cleaner) | [Swapper](#swapper) | [Thief](#thief) | [Invert](#invert) |
 | [Warlock](#warlock) | [Seer](#seer) |  | [Chameleon](#chameleon) |
 | [Bounty Hunter](#bounty-hunter) | [Hacker](#hacker) |  | [Shifter](#shifter)
-| [Witch](#witch) | [Tracker](#tracker) |  |  |
+| [Witch](#witch) | [Tracker](#tracker) |  | [Armored](#armored) |
 | [Ninja](#ninja) | [Snitch](#snitch) |  |  |
 | [Bomber](#bomber) | [Spy](#spy) |  |  |
 | [Yo-Yo](#yoyo) | [Portalmaker](#portalmaker) |  |  |
@@ -42,14 +42,16 @@ The [Role Assignment](#role-assignment) section explains how the roles are being
 # Releases
 | Among Us - Version| Mod Version | Link |
 |----------|-------------|-----------------|
-| 2024.6.18s| v4.6.0| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.6.0/TheOtherRoles.zip)
-| 2024.3.5s| v4.5.3| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.3/TheOtherRoles.zip)
+| 2024.11.26| v4.7.0| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.7.0/TheOtherRoles.zip)
+| 2024.6.18| v4.6.0| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.6.0/TheOtherRoles.zip)
+
 
 <details>
   <summary>Click to show older versions</summary>
   
 | Among Us - Version| Mod Version | Link |
 |----------|-------------|-----------------|
+| 2024.3.5s| v4.5.3| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.3/TheOtherRoles.zip)
 | 2024.3.5s| v4.5.2| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.2/TheOtherRoles.zip)
 | 2023.11.28s| v4.5.1| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.1/TheOtherRoles.zip)
 | 2023.11.28s| v4.5.0| [Download](https://github.com/TheOtherRolesAU/TheOtherRoles/releases/download/v4.5.0/TheOtherRoles.zip)
@@ -133,9 +135,21 @@ The [Role Assignment](#role-assignment) section explains how the roles are being
 # Changelog
 <details>
   <summary>Click to show the Changelog</summary>
+
+**Version 4.7.0**
+- Updated to Among Us version 2024.11.26 (Vanilla Updates)
+- Added a new modifier, Armored. The first time the armored would die by an ordinary kill, they are protected by their Armor. (NesTT17 & Gendelo, idea by zFinnyX) 
+- Added the possibility to use the shift keys to (re-)join a lobby, if you just left a lobby or you have a lobby code copied to the clipboard. (twix & Gendelo)
+- Added a setting to Guesser Mode: "Number Of Tasks Needed To Unlock Shooting For Crew Guesser" (NesTT17, idea by DracoL1ch & multiple other players)
+- Fixed a bug with the Tracker's Proximity Meter - it now disappears after the meeting if the target is dead and no new target can be tracked.
+- Fixed a bug with the "Fill Crewmates" option, where selecting a range for min/max neutral roles would often lead to players being plain crewmates without a role
+- Fixed a bug where a passive lover death of a role that can suicide would sometimes give the medium incorrect info.
+- Fixed a bug where the zoom out button would be shown to ghosts during meetings.
+- Changed the way options are shown in the menu: Disabling an option (e.g. a role or modifier spawn chance) will now hide its depending sub-options again (like pre 4.6.0 with the old menu)
+- Change: Significantly decreased the size of our mod by using compression. (Thanks to miniduikboat for giving us a gentle push)
+
   
-  
-** Version 4.6.0**
+**Version 4.6.0**
 - Updated to Among Us version 2024.6.18 (Vanilla Update with new UI elements and many Server Side Changes)
 - Added a completely new UI for the Mod's Options, using the new Vanilla Design.
 - Added a button to switch gamemodes in the lobby
@@ -145,7 +159,7 @@ The [Role Assignment](#role-assignment) section explains how the roles are being
 - Fixed a bug where guessing a player would sometimes not return the votes to the voters
 - Fixed a bug where the Lawyer would not properly die when guessing the client
 - Removed: Disabled Vanilla Servers for now, as the mod is incompatible with them in its / their current state. Thanks to Miniduikboat for making custom servers great again!
-- Experimental: Advanded users can try to install the mod on the Windows Store Version of Among Us. No Support Provided!
+- Experimental: Advanced users can try to install the mod on the Windows Store Version of Among Us. No Support Provided!
 
   
 **Version 4.5.3**
@@ -929,13 +943,6 @@ You can configure:
 
 Please note, that if the configured option exceeds the available number of tasks of a map, the tasks will be limited to that number of tasks. \
 Example: If you configure 4 common tasks on Airship crewmates will only receive 2 common tasks, as airship doesn't offer more than 2 common tasks.
-
-| Map | Common Tasks | Short Tasks | Long Tasks |
-|----------|:-------------:|:-------------:|:-------------:|
-| Skeld / Dleks | 2 | 19 | 8
-| Mira HQ | 2 | 13 | 11
-| Polus | 4 | 14 | 15
-| Airship | 2 | 23 | 15
 -----------------------
 
 ### Random Maps
@@ -1019,7 +1026,8 @@ The Janitor is an Impostor who cannot kill, but they can hide dead bodies instea
 
 ## Morphling
 ### **Team: Impostors**
-The Morphling is an Impostor which can additionally scan the appearance of a player. After an arbitrary time they can take on that appearance for 10s.\
+The Morphling is an Impostor which can additionally scan the appearance of a player.\
+After an arbitrary time they can take on that appearance for a set duration which can be changed in the options.\
 \
 **NOTE:**
 - They shrink to the size of the Mini when they copy its look.
@@ -1319,6 +1327,7 @@ The Jester does not have any tasks. They win the game as a solo, if they get vot
 |----------|:-------------:|
 | Jester Spawn Chance | -
 | Jester Can Call Emergency Meeting | Option to disable the emergency button for the Jester
+|Jester Has Impostor Vision | -
 -----------------------
 
 ## Arsonist
@@ -1332,7 +1341,7 @@ After dousing everyone alive the Arsonist can ignite all the players which resul
 | Name | Description |
 |----------|:-------------:|
 | Arsonist Spawn Chance | -
-| Arsonist Countdown | -
+| Arsonist Cooldown | -
 | Arsonist Douse Duration | The time it takes to douse a player
 -----------------------
 
@@ -1351,8 +1360,8 @@ The team Jackal enables multiple new outcomes of the game, listing some examples
 - The Crew could be eliminated, then the Team Jackal fight against the Impostors (The Crew can still make a task win in this scenario)
 
 The priority of the win conditions is the following:
-1. Crewmate Mini lose by vote
-2. Jester wins by vote
+1. Jester wins by vote (even as Mini)
+2. Crewmate Mini lose by vote
 3. Arsonist win
 4. Team Impostor wins by sabotage
 5. Team Crew wins by tasks (also possible if the whole Crew is dead)
@@ -1371,19 +1380,19 @@ If both Impostors and Jackals are in the game, the game continues even if all Cr
 ### Game Options
 | Name | Description
 |----------|:-------------:|
-| Jackal Spawn Chance | - |
-| Jackal/Sidekick Kill Cooldown | Kill cooldown |
-| Jackal Create Sidekick Cooldown | Cooldown before a Sidekick can be created |
-| Jackal can use vents | Yes/No |
-| Jackal can sabotage Lights | Yes/No |
-| Jackal can create a Sidekick | Yes/No |
-| Sidekick gets promoted to Jackal on Jackal Death | Yes/No |
-| Sidekick can kill | Yes/No |
-| Sidekick can Vent | Yes/No |
-| Jackal can sabotage Lights | Yes/No |
-| Jackals promoted from Sidekick can create a Sidekick | Yes/No (to prevent the Jackal team from growing) |
-| Jackals can make an Impostor to their Sidekick | Yes/No (to prevent a Jackal from turning an Impostor into a Sidekick, if they use the ability on an Impostor they see the Impostor as Sidekick, but the Impostor isn't converted to Sidekick. If this option is set to "No" Jackal and Sidekick can kill each other.) |
-| Jackal and Sidekick have Impostor vision | - |
+| Jackal Spawn Chance | -
+| Jackal/Sidekick Kill Cooldown | Kill Cooldown
+| Jackal Create Sidekick Cooldown | Cooldown before a Sidekick can be created
+| Jackal Can Use Vents | Yes/No
+| Jackal Can Sabotage Lights | Yes/No
+| Jackal Can Create A Sidekick | Yes/No
+| Sidekick Gets Promoted To Jackal On Jackal Death | Yes/No
+| Sidekick Can Kill | Yes/No
+| Sidekick Can Vent | Yes/No
+| Sidekick Can Sabotage Lights | Yes/No
+| Jackals Promoted From Sidekick Can Create A Sidekick | Yes/No (to prevent the Jackal team from growing)
+| Jackals Can Make An Impostor To His Sidekick | Yes/No (to prevent a Jackal from turning an Impostor into a Sidekick, if they use the ability on an Impostor they see the Impostor as Sidekick, but the Impostor isn't converted to Sidekick. If this option is set to "No" Jackal and Sidekick can kill each other.)
+| Jackal And Sidekick Have Impostor Vision | -
 -----------------------
 
 ## Sidekick
@@ -1400,9 +1409,9 @@ Upon the death of the Jackal (depending on the options), they might get promoted
 | Name | Description
 |----------|:-------------:|
 | Jackal/Sidekick Kill Cooldown | Uses the same kill cooldown setting as the Jackal |
-| Sidekick gets promoted to Jackal on Jackal death |  Yes/No |
-| Sidekick can kill | Yes/No |
-| Sidekick can use vents | Yes/No |
+| Sidekick Gets Promoted To Jackal On Jackal Death |  Yes/No |
+| Sidekick Can Kill | Yes/No |
+| Sidekick Can Use Vents | Yes/No |
 -----------------------
 
 ## Vulture
@@ -1536,7 +1545,6 @@ The Mayor has the option to vote with only one vote instead of two (via a button
 The Engineer (if alive) can fix a certain amount of sabotages per game from anywhere on the map.\
 The Engineer can use vents.\
 If the Engineer is inside a vent, depending on the options the members of the team Jackal/Impostors will see a blue outline around all vents on the map (in order to warn them).\
-Because of the vents the Engineer might not be able to start some tasks using the "Use" button, you can double-click on the tasks instead.
 
 **NOTE:**
 - The kill button of Impostors activates if they stand next to a vent where the Engineer is. They can also kill them there. No other action (e.g. Morphling sample, Shifter shift, ...) can affect players inside vents.
@@ -1547,7 +1555,7 @@ Because of the vents the Engineer might not be able to start some tasks using th
 | Engineer Spawn Chance | -
 | Number Of Sabotage Fixes| -
 | Impostors See Vents Highlighted | -
-| Jackal and Sidekick See Vents Highlighted | -
+| Jackal And Sidekick See Vents Highlighted | -
 -----------------------
 
 ## Sheriff
@@ -1693,8 +1701,8 @@ The Swapper now has initial swap charges and can recharge those charges after co
 | Name | Description
 |----------|:-------------:|
 | Swapper Spawn Chance | -
-| Swapper can call emergency meeting | Option to disable the emergency button for the Swapper
-| Swapper can only swap others | Sets whether the Swapper can swap themself or not
+| Swapper Can Call Emergency Meeting | Option to disable the emergency button for the Swapper
+| Swapper Can Only Swap Others | Sets whether the Swapper can swap themself or not
 | Initial Swap Charges | -
 | Number Of Tasks Needed For Recharging | -
 -----------------------
@@ -1940,7 +1948,7 @@ If killed, the Bloody Modifier will leave a trail for x-seconds on their killer.
 |----------|:-------------:|
 | Bloody Spawn Chance | -
 | Bloody Quantity | -
-| Trail duration | -
+| Trail Duration | -
 -----------------------
 
 ## Anti Teleport
@@ -2035,7 +2043,7 @@ The vision will also be affected when lights out.
 |----------|:-------------:|
 | Sunglasses Spawn Chance | -
 | Sunglasses Quantity | -
-| Vision with sunglasses | -
+| Vision With Sunglasses | -
 -----------------------
 
 ## Mini
@@ -2140,6 +2148,22 @@ can only use them, if the previous player did not use them before)
 | Shifter Spawn Chance | -
 -----------------------
 
+## Armored
+
+The Armored is a Modifier that protects the player from the first shot that would have killed them. There can only be one Armored player per round.
+\
+**NOTE:**
+- Armored is only active during the round and does not protect from guesses or votes. 
+- Armored is applied after all other shields or protections, so that the Armor only breaks if the player would have otherwise died.
+- If a killer tries to kill the Armored, they will see the Armor break with a nice animation.
+- The Armored player has no indicator whatsoever if the Armor is still active, unless they break it (Warlock, Sheriff, Thief)
+
+### Game Options
+| Name | Description
+|----------|:-------------:|
+| Armored Spawn Chance | -
+-----------------------
+
 # Gamemodes
 Gamemodes can be switched when creating a lobby or inside the lobby by using a command in the chat:
 `/gm <gamemode>`. Use the following gamemodes: `guess` or `gm`,`prophunt` or `ph`, `hidenseek` or `hns`. If `/gm` is used without argument or the argument can't be parsed, the lobby will switch to classic mode.
@@ -2164,6 +2188,7 @@ Players can additionally have a modifier, if enabled (e.g. Medic Guesser Mini).
 | Guessers Can Have A Modifier | -
 | Guesser Number Of Shots | -
 | Guesser Can Shoot Multiple Times Per Meeting | -
+| Number Of Tasks Needed To Unlock Shooting For Crew Guesser | - 
 | Guesses Ignore The Medic Shield | -
 | Evil Guesser Can Guess The Spy | -
 | Guesser Can't Guess Snitch When Tasks Completed | -
@@ -2250,7 +2275,7 @@ When a Prop dies, they will either join the Hunter team or die (setting).
 | Unstuck Duration | -        | Kill Cooldown After Hit | -            | Invisibility Duration | -
 | Hunter Vision | -           | Reveal Prop Cooldown | -               | Speedboost Enabled | -
 | Prop Vision | -             | Reveal Prop Duration | -               | Speedboost Cooldown | -
-|  | -             | Reveal Time Punish | deducted from rem. timer | Speedboost Duration | - 
+|  | -             | Reveal Time Punish | Deducted from rem. timer | Speedboost Duration | - 
 |  | -                         |  Hunter Admin Cooldown | - | Speedboost Ratio | Factor with which speed is multiplied 
 |  | -                       | Find Cooldown | -
 |  | -               | Find Duration | -
index 7c56ec1c57e8e7ac6b559942fd9b27d21f4288f6..488418770ecf5f8d5b493b6ef44e68bca24cc5a9 100644 (file)
@@ -6,7 +6,6 @@ using static TheOtherRoles.TheOtherRoles;
 using TheOtherRoles.Objects;
 using System.Linq;
 using System.Collections.Generic;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
 using TheOtherRoles.Patches;
@@ -209,10 +208,10 @@ namespace TheOtherRoles
             replacementHandcuffedButton.Timer = replacementHandcuffedButton.EffectDuration;
             replacementHandcuffedButton.actionButton.cooldownTimerText.color = new Color(0F, 0.8F, 0F);
             replacementHandcuffedButton.isEffectActive = true;
-            if (deputyHandcuffedButtons.ContainsKey(CachedPlayer.LocalPlayer.PlayerId))
-                deputyHandcuffedButtons[CachedPlayer.LocalPlayer.PlayerId].Add(replacementHandcuffedButton);
+            if (deputyHandcuffedButtons.ContainsKey(PlayerControl.LocalPlayer.PlayerId))
+                deputyHandcuffedButtons[PlayerControl.LocalPlayer.PlayerId].Add(replacementHandcuffedButton);
             else
-                deputyHandcuffedButtons.Add(CachedPlayer.LocalPlayer.PlayerId, new List<CustomButton> { replacementHandcuffedButton });
+                deputyHandcuffedButtons.Add(PlayerControl.LocalPlayer.PlayerId, new List<CustomButton> { replacementHandcuffedButton });
         }
         
         // Disables / Enables all Buttons (except the ones disabled in the Deputy class), and replaces them with new buttons.
@@ -222,7 +221,7 @@ namespace TheOtherRoles
                 deputyHandcuffedButtons = new Dictionary<byte, List<CustomButton>>();
                 return;
             }
-            if (handcuffed && !deputyHandcuffedButtons.ContainsKey(CachedPlayer.LocalPlayer.PlayerId))
+            if (handcuffed && !deputyHandcuffedButtons.ContainsKey(PlayerControl.LocalPlayer.PlayerId))
             {
                 int maxI = CustomButton.buttons.Count;
                 for (int i = 0; i < maxI; i++)
@@ -244,19 +243,19 @@ namespace TheOtherRoles
                 // Kill Button if enabled for the Role
                 if (FastDestroyableSingleton<HudManager>.Instance.KillButton.isActiveAndEnabled) addReplacementHandcuffedButton(arsonistButton, CustomButton.ButtonPositions.upperRowRight, couldUse: () => { return FastDestroyableSingleton<HudManager>.Instance.KillButton.currentTarget != null; });
                 // Vent Button if enabled
-                if (CachedPlayer.LocalPlayer.PlayerControl.roleCanUseVents()) addReplacementHandcuffedButton(arsonistButton, CustomButton.ButtonPositions.upperRowCenter, couldUse: () => { return FastDestroyableSingleton<HudManager>.Instance.ImpostorVentButton.currentTarget != null; });
+                if (PlayerControl.LocalPlayer.roleCanUseVents()) addReplacementHandcuffedButton(arsonistButton, CustomButton.ButtonPositions.upperRowCenter, couldUse: () => { return FastDestroyableSingleton<HudManager>.Instance.ImpostorVentButton.currentTarget != null; });
                 // Report Button
-                addReplacementHandcuffedButton(arsonistButton, (!CachedPlayer.LocalPlayer.Data.Role.IsImpostor) ? new Vector3(-1f, -0.06f, 0): CustomButton.ButtonPositions.lowerRowRight, () => { return FastDestroyableSingleton<HudManager>.Instance.ReportButton.graphic.color == Palette.EnabledColor; });
+                addReplacementHandcuffedButton(arsonistButton, (!PlayerControl.LocalPlayer.Data.Role.IsImpostor) ? new Vector3(-1f, -0.06f, 0): CustomButton.ButtonPositions.lowerRowRight, () => { return FastDestroyableSingleton<HudManager>.Instance.ReportButton.graphic.color == Palette.EnabledColor; });
             }
-            else if (!handcuffed && deputyHandcuffedButtons.ContainsKey(CachedPlayer.LocalPlayer.PlayerId))  // Reset to original. Disables the replacements, enables the original buttons.
+            else if (!handcuffed && deputyHandcuffedButtons.ContainsKey(PlayerControl.LocalPlayer.PlayerId))  // Reset to original. Disables the replacements, enables the original buttons.
             {
-                foreach (CustomButton replacementButton in deputyHandcuffedButtons[CachedPlayer.LocalPlayer.PlayerId])
+                foreach (CustomButton replacementButton in deputyHandcuffedButtons[PlayerControl.LocalPlayer.PlayerId])
                 {
                     replacementButton.HasButton = () => { return false; };
                     replacementButton.Update(); // To make it disappear properly.
                     CustomButton.buttons.Remove(replacementButton);
                 }
-                deputyHandcuffedButtons.Remove(CachedPlayer.LocalPlayer.PlayerId);
+                deputyHandcuffedButtons.Remove(PlayerControl.LocalPlayer.PlayerId);
 
                 foreach (CustomButton button in CustomButton.buttons)
                 {
@@ -305,13 +304,13 @@ namespace TheOtherRoles
             engineerRepairButton = new CustomButton(
                 () => {
                     engineerRepairButton.Timer = 0f;
-                    MessageWriter usedRepairWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.EngineerUsedRepair, Hazel.SendOption.Reliable, -1);
+                    MessageWriter usedRepairWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerUsedRepair, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(usedRepairWriter);
                     RPCProcedure.engineerUsedRepair();
                     SoundEffectsManager.play("engineerRepair");
-                    foreach (PlayerTask task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator()) {
+                    foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks.GetFastEnumerator()) {
                         if (task.TaskType == TaskTypes.FixLights) {
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.EngineerFixLights, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerFixLights, Hazel.SendOption.Reliable, -1);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
                             RPCProcedure.engineerFixLights();
                         } else if (task.TaskType == TaskTypes.RestoreOxy) {
@@ -328,21 +327,21 @@ namespace TheOtherRoles
                             MapUtilities.CachedShipStatus.RpcRepairSystem(SystemTypes.Reactor, 0 | 16);
                             MapUtilities.CachedShipStatus.RpcRepairSystem(SystemTypes.Reactor, 1 | 16);
                         } else if (SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask) {
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.EngineerFixSubmergedOxygen, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.EngineerFixSubmergedOxygen, Hazel.SendOption.Reliable, -1);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
                             RPCProcedure.engineerFixSubmergedOxygen();
                         }
 
                     }
                 },
-                () => { return Engineer.engineer != null && Engineer.engineer == CachedPlayer.LocalPlayer.PlayerControl && Engineer.remainingFixes > 0 && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Engineer.engineer != null && Engineer.engineer == PlayerControl.LocalPlayer && Engineer.remainingFixes > 0 && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     bool sabotageActive = false;
-                    foreach (PlayerTask task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator())
+                    foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks.GetFastEnumerator())
                         if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles
                             || SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)
                             sabotageActive = true;
-                    return sabotageActive && Engineer.remainingFixes > 0 && CachedPlayer.LocalPlayer.PlayerControl.CanMove;
+                    return sabotageActive && Engineer.remainingFixes > 0 && PlayerControl.LocalPlayer.CanMove;
                 },
                 () => {},
                 Engineer.getButtonSprite(),
@@ -354,19 +353,19 @@ namespace TheOtherRoles
             // Janitor Clean
             janitorCleanButton = new CustomButton(
                 () => {
-                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance, Constants.PlayersOnlyMask)) {
+                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.PlayersOnlyMask)) {
                         if (collider2D.tag == "DeadBody")
                         {
                             DeadBody component = collider2D.GetComponent<DeadBody>();
                             if (component && !component.Reported)
                             {
-                                Vector2 truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition();
+                                Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition();
                                 Vector2 truePosition2 = component.TruePosition;
-                                if (Vector2.Distance(truePosition2, truePosition) <= CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance && CachedPlayer.LocalPlayer.PlayerControl.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false))
+                                if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false))
                                 {
                                     NetworkedPlayerInfo playerInfo = GameData.Instance.GetPlayerById(component.ParentId);
 
-                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
+                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
                                     writer.Write(playerInfo.PlayerId);
                                     writer.Write(Janitor.janitor.PlayerId);
                                     AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -380,8 +379,8 @@ namespace TheOtherRoles
                         }
                     }
                 },
-                () => { return Janitor.janitor != null && Janitor.janitor == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && PlayerControl.LocalPlayer.CanMove; },
                 () => { janitorCleanButton.Timer = janitorCleanButton.MaxTimer; },
                 Janitor.getButtonSprite(),
                 CustomButton.ButtonPositions.upperRowLeft,
@@ -404,10 +403,13 @@ namespace TheOtherRoles
                             targetId = Sheriff.currentTarget.PlayerId;
                         }
                         else {
-                            targetId = CachedPlayer.LocalPlayer.PlayerId;
+                            targetId = PlayerControl.LocalPlayer.PlayerId;
                         }
 
-                        MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+                        // Armored sheriff shot doesnt kill if backfired
+                        if (targetId == Sheriff.sheriff.PlayerId && Helpers.checkArmored(Sheriff.sheriff, true, true))
+                            return;
+                        MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
                         killWriter.Write(Sheriff.sheriff.Data.PlayerId);
                         killWriter.Write(targetId);
                         killWriter.Write(byte.MaxValue);
@@ -418,8 +420,8 @@ namespace TheOtherRoles
                     sheriffKillButton.Timer = sheriffKillButton.MaxTimer;
                     Sheriff.currentTarget = null;
                 },
-                () => { return Sheriff.sheriff != null && Sheriff.sheriff == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return Sheriff.currentTarget && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Sheriff.sheriff != null && Sheriff.sheriff == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return Sheriff.currentTarget && PlayerControl.LocalPlayer.CanMove; },
                 () => { sheriffKillButton.Timer = sheriffKillButton.MaxTimer;},
                 __instance.KillButton.graphic.sprite,
                 CustomButton.ButtonPositions.upperRowRight,
@@ -431,9 +433,9 @@ namespace TheOtherRoles
             deputyHandcuffButton = new CustomButton(
                 () => {
                     byte targetId = 0;
-                    targetId = Sheriff.sheriff == CachedPlayer.LocalPlayer.PlayerControl ? Sheriff.currentTarget.PlayerId : Deputy.currentTarget.PlayerId;  // If the deputy is now the sheriff, sheriffs target, else deputies target
+                    targetId = Sheriff.sheriff == PlayerControl.LocalPlayer ? Sheriff.currentTarget.PlayerId : Deputy.currentTarget.PlayerId;  // If the deputy is now the sheriff, sheriffs target, else deputies target
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.DeputyUsedHandcuffs, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.DeputyUsedHandcuffs, Hazel.SendOption.Reliable, -1);
                     writer.Write(targetId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.deputyUsedHandcuffs(targetId);
@@ -442,10 +444,10 @@ namespace TheOtherRoles
 
                     SoundEffectsManager.play("deputyHandcuff");
                 },
-                () => { return (Deputy.deputy != null && Deputy.deputy == CachedPlayer.LocalPlayer.PlayerControl || Sheriff.sheriff != null && Sheriff.sheriff == CachedPlayer.LocalPlayer.PlayerControl && Sheriff.sheriff == Sheriff.formerDeputy && Deputy.keepsHandcuffsOnPromotion) && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return (Deputy.deputy != null && Deputy.deputy == PlayerControl.LocalPlayer || Sheriff.sheriff != null && Sheriff.sheriff == PlayerControl.LocalPlayer && Sheriff.sheriff == Sheriff.formerDeputy && Deputy.keepsHandcuffsOnPromotion) && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (deputyButtonHandcuffsText != null) deputyButtonHandcuffsText.text = $"{Deputy.remainingHandcuffs}";
-                    return ((Deputy.deputy != null && Deputy.deputy == CachedPlayer.LocalPlayer.PlayerControl && Deputy.currentTarget || Sheriff.sheriff != null && Sheriff.sheriff == CachedPlayer.LocalPlayer.PlayerControl && Sheriff.sheriff == Sheriff.formerDeputy && Sheriff.currentTarget) && Deputy.remainingHandcuffs > 0 && CachedPlayer.LocalPlayer.PlayerControl.CanMove);
+                    return ((Deputy.deputy != null && Deputy.deputy == PlayerControl.LocalPlayer && Deputy.currentTarget || Sheriff.sheriff != null && Sheriff.sheriff == PlayerControl.LocalPlayer && Sheriff.sheriff == Sheriff.formerDeputy && Sheriff.currentTarget) && Deputy.remainingHandcuffs > 0 && PlayerControl.LocalPlayer.CanMove);
                 },
                 () => { deputyHandcuffButton.Timer = deputyHandcuffButton.MaxTimer; },
                 Deputy.getButtonSprite(),
@@ -463,13 +465,13 @@ namespace TheOtherRoles
             // Time Master Rewind Time
             timeMasterShieldButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.TimeMasterShield, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TimeMasterShield, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.timeMasterShield();
                     SoundEffectsManager.play("timemasterShield");
                 },
-                () => { return TimeMaster.timeMaster != null && TimeMaster.timeMaster == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return TimeMaster.timeMaster != null && TimeMaster.timeMaster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove; },
                 () => {
                     timeMasterShieldButton.Timer = timeMasterShieldButton.MaxTimer;
                     timeMasterShieldButton.isEffectActive = false;
@@ -493,7 +495,7 @@ namespace TheOtherRoles
                 () => {
                     medicShieldButton.Timer = 0f;
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, Medic.setShieldAfterMeeting ? (byte)CustomRPC.SetFutureShielded : (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, Medic.setShieldAfterMeeting ? (byte)CustomRPC.SetFutureShielded : (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1);
                     writer.Write(Medic.currentTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     if (Medic.setShieldAfterMeeting)
@@ -504,8 +506,8 @@ namespace TheOtherRoles
 
                     SoundEffectsManager.play("medicShield");
                     },
-                () => { return Medic.medic != null && Medic.medic == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return !Medic.usedShield && Medic.currentTarget && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Medic.medic != null && Medic.medic == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return !Medic.usedShield && Medic.currentTarget && PlayerControl.LocalPlayer.CanMove; },
                 () => {},
                 Medic.getButtonSprite(),
                 CustomButton.ButtonPositions.lowerRowRight,
@@ -517,14 +519,14 @@ namespace TheOtherRoles
             // Shifter shift
             shifterShiftButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetFutureShifted, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureShifted, Hazel.SendOption.Reliable, -1);
                     writer.Write(Shifter.currentTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.setFutureShifted(Shifter.currentTarget.PlayerId);
                     SoundEffectsManager.play("shifterShift");
                 },
-                () => { return Shifter.shifter != null && Shifter.shifter == CachedPlayer.LocalPlayer.PlayerControl && Shifter.futureShift == null && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return Shifter.currentTarget && Shifter.futureShift == null && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Shifter.shifter != null && Shifter.shifter == PlayerControl.LocalPlayer && Shifter.futureShift == null && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return Shifter.currentTarget && Shifter.futureShift == null && PlayerControl.LocalPlayer.CanMove; },
                 () => { },
                 Shifter.getButtonSprite(),
                 new Vector3(0, 1f, 0),
@@ -538,7 +540,7 @@ namespace TheOtherRoles
             morphlingButton = new CustomButton(
                 () => {
                     if (Morphling.sampledTarget != null) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.MorphlingMorph, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MorphlingMorph, Hazel.SendOption.Reliable, -1);
                         writer.Write(Morphling.sampledTarget.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.morphlingMorph(Morphling.sampledTarget.PlayerId);
@@ -555,8 +557,8 @@ namespace TheOtherRoles
                         setButtonTargetDisplay(Morphling.sampledTarget, morphlingButton);
                     }
                 },
-                () => { return Morphling.morphling != null && Morphling.morphling == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return (Morphling.currentTarget || Morphling.sampledTarget) && CachedPlayer.LocalPlayer.PlayerControl.CanMove && !Helpers.MushroomSabotageActive(); },
+                () => { return Morphling.morphling != null && Morphling.morphling == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return (Morphling.currentTarget || Morphling.sampledTarget) && PlayerControl.LocalPlayer.CanMove && !Helpers.MushroomSabotageActive(); },
                 () => { 
                     morphlingButton.Timer = morphlingButton.MaxTimer;
                     morphlingButton.Sprite = Morphling.getSampleSprite();
@@ -586,13 +588,13 @@ namespace TheOtherRoles
             // Camouflager camouflage
             camouflagerButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.CamouflagerCamouflage, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CamouflagerCamouflage, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.camouflagerCamouflage();
                     SoundEffectsManager.play("morphlingMorph");
                 },
-                () => { return Camouflager.camouflager != null && Camouflager.camouflager == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Camouflager.camouflager != null && Camouflager.camouflager == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove; },
                 () => {
                     camouflagerButton.Timer = camouflagerButton.MaxTimer;
                     camouflagerButton.isEffectActive = false;
@@ -616,7 +618,7 @@ namespace TheOtherRoles
                     Hacker.hackerTimer = Hacker.duration;
                     SoundEffectsManager.play("hackerHack");
                 },
-                () => { return Hacker.hacker != null && Hacker.hacker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => { return true; },
                 () => {
                     hackerButton.Timer = hackerButton.MaxTimer;
@@ -639,11 +641,11 @@ namespace TheOtherRoles
                        __instance.InitMap();
                        MapBehaviour.Instance.ShowCountOverlay(allowedToMove: true, showLivePlayerPosition: true, includeDeadBodies: true);
                    }
-                   if (Hacker.cantMove) CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                   CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement 
+                   if (Hacker.cantMove) PlayerControl.LocalPlayer.moveable = false;
+                   PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
                    Hacker.chargesAdminTable--;
                },
-               () => { return Hacker.hacker != null && Hacker.hacker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead;},
+               () => { return Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead;},
                () => {
                    if (hackerAdminTableChargesText != null) hackerAdminTableChargesText.text = $"{Hacker.chargesAdminTable} / {Hacker.toolsNumber}";
                    return Hacker.chargesAdminTable > 0; 
@@ -661,7 +663,7 @@ namespace TheOtherRoles
                0f,
                () => { 
                    hackerAdminTableButton.Timer = hackerAdminTableButton.MaxTimer;
-                   if (!hackerVitalsButton.isEffectActive) CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                   if (!hackerVitalsButton.isEffectActive) PlayerControl.LocalPlayer.moveable = true;
                    if (MapBehaviour.Instance && MapBehaviour.Instance.isActiveAndEnabled) MapBehaviour.Instance.Close();
                },
                GameOptionsManager.Instance.currentNormalGameOptions.MapId == 3,
@@ -697,12 +699,12 @@ namespace TheOtherRoles
                        Hacker.doorLog.Begin(null);
                    }
 
-                   if (Hacker.cantMove) CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                   CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement 
+                   if (Hacker.cantMove) PlayerControl.LocalPlayer.moveable = false;
+                   PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
 
                    Hacker.chargesVitals--;
                },
-               () => { return Hacker.hacker != null && Hacker.hacker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && GameOptionsManager.Instance.currentGameOptions.MapId != 0 && GameOptionsManager.Instance.currentNormalGameOptions.MapId != 3; },
+               () => { return Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && GameOptionsManager.Instance.currentGameOptions.MapId != 0 && GameOptionsManager.Instance.currentNormalGameOptions.MapId != 3; },
                () => {
                    if (hackerVitalsChargesText != null) hackerVitalsChargesText.text = $"{Hacker.chargesVitals} / {Hacker.toolsNumber}";
                    hackerVitalsButton.actionButton.graphic.sprite = Helpers.isMira() ? Hacker.getLogSprite() : Hacker.getVitalsSprite();
@@ -722,7 +724,7 @@ namespace TheOtherRoles
                0f,
                () => {
                    hackerVitalsButton.Timer = hackerVitalsButton.MaxTimer;
-                   if (!hackerAdminTableButton.isEffectActive) CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                   if (!hackerAdminTableButton.isEffectActive) PlayerControl.LocalPlayer.moveable = true;
                    if (Minigame.Instance) {
                        if (Helpers.isMira()) Hacker.doorLog.ForceClose();
                        else Hacker.vitals.ForceClose();
@@ -742,15 +744,16 @@ namespace TheOtherRoles
             // Tracker button
             trackerTrackPlayerButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.TrackerUsedTracker, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TrackerUsedTracker, Hazel.SendOption.Reliable, -1);
                     writer.Write(Tracker.currentTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.trackerUsedTracker(Tracker.currentTarget.PlayerId);
                     SoundEffectsManager.play("trackerTrackPlayer");
                 },
-                () => { return Tracker.tracker != null && Tracker.tracker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Tracker.currentTarget != null && !Tracker.usedTracker; },
-                () => { if(Tracker.resetTargetAfterMeeting) Tracker.resetTracked(); },
+                () => { return Tracker.tracker != null && Tracker.tracker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove && Tracker.currentTarget != null && !Tracker.usedTracker; },
+                () => { if (Tracker.resetTargetAfterMeeting) Tracker.resetTracked();
+                        else if (Tracker.currentTarget != null && Tracker.currentTarget.Data.IsDead) Tracker.currentTarget = null; },
                 Tracker.getButtonSprite(),
                 CustomButton.ButtonPositions.lowerRowRight,
                 __instance,
@@ -760,8 +763,8 @@ namespace TheOtherRoles
             trackerTrackCorpsesButton = new CustomButton(
                 () => { Tracker.corpsesTrackingTimer = Tracker.corpsesTrackingDuration;
                             SoundEffectsManager.play("trackerTrackCorpses"); },
-                () => { return Tracker.tracker != null && Tracker.tracker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && Tracker.canTrackCorpses; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Tracker.tracker != null && Tracker.tracker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && Tracker.canTrackCorpses; },
+                () => { return PlayerControl.LocalPlayer.CanMove; },
                 () => {
                     trackerTrackCorpsesButton.Timer = trackerTrackCorpsesButton.MaxTimer;
                     trackerTrackCorpsesButton.isEffectActive = false;
@@ -783,7 +786,7 @@ namespace TheOtherRoles
                     MurderAttemptResult murder = Helpers.checkMuderAttempt(Vampire.vampire, Vampire.currentTarget);
                     if (murder == MurderAttemptResult.PerformKill) {
                         if (Vampire.targetNearGarlic) {
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
                             writer.Write(Vampire.vampire.PlayerId);
                             writer.Write(Vampire.currentTarget.PlayerId);
                             writer.Write(Byte.MaxValue);
@@ -795,7 +798,7 @@ namespace TheOtherRoles
                         } else {
                             Vampire.bitten = Vampire.currentTarget;
                             // Notify players about bitten
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
                             writer.Write(Vampire.bitten.PlayerId);
                             writer.Write((byte)0);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -807,8 +810,8 @@ namespace TheOtherRoles
                                     byte timer = (byte)vampireKillButton.Timer;
                                     if (timer != lastTimer) {
                                         lastTimer = timer;
-                                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                                         writer.Write((byte)RPCProcedure.GhostInfoTypes.VampireTimer);
                                         writer.Write(timer);
                                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -818,7 +821,7 @@ namespace TheOtherRoles
                                     // Perform kill if possible and reset bitten (regardless whether the kill was successful or not)
                                     var res = Helpers.checkMurderAttemptAndKill(Vampire.vampire, Vampire.bitten, showAnimation: false);
                                     if (res == MurderAttemptResult.PerformKill) {
-                                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
+                                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
                                         writer.Write(byte.MaxValue);
                                         writer.Write(byte.MaxValue);
                                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -837,7 +840,7 @@ namespace TheOtherRoles
                         vampireKillButton.HasEffect = false;
                     }
                 },
-                () => { return Vampire.vampire != null && Vampire.vampire == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Vampire.vampire != null && Vampire.vampire == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (Vampire.targetNearGarlic && Vampire.canKillNearGarlics) {
                         vampireKillButton.actionButton.graphic.sprite = __instance.KillButton.graphic.sprite;
@@ -847,7 +850,7 @@ namespace TheOtherRoles
                         vampireKillButton.actionButton.graphic.sprite = Vampire.getButtonSprite();
                         vampireKillButton.showButtonText = false;
                     }
-                    return Vampire.currentTarget != null && CachedPlayer.LocalPlayer.PlayerControl.CanMove && (!Vampire.targetNearGarlic || Vampire.canKillNearGarlics);
+                    return Vampire.currentTarget != null && PlayerControl.LocalPlayer.CanMove && (!Vampire.targetNearGarlic || Vampire.canKillNearGarlics);
                 },
                 () => {
                     vampireKillButton.Timer = vampireKillButton.MaxTimer;
@@ -868,19 +871,19 @@ namespace TheOtherRoles
             garlicButton = new CustomButton(
                 () => {
                     Vampire.localPlacedGarlic = true;
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0*sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1*sizeof(float), sizeof(float));
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceGarlic, Hazel.SendOption.Reliable);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceGarlic, Hazel.SendOption.Reliable);
                     writer.WriteBytesAndSize(buff);
                     writer.EndMessage();
                     RPCProcedure.placeGarlic(buff);
                     SoundEffectsManager.play("garlic");
                 },
-                () => { return !Vampire.localPlacedGarlic && !CachedPlayer.LocalPlayer.Data.IsDead && Vampire.garlicsActive && !HideNSeek.isHideNSeekGM && !PropHunt.isPropHuntGM; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && !Vampire.localPlacedGarlic; },
+                () => { return !Vampire.localPlacedGarlic && !PlayerControl.LocalPlayer.Data.IsDead && Vampire.garlicsActive && !HideNSeek.isHideNSeekGM && !PropHunt.isPropHuntGM; },
+                () => { return PlayerControl.LocalPlayer.CanMove && !Vampire.localPlacedGarlic; },
                 () => { },
                 Vampire.getGarlicButtonSprite(),
                 new Vector3(0, -0.06f, 0),
@@ -893,19 +896,19 @@ namespace TheOtherRoles
                 () => {
                     portalmakerPlacePortalButton.Timer = portalmakerPlacePortalButton.MaxTimer;
 
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlacePortal, Hazel.SendOption.Reliable);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlacePortal, Hazel.SendOption.Reliable);
                     writer.WriteBytesAndSize(buff);
                     writer.EndMessage();
                     RPCProcedure.placePortal(buff);
                     SoundEffectsManager.play("tricksterPlaceBox");
                 },
-                () => { return Portalmaker.portalmaker != null && Portalmaker.portalmaker == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && Portal.secondPortal == null; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Portal.secondPortal == null; },
+                () => { return Portalmaker.portalmaker != null && Portalmaker.portalmaker == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && Portal.secondPortal == null; },
+                () => { return PlayerControl.LocalPlayer.CanMove && Portal.secondPortal == null; },
                 () => { portalmakerPlacePortalButton.Timer = portalmakerPlacePortalButton.MaxTimer; },
                 Portalmaker.getPlacePortalButtonSprite(),
                 CustomButton.ButtonPositions.lowerRowRight,
@@ -916,47 +919,47 @@ namespace TheOtherRoles
             usePortalButton = new CustomButton(
                 () => {
                     bool didTeleport = false;
-                    Vector3 exit = Portal.findExit(CachedPlayer.LocalPlayer.transform.position);
-                    Vector3 entry = Portal.findEntry(CachedPlayer.LocalPlayer.transform.position);
+                    Vector3 exit = Portal.findExit(PlayerControl.LocalPlayer.transform.position);
+                    Vector3 entry = Portal.findEntry(PlayerControl.LocalPlayer.transform.position);
 
-                    bool portalMakerSoloTeleport = !Portal.locationNearEntry(CachedPlayer.LocalPlayer.transform.position);
+                    bool portalMakerSoloTeleport = !Portal.locationNearEntry(PlayerControl.LocalPlayer.transform.position);
                     if (portalMakerSoloTeleport) {
                         exit = Portal.firstPortal.portalGameObject.transform.position;
-                        entry = CachedPlayer.LocalPlayer.transform.position;
+                        entry = PlayerControl.LocalPlayer.transform.position;
                     }
 
-                    CachedPlayer.LocalPlayer.NetTransform.RpcSnapTo(entry);
+                    PlayerControl.LocalPlayer.NetTransform.RpcSnapTo(entry);
 
-                    if (!CachedPlayer.LocalPlayer.Data.IsDead) {  // Ghosts can portal too, but non-blocking and only with a local animation
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UsePortal, Hazel.SendOption.Reliable, -1);
-                        writer.Write((byte)CachedPlayer.LocalPlayer.PlayerId);
+                    if (!PlayerControl.LocalPlayer.Data.IsDead) {  // Ghosts can portal too, but non-blocking and only with a local animation
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UsePortal, Hazel.SendOption.Reliable, -1);
+                        writer.Write((byte)PlayerControl.LocalPlayer.PlayerId);
                         writer.Write(portalMakerSoloTeleport ? (byte)1 : (byte)0);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                     }
-                    RPCProcedure.usePortal(CachedPlayer.LocalPlayer.PlayerId, portalMakerSoloTeleport ? (byte)1 : (byte)0);
+                    RPCProcedure.usePortal(PlayerControl.LocalPlayer.PlayerId, portalMakerSoloTeleport ? (byte)1 : (byte)0);
                     usePortalButton.Timer = usePortalButton.MaxTimer;
                     portalmakerMoveToPortalButton.Timer = usePortalButton.MaxTimer;
                     SoundEffectsManager.play("portalUse");
                     FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(Portal.teleportDuration, new Action<float>((p) => { // Delayed action
-                        CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                        CachedPlayer.LocalPlayer.NetTransform.Halt();
+                        PlayerControl.LocalPlayer.moveable = false;
+                        PlayerControl.LocalPlayer.NetTransform.Halt();
                         if (p >= 0.5f && p <= 0.53f && !didTeleport && !MeetingHud.Instance) {
                             if (SubmergedCompatibility.IsSubmerged) {
                                 SubmergedCompatibility.ChangeFloor(exit.y > -7);
                             }
-                            CachedPlayer.LocalPlayer.NetTransform.RpcSnapTo(exit);
+                            PlayerControl.LocalPlayer.NetTransform.RpcSnapTo(exit);
                             didTeleport = true;
                         }
                         if (p == 1f) {
-                            CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                            PlayerControl.LocalPlayer.moveable = true;
                         }
                     })));
                     },
                 () => {
-                    if (CachedPlayer.LocalPlayer.PlayerControl == Portalmaker.portalmaker && Portal.bothPlacedAndEnabled)
-                        portalmakerButtonText1.text = Portal.locationNearEntry(CachedPlayer.LocalPlayer.transform.position) || !Portalmaker.canPortalFromAnywhere ? "" : "1. " + Portal.firstPortal.room;
+                    if (PlayerControl.LocalPlayer == Portalmaker.portalmaker && Portal.bothPlacedAndEnabled)
+                        portalmakerButtonText1.text = Portal.locationNearEntry(PlayerControl.LocalPlayer.transform.position) || !Portalmaker.canPortalFromAnywhere ? "" : "1. " + Portal.firstPortal.room;
                     return Portal.bothPlacedAndEnabled; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && (Portal.locationNearEntry(CachedPlayer.LocalPlayer.transform.position) || Portalmaker.canPortalFromAnywhere && CachedPlayer.LocalPlayer.PlayerControl == Portalmaker.portalmaker) && !Portal.isTeleporting; },
+                () => { return PlayerControl.LocalPlayer.CanMove && (Portal.locationNearEntry(PlayerControl.LocalPlayer.transform.position) || Portalmaker.canPortalFromAnywhere && PlayerControl.LocalPlayer == Portalmaker.portalmaker) && !Portal.isTeleporting; },
                 () => { usePortalButton.Timer = usePortalButton.MaxTimer; },
                 Portalmaker.getUsePortalButtonSprite(),
                 new Vector3(0.9f, -0.06f, 0),
@@ -970,33 +973,33 @@ namespace TheOtherRoles
                     bool didTeleport = false;
                     Vector3 exit = Portal.secondPortal.portalGameObject.transform.position;
 
-                    if (!CachedPlayer.LocalPlayer.Data.IsDead) {  // Ghosts can portal too, but non-blocking and only with a local animation
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UsePortal, Hazel.SendOption.Reliable, -1);
-                        writer.Write((byte)CachedPlayer.LocalPlayer.PlayerId);
+                    if (!PlayerControl.LocalPlayer.Data.IsDead) {  // Ghosts can portal too, but non-blocking and only with a local animation
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UsePortal, Hazel.SendOption.Reliable, -1);
+                        writer.Write((byte)PlayerControl.LocalPlayer.PlayerId);
                         writer.Write((byte)2);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                     }
-                    RPCProcedure.usePortal(CachedPlayer.LocalPlayer.PlayerId, 2);
+                    RPCProcedure.usePortal(PlayerControl.LocalPlayer.PlayerId, 2);
                     usePortalButton.Timer = usePortalButton.MaxTimer;
                     portalmakerMoveToPortalButton.Timer = usePortalButton.MaxTimer;
                     SoundEffectsManager.play("portalUse");
                     FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(Portal.teleportDuration, new Action<float>((p) => { // Delayed action
-                        CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                        CachedPlayer.LocalPlayer.NetTransform.Halt();
+                        PlayerControl.LocalPlayer.moveable = false;
+                        PlayerControl.LocalPlayer.NetTransform.Halt();
                         if (p >= 0.5f && p <= 0.53f && !didTeleport && !MeetingHud.Instance) {
                             if (SubmergedCompatibility.IsSubmerged) {
                                 SubmergedCompatibility.ChangeFloor(exit.y > -7);
                             }
-                            CachedPlayer.LocalPlayer.NetTransform.RpcSnapTo(exit);
+                            PlayerControl.LocalPlayer.NetTransform.RpcSnapTo(exit);
                             didTeleport = true;
                         }
                         if (p == 1f) {
-                            CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                            PlayerControl.LocalPlayer.moveable = true;
                         }
                     })));
                 },
-                () => { return Portalmaker.canPortalFromAnywhere && Portal.bothPlacedAndEnabled && CachedPlayer.LocalPlayer.PlayerControl == Portalmaker.portalmaker; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && !Portal.locationNearEntry(CachedPlayer.LocalPlayer.transform.position) && !Portal.isTeleporting; },
+                () => { return Portalmaker.canPortalFromAnywhere && Portal.bothPlacedAndEnabled && PlayerControl.LocalPlayer == Portalmaker.portalmaker; },
+                () => { return PlayerControl.LocalPlayer.CanMove && !Portal.locationNearEntry(PlayerControl.LocalPlayer.transform.position) && !Portal.isTeleporting; },
                 () => { portalmakerMoveToPortalButton.Timer = usePortalButton.MaxTimer; },
                 Portalmaker.getUsePortalButtonSprite(),
                 new Vector3(0.9f, 1f, 0),
@@ -1023,14 +1026,14 @@ namespace TheOtherRoles
             // Jackal Sidekick Button
             jackalSidekickButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.JackalCreatesSidekick, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalCreatesSidekick, Hazel.SendOption.Reliable, -1);
                     writer.Write(Jackal.currentTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.jackalCreatesSidekick(Jackal.currentTarget.PlayerId);
                     SoundEffectsManager.play("jackalSidekick");
                 },
-                () => { return Jackal.canCreateSidekick && Jackal.jackal != null && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return Jackal.canCreateSidekick && Jackal.currentTarget != null && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Jackal.canCreateSidekick && Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return Jackal.canCreateSidekick && Jackal.currentTarget != null && PlayerControl.LocalPlayer.CanMove; },
                 () => { jackalSidekickButton.Timer = jackalSidekickButton.MaxTimer;},
                 Jackal.getSidekickButtonSprite(),
                 CustomButton.ButtonPositions.lowerRowCenter,
@@ -1046,8 +1049,8 @@ namespace TheOtherRoles
                     jackalKillButton.Timer = jackalKillButton.MaxTimer; 
                     Jackal.currentTarget = null;
                 },
-                () => { return Jackal.jackal != null && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return Jackal.currentTarget && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return Jackal.currentTarget && PlayerControl.LocalPlayer.CanMove; },
                 () => { jackalKillButton.Timer = jackalKillButton.MaxTimer;},
                 __instance.KillButton.graphic.sprite,
                 CustomButton.ButtonPositions.upperRowRight,
@@ -1062,8 +1065,8 @@ namespace TheOtherRoles
                     sidekickKillButton.Timer = sidekickKillButton.MaxTimer; 
                     Sidekick.currentTarget = null;
                 },
-                () => { return Sidekick.canKill && Sidekick.sidekick != null && Sidekick.sidekick == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return Sidekick.currentTarget && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Sidekick.canKill && Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return Sidekick.currentTarget && PlayerControl.LocalPlayer.CanMove; },
                 () => { sidekickKillButton.Timer = sidekickKillButton.MaxTimer;},
                 __instance.KillButton.graphic.sprite,
                 CustomButton.ButtonPositions.upperRowRight,
@@ -1074,10 +1077,11 @@ namespace TheOtherRoles
             jackalAndSidekickSabotageLightsButton = new CustomButton(
                 () => {
                     ShipStatus.Instance.RpcUpdateSystem(SystemTypes.Sabotage, (byte)SystemTypes.Electrical);
+                    SoundEffectsManager.play("ligherLight");
                 },
                 () => {
-                    return (Jackal.jackal != null && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl && Jackal.canSabotageLights || 
-                            Sidekick.sidekick != null && Sidekick.sidekick == CachedPlayer.LocalPlayer.PlayerControl && Sidekick.canSabotageLights) && !CachedPlayer.LocalPlayer.Data.IsDead;
+                    return (Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && Jackal.canSabotageLights || 
+                            Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer && Sidekick.canSabotageLights) && !PlayerControl.LocalPlayer.Data.IsDead;
                 },
                 () => {
                     if (Helpers.sabotageTimer() > jackalAndSidekickSabotageLightsButton.Timer || Helpers.sabotageActive())
@@ -1098,14 +1102,14 @@ namespace TheOtherRoles
                     eraserButton.MaxTimer += 10;
                     eraserButton.Timer = eraserButton.MaxTimer;
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetFutureErased, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureErased, Hazel.SendOption.Reliable, -1);
                     writer.Write(Eraser.currentTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.setFutureErased(Eraser.currentTarget.PlayerId);
                     SoundEffectsManager.play("eraserErase");
                 },
-                () => { return Eraser.eraser != null && Eraser.eraser == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Eraser.currentTarget != null; },
+                () => { return Eraser.eraser != null && Eraser.eraser == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove && Eraser.currentTarget != null; },
                 () => { eraserButton.Timer = eraserButton.MaxTimer;},
                 Eraser.getButtonSprite(),
                 CustomButton.ButtonPositions.upperRowLeft,
@@ -1117,19 +1121,19 @@ namespace TheOtherRoles
                 () => {
                     placeJackInTheBoxButton.Timer = placeJackInTheBoxButton.MaxTimer;
 
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0*sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1*sizeof(float), sizeof(float));
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceJackInTheBox, Hazel.SendOption.Reliable);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceJackInTheBox, Hazel.SendOption.Reliable);
                     writer.WriteBytesAndSize(buff);
                     writer.EndMessage();
                     RPCProcedure.placeJackInTheBox(buff);
                     SoundEffectsManager.play("tricksterPlaceBox");
                 },
-                () => { return Trickster.trickster != null && Trickster.trickster == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && !JackInTheBox.hasJackInTheBoxLimitReached(); },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && !JackInTheBox.hasJackInTheBoxLimitReached(); },
+                () => { return Trickster.trickster != null && Trickster.trickster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && !JackInTheBox.hasJackInTheBoxLimitReached(); },
+                () => { return PlayerControl.LocalPlayer.CanMove && !JackInTheBox.hasJackInTheBoxLimitReached(); },
                 () => { placeJackInTheBoxButton.Timer = placeJackInTheBoxButton.MaxTimer;},
                 Trickster.getPlaceBoxButtonSprite(),
                 CustomButton.ButtonPositions.upperRowLeft,
@@ -1139,14 +1143,14 @@ namespace TheOtherRoles
             
             lightsOutButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LightsOut, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LightsOut, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.lightsOut();
                     SoundEffectsManager.play("lighterLight");
                 },
-                () => { return Trickster.trickster != null && Trickster.trickster == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead
+                () => { return Trickster.trickster != null && Trickster.trickster == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead
                                                            && JackInTheBox.hasJackInTheBoxLimitReached() && JackInTheBox.boxesConvertedToVents; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && JackInTheBox.hasJackInTheBoxLimitReached() && JackInTheBox.boxesConvertedToVents; },
+                () => { return PlayerControl.LocalPlayer.CanMove && JackInTheBox.hasJackInTheBoxLimitReached() && JackInTheBox.boxesConvertedToVents; },
                 () => { 
                     lightsOutButton.Timer = lightsOutButton.MaxTimer;
                     lightsOutButton.isEffectActive = false;
@@ -1167,19 +1171,19 @@ namespace TheOtherRoles
             // Cleaner Clean
             cleanerCleanButton = new CustomButton(
                 () => {
-                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance, Constants.PlayersOnlyMask)) {
+                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.PlayersOnlyMask)) {
                         if (collider2D.tag == "DeadBody")
                         {
                             DeadBody component = collider2D.GetComponent<DeadBody>();
                             if (component && !component.Reported)
                             {
-                                Vector2 truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition();
+                                Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition();
                                 Vector2 truePosition2 = component.TruePosition;
-                                if (Vector2.Distance(truePosition2, truePosition) <= CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance && CachedPlayer.LocalPlayer.PlayerControl.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false))
+                                if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false))
                                 {
                                     NetworkedPlayerInfo playerInfo = GameData.Instance.GetPlayerById(component.ParentId);
                                     
-                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
+                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
                                     writer.Write(playerInfo.PlayerId);
                                     writer.Write(Cleaner.cleaner.PlayerId);
                                     AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1193,8 +1197,8 @@ namespace TheOtherRoles
                         }
                     }
                 },
-                () => { return Cleaner.cleaner != null && Cleaner.cleaner == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Cleaner.cleaner != null && Cleaner.cleaner == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && PlayerControl.LocalPlayer.CanMove; },
                 () => { cleanerCleanButton.Timer = cleanerCleanButton.MaxTimer; },
                 Cleaner.getButtonSprite(),
                 CustomButton.ButtonPositions.upperRowLeft,
@@ -1213,8 +1217,8 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("warlockCurse");
 
                         // Ghost Info
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer.Write((byte)RPCProcedure.GhostInfoTypes.WarlockTarget);
                         writer.Write(Warlock.curseVictim.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1225,12 +1229,12 @@ namespace TheOtherRoles
 
                         // If blanked or killed
                         if(Warlock.rootTime > 0) {
-                            AntiTeleport.position = CachedPlayer.LocalPlayer.transform.position;
-                            CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                            CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement so the warlock is not just running straight into the next object
+                            AntiTeleport.position = PlayerControl.LocalPlayer.transform.position;
+                            PlayerControl.LocalPlayer.moveable = false;
+                            PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement so the warlock is not just running straight into the next object
                             FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(Warlock.rootTime, new Action<float>((p) => { // Delayed action
                                 if (p == 1f) {
-                                    CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                                    PlayerControl.LocalPlayer.moveable = true;
                                 }
                             })));
                         }
@@ -1240,16 +1244,16 @@ namespace TheOtherRoles
                         warlockCurseButton.Sprite = Warlock.getCurseButtonSprite();
                         Warlock.warlock.killTimer = warlockCurseButton.Timer = warlockCurseButton.MaxTimer;
 
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer.Write((byte)RPCProcedure.GhostInfoTypes.WarlockTarget);
                         writer.Write(Byte.MaxValue); // This will set it to null!
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
 
                     }
                 },
-                () => { return Warlock.warlock != null && Warlock.warlock == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return ((Warlock.curseVictim == null && Warlock.currentTarget != null) || (Warlock.curseVictim != null && Warlock.curseVictimTarget != null)) && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Warlock.warlock != null && Warlock.warlock == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return ((Warlock.curseVictim == null && Warlock.currentTarget != null) || (Warlock.curseVictim != null && Warlock.curseVictimTarget != null)) && PlayerControl.LocalPlayer.CanMove; },
                 () => { 
                     warlockCurseButton.Timer = warlockCurseButton.MaxTimer;
                     warlockCurseButton.Sprite = Warlock.getCurseButtonSprite();
@@ -1266,19 +1270,19 @@ namespace TheOtherRoles
             securityGuardButton = new CustomButton(
                 () => {
                     if (SecurityGuard.ventTarget != null) { // Seal vent
-                        MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SealVent, Hazel.SendOption.Reliable);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SealVent, Hazel.SendOption.Reliable);
                         writer.WritePacked(SecurityGuard.ventTarget.Id);
                         writer.EndMessage();
                         RPCProcedure.sealVent(SecurityGuard.ventTarget.Id);
                         SecurityGuard.ventTarget = null;
                         
                     } else if (!Helpers.isMira() && !Helpers.isFungle() && !SubmergedCompatibility.IsSubmerged) { // Place camera if there's no vent and it's not MiraHQ or Submerged
-                        var pos = CachedPlayer.LocalPlayer.transform.position;
+                        var pos = PlayerControl.LocalPlayer.transform.position;
                         byte[] buff = new byte[sizeof(float) * 2];
                         Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0*sizeof(float), sizeof(float));
                         Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1*sizeof(float), sizeof(float));
 
-                        MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceCamera, Hazel.SendOption.Reliable);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceCamera, Hazel.SendOption.Reliable);
                         writer.WriteBytesAndSize(buff);
                         writer.EndMessage();
                         RPCProcedure.placeCamera(buff); 
@@ -1286,14 +1290,14 @@ namespace TheOtherRoles
                     SoundEffectsManager.play("securityGuardPlaceCam");  // Same sound used for both types (cam or vent)!
                     securityGuardButton.Timer = securityGuardButton.MaxTimer;
                 },
-                () => { return SecurityGuard.securityGuard != null && SecurityGuard.securityGuard == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && SecurityGuard.remainingScrews >= Mathf.Min(SecurityGuard.ventPrice, SecurityGuard.camPrice); },
+                () => { return SecurityGuard.securityGuard != null && SecurityGuard.securityGuard == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && SecurityGuard.remainingScrews >= Mathf.Min(SecurityGuard.ventPrice, SecurityGuard.camPrice); },
                 () => {
                     securityGuardButton.actionButton.graphic.sprite = (SecurityGuard.ventTarget == null && !Helpers.isMira() && !Helpers.isFungle() && !SubmergedCompatibility.IsSubmerged) ? SecurityGuard.getPlaceCameraButtonSprite() : SecurityGuard.getCloseVentButtonSprite(); 
                     if (securityGuardButtonScrewsText != null) securityGuardButtonScrewsText.text = $"{SecurityGuard.remainingScrews}/{SecurityGuard.totalScrews}";
 
                     if (SecurityGuard.ventTarget != null)
-                        return SecurityGuard.remainingScrews >= SecurityGuard.ventPrice && CachedPlayer.LocalPlayer.PlayerControl.CanMove;
-                    return !Helpers.isMira() && !Helpers.isFungle() && !SubmergedCompatibility.IsSubmerged && SecurityGuard.remainingScrews >= SecurityGuard.camPrice && CachedPlayer.LocalPlayer.PlayerControl.CanMove;
+                        return SecurityGuard.remainingScrews >= SecurityGuard.ventPrice && PlayerControl.LocalPlayer.CanMove;
+                    return !Helpers.isMira() && !Helpers.isFungle() && !SubmergedCompatibility.IsSubmerged && SecurityGuard.remainingScrews >= SecurityGuard.camPrice && PlayerControl.LocalPlayer.CanMove;
                 },
                 () => { securityGuardButton.Timer = securityGuardButton.MaxTimer; },
                 SecurityGuard.getPlaceCameraButtonSprite(),
@@ -1335,18 +1339,18 @@ namespace TheOtherRoles
                     }
                     SecurityGuard.charges--;
 
-                    if (SecurityGuard.cantMove) CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
-                    CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement 
+                    if (SecurityGuard.cantMove) PlayerControl.LocalPlayer.moveable = false;
+                    PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
                 },
                 () => {
-                    return SecurityGuard.securityGuard != null && SecurityGuard.securityGuard == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && SecurityGuard.remainingScrews < Mathf.Min(SecurityGuard.ventPrice, SecurityGuard.camPrice)
+                    return SecurityGuard.securityGuard != null && SecurityGuard.securityGuard == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && SecurityGuard.remainingScrews < Mathf.Min(SecurityGuard.ventPrice, SecurityGuard.camPrice)
                                && !SubmergedCompatibility.IsSubmerged;
                 },
                 () => {
                     if (securityGuardChargesText != null) securityGuardChargesText.text = $"{SecurityGuard.charges} / {SecurityGuard.maxCharges}";
                     securityGuardCamButton.actionButton.graphic.sprite = Helpers.isMira() ? SecurityGuard.getLogSprite() : SecurityGuard.getCamSprite();
                     securityGuardCamButton.actionButton.OverrideText(Helpers.isMira() ? "DOORLOG" : "SECURITY");
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove && SecurityGuard.charges > 0;
+                    return PlayerControl.LocalPlayer.CanMove && SecurityGuard.charges > 0;
                 },
                 () => {
                     securityGuardCamButton.Timer = securityGuardCamButton.MaxTimer;
@@ -1364,7 +1368,7 @@ namespace TheOtherRoles
                     if (Minigame.Instance) {
                         SecurityGuard.minigame.ForceClose();
                     }
-                    CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                    PlayerControl.LocalPlayer.moveable = true;
                 },
                 false,
                 Helpers.isMira() ? "DOORLOG" : "SECURITY"
@@ -1382,7 +1386,7 @@ namespace TheOtherRoles
                 () => {
                     bool dousedEveryoneAlive = Arsonist.dousedEveryoneAlive();
                     if (dousedEveryoneAlive) {
-                        MessageWriter winWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ArsonistWin, Hazel.SendOption.Reliable, -1);
+                        MessageWriter winWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ArsonistWin, Hazel.SendOption.Reliable, -1);
                         AmongUsClient.Instance.FinishRpcImmediately(winWriter);
                         RPCProcedure.arsonistWin();
                         arsonistButton.HasEffect = false;
@@ -1392,7 +1396,7 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("arsonistDouse");
                     }
                 },
-                () => { return Arsonist.arsonist != null && Arsonist.arsonist == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Arsonist.arsonist != null && Arsonist.arsonist == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     bool dousedEveryoneAlive = Arsonist.dousedEveryoneAlive();
                     if (dousedEveryoneAlive) arsonistButton.actionButton.graphic.sprite = Arsonist.getIgniteSprite();
@@ -1403,7 +1407,7 @@ namespace TheOtherRoles
                         arsonistButton.isEffectActive = false;
                     }
 
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove && (dousedEveryoneAlive || Arsonist.currentTarget != null);
+                    return PlayerControl.LocalPlayer.CanMove && (dousedEveryoneAlive || Arsonist.currentTarget != null);
                 },
                 () => {
                     arsonistButton.Timer = arsonistButton.MaxTimer;
@@ -1428,8 +1432,8 @@ namespace TheOtherRoles
                     }
 
                     // Ghost Info
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     writer.Write((byte)RPCProcedure.GhostInfoTypes.ArsonistDouse);
                     writer.Write(Arsonist.douseTarget.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1441,16 +1445,16 @@ namespace TheOtherRoles
             // Vulture Eat
             vultureEatButton = new CustomButton(
                 () => {
-                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance, Constants.PlayersOnlyMask)) {
+                    foreach (Collider2D collider2D in Physics2D.OverlapCircleAll(PlayerControl.LocalPlayer.GetTruePosition(), PlayerControl.LocalPlayer.MaxReportDistance, Constants.PlayersOnlyMask)) {
                         if (collider2D.tag == "DeadBody") {
                             DeadBody component = collider2D.GetComponent<DeadBody>();
                             if (component && !component.Reported) {
-                                Vector2 truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition();
+                                Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition();
                                 Vector2 truePosition2 = component.TruePosition;
-                                if (Vector2.Distance(truePosition2, truePosition) <= CachedPlayer.LocalPlayer.PlayerControl.MaxReportDistance && CachedPlayer.LocalPlayer.PlayerControl.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false)) {
+                                if (Vector2.Distance(truePosition2, truePosition) <= PlayerControl.LocalPlayer.MaxReportDistance && PlayerControl.LocalPlayer.CanMove && !PhysicsHelpers.AnythingBetween(truePosition, truePosition2, Constants.ShipAndObjectsMask, false)) {
                                     NetworkedPlayerInfo playerInfo = GameData.Instance.GetPlayerById(component.ParentId);
 
-                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
+                                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CleanBody, Hazel.SendOption.Reliable, -1);
                                     writer.Write(playerInfo.PlayerId);
                                     writer.Write(Vulture.vulture.PlayerId);
                                     AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1464,8 +1468,8 @@ namespace TheOtherRoles
                         }
                     }
                 },
-                () => { return Vulture.vulture != null && Vulture.vulture == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Vulture.vulture != null && Vulture.vulture == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return __instance.ReportButton.graphic.color == Palette.EnabledColor && PlayerControl.LocalPlayer.CanMove; },
                 () => { vultureEatButton.Timer = vultureEatButton.MaxTimer; },
                 Vulture.getButtonSprite(),
                 CustomButton.ButtonPositions.lowerRowCenter,
@@ -1482,14 +1486,14 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("mediumAsk");
                     }
                 },
-                () => { return Medium.medium != null && Medium.medium == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Medium.medium != null && Medium.medium == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (mediumButton.isEffectActive && Medium.target != Medium.soulTarget) {
                         Medium.soulTarget = null;
                         mediumButton.Timer = 0f;
                         mediumButton.isEffectActive = false;
                     }
-                    return Medium.target != null && CachedPlayer.LocalPlayer.PlayerControl.CanMove;
+                    return Medium.target != null && PlayerControl.LocalPlayer.CanMove;
                 },
                 () => {
                     mediumButton.Timer = mediumButton.MaxTimer;
@@ -1505,11 +1509,11 @@ namespace TheOtherRoles
                 () => {
                     mediumButton.Timer = mediumButton.MaxTimer;
                     if (Medium.target == null || Medium.target.player == null) return;
-                    string msg = Medium.getInfo(Medium.target.player, Medium.target.killerIfExisting);
-                    FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(CachedPlayer.LocalPlayer.PlayerControl, msg);
+                    string msg = Medium.getInfo(Medium.target.player, Medium.target.killerIfExisting, Medium.target.deathReason);
+                    FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(PlayerControl.LocalPlayer, msg);
 
                     // Ghost Info
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
                     writer.Write(Medium.target.player.PlayerId);
                     writer.Write((byte)RPCProcedure.GhostInfoTypes.MediumInfo);
                     writer.Write(msg);
@@ -1529,7 +1533,7 @@ namespace TheOtherRoles
 
                         }
                         foreach (SpriteRenderer rend in Medium.souls) {
-                            float distance = Vector2.Distance(rend.transform.position, CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition());
+                            float distance = Vector2.Distance(rend.transform.position, PlayerControl.LocalPlayer.GetTruePosition());
                             if (distance < closestDistance) {
                                 closestDistance = distance;
                                 target = rend;
@@ -1555,7 +1559,7 @@ namespace TheOtherRoles
             pursuerButton = new CustomButton(
                 () => {
                     if (Pursuer.target != null) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetBlanked, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetBlanked, Hazel.SendOption.Reliable, -1);
                         writer.Write(Pursuer.target.PlayerId);
                         writer.Write(Byte.MaxValue);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1569,11 +1573,11 @@ namespace TheOtherRoles
                     }
 
                 },
-                () => { return Pursuer.pursuer != null && Pursuer.pursuer == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && Pursuer.blanks < Pursuer.blanksNumber; },
+                () => { return Pursuer.pursuer != null && Pursuer.pursuer == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && Pursuer.blanks < Pursuer.blanksNumber; },
                 () => {
                     if (pursuerButtonBlanksText != null) pursuerButtonBlanksText.text = $"{Pursuer.blanksNumber - Pursuer.blanks}";
 
-                    return Pursuer.blanksNumber > Pursuer.blanks && CachedPlayer.LocalPlayer.PlayerControl.CanMove && Pursuer.target != null;
+                    return Pursuer.blanksNumber > Pursuer.blanks && PlayerControl.LocalPlayer.CanMove && Pursuer.target != null;
                 },
                 () => { pursuerButton.Timer = pursuerButton.MaxTimer; },
                 Pursuer.getTargetSprite(),
@@ -1598,14 +1602,14 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("witchSpell");
                     }
                 },
-                () => { return Witch.witch != null && Witch.witch == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Witch.witch != null && Witch.witch == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (witchSpellButton.isEffectActive && Witch.spellCastingTarget != Witch.currentTarget) {
                         Witch.spellCastingTarget = null;
                         witchSpellButton.Timer = 0f;
                         witchSpellButton.isEffectActive = false;
                     }
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Witch.currentTarget != null;
+                    return PlayerControl.LocalPlayer.CanMove && Witch.currentTarget != null;
                 },
                 () => {
                     witchSpellButton.Timer = witchSpellButton.MaxTimer;
@@ -1622,7 +1626,7 @@ namespace TheOtherRoles
                     if (Witch.spellCastingTarget == null) return;
                     MurderAttemptResult attempt = Helpers.checkMuderAttempt(Witch.witch, Witch.spellCastingTarget);
                     if (attempt == MurderAttemptResult.PerformKill) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetFutureSpelled, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFutureSpelled, Hazel.SendOption.Reliable, -1);
                         writer.Write(Witch.currentTarget.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.setFutureSpelled(Witch.currentTarget.PlayerId);
@@ -1633,7 +1637,7 @@ namespace TheOtherRoles
                         Patches.PlayerControlFixedUpdatePatch.miniCooldownUpdate();  // Modifies the MaxTimer if the witch is the mini
                         witchSpellButton.Timer = witchSpellButton.MaxTimer;
                         if (Witch.triggerBothCooldowns) {
-                            float multiplier = (Mini.mini != null && CachedPlayer.LocalPlayer.PlayerControl == Mini.mini) ? (Mini.isGrownUp() ? 0.66f : 2f) : 1f;
+                            float multiplier = (Mini.mini != null && PlayerControl.LocalPlayer == Mini.mini) ? (Mini.isGrownUp() ? 0.66f : 2f) : 1f;
                             Witch.witch.killTimer = GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown * multiplier;
                         }
                     } else {
@@ -1652,32 +1656,32 @@ namespace TheOtherRoles
                         MurderAttemptResult attempt = Helpers.checkMuderAttempt(Ninja.ninja, Ninja.ninjaMarked);
                         if (attempt == MurderAttemptResult.PerformKill) {
                             // Create first trace before killing
-                            var pos = CachedPlayer.LocalPlayer.transform.position;
+                            var pos = PlayerControl.LocalPlayer.transform.position;
                             byte[] buff = new byte[sizeof(float) * 2];
                             Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                             Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
 
-                            writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceNinjaTrace, Hazel.SendOption.Reliable);
+                            writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceNinjaTrace, Hazel.SendOption.Reliable);
                             writer.WriteBytesAndSize(buff);
                             writer.EndMessage();
                             RPCProcedure.placeNinjaTrace(buff);
 
-                            MessageWriter invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetInvisible, Hazel.SendOption.Reliable, -1);
+                            MessageWriter invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetInvisible, Hazel.SendOption.Reliable, -1);
                             invisibleWriter.Write(Ninja.ninja.PlayerId);
                             invisibleWriter.Write(byte.MinValue);
                             AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter);
                             RPCProcedure.setInvisible(Ninja.ninja.PlayerId, byte.MinValue);
 
                             // Perform Kill
-                            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
-                            writer2.Write(CachedPlayer.LocalPlayer.PlayerId);
+                            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+                            writer2.Write(PlayerControl.LocalPlayer.PlayerId);
                             writer2.Write(Ninja.ninjaMarked.PlayerId);
                             writer2.Write(byte.MaxValue);
                             AmongUsClient.Instance.FinishRpcImmediately(writer2);
                             if (SubmergedCompatibility.IsSubmerged) {
                                     SubmergedCompatibility.ChangeFloor(Ninja.ninjaMarked.transform.localPosition.y > -7);
                             }
-                            RPCProcedure.uncheckedMurderPlayer(CachedPlayer.LocalPlayer.PlayerId, Ninja.ninjaMarked.PlayerId, byte.MaxValue);
+                            RPCProcedure.uncheckedMurderPlayer(PlayerControl.LocalPlayer.PlayerId, Ninja.ninjaMarked.PlayerId, byte.MaxValue);
 
                             // Create Second trace after killing
                             pos = Ninja.ninjaMarked.transform.position;
@@ -1685,7 +1689,7 @@ namespace TheOtherRoles
                             Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                             Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
 
-                            MessageWriter writer3 = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceNinjaTrace, Hazel.SendOption.Reliable);
+                            MessageWriter writer3 = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceNinjaTrace, Hazel.SendOption.Reliable);
                             writer3.WriteBytesAndSize(buff);
                             writer3.EndMessage();
                             RPCProcedure.placeNinjaTrace(buff);
@@ -1706,17 +1710,17 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("warlockCurse");
 
                         // Ghost Info
-                        writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer.Write((byte)RPCProcedure.GhostInfoTypes.NinjaMarked);
                         writer.Write(Ninja.ninjaMarked.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                     }
                 },
-                () => { return Ninja.ninja != null && Ninja.ninja == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Ninja.ninja != null && Ninja.ninja == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {  // CouldUse
                     ninjaButton.Sprite = Ninja.ninjaMarked != null ? Ninja.getKillButtonSprite() : Ninja.getMarkButtonSprite(); 
-                    return (Ninja.currentTarget != null || Ninja.ninjaMarked != null && !TransportationToolPatches.isUsingTransportation(Ninja.ninjaMarked)) && CachedPlayer.LocalPlayer.PlayerControl.CanMove;
+                    return (Ninja.currentTarget != null || Ninja.ninjaMarked != null && !TransportationToolPatches.isUsingTransportation(Ninja.ninjaMarked)) && PlayerControl.LocalPlayer.CanMove;
                 },
                 () => {  // on meeting ends
                     ninjaButton.Timer = ninjaButton.MaxTimer;
@@ -1730,26 +1734,26 @@ namespace TheOtherRoles
 
             mayorMeetingButton = new CustomButton(
                () => {
-                   CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement 
+                   PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
                    Mayor.remoteMeetingsLeft--;
                       Helpers.handleVampireBiteOnBodyReport(); // Manually call Vampire handling, since the CmdReportDeadBody Prefix won't be called
-                   RPCProcedure.uncheckedCmdReportDeadBody(CachedPlayer.LocalPlayer.PlayerId, Byte.MaxValue);
+                   RPCProcedure.uncheckedCmdReportDeadBody(PlayerControl.LocalPlayer.PlayerId, Byte.MaxValue);
 
-                   MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedCmdReportDeadBody, Hazel.SendOption.Reliable, -1);
-                   writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                   MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedCmdReportDeadBody, Hazel.SendOption.Reliable, -1);
+                   writer.Write(PlayerControl.LocalPlayer.PlayerId);
                    writer.Write(Byte.MaxValue);
                    AmongUsClient.Instance.FinishRpcImmediately(writer);
                    mayorMeetingButton.Timer = 1f;
                },
-               () => { return Mayor.mayor != null && Mayor.mayor == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead && Mayor.meetingButton; },
+               () => { return Mayor.mayor != null && Mayor.mayor == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead && Mayor.meetingButton; },
                () => {
                    mayorMeetingButton.actionButton.OverrideText("Emergency ("+ Mayor.remoteMeetingsLeft + ")");
                    bool sabotageActive = false;
-                   foreach (PlayerTask task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator())
+                   foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks.GetFastEnumerator())
                        if (task.TaskType == TaskTypes.FixLights || task.TaskType == TaskTypes.RestoreOxy || task.TaskType == TaskTypes.ResetReactor || task.TaskType == TaskTypes.ResetSeismic || task.TaskType == TaskTypes.FixComms || task.TaskType == TaskTypes.StopCharles
                            || SubmergedCompatibility.IsSubmerged && task.TaskType == SubmergedCompatibility.RetrieveOxygenMask)
                            sabotageActive = true;
-                   return !sabotageActive && CachedPlayer.LocalPlayer.PlayerControl.CanMove && (Mayor.remoteMeetingsLeft > 0);
+                   return !sabotageActive && PlayerControl.LocalPlayer.CanMove && (Mayor.remoteMeetingsLeft > 0);
                },
                () => { mayorMeetingButton.Timer = mayorMeetingButton.MaxTimer; },
                Mayor.getMeetingSprite(),
@@ -1768,12 +1772,12 @@ namespace TheOtherRoles
                 () => {
 
 
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetTrap, Hazel.SendOption.Reliable);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetTrap, Hazel.SendOption.Reliable);
                     writer.WriteBytesAndSize(buff);
                     writer.EndMessage();
                     RPCProcedure.setTrap(buff);
@@ -1781,10 +1785,10 @@ namespace TheOtherRoles
                     SoundEffectsManager.play("trapperTrap");
                     trapperButton.Timer = trapperButton.MaxTimer;
                 },
-                () => { return Trapper.trapper != null && Trapper.trapper == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return Trapper.trapper != null && Trapper.trapper == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (trapperChargesText != null) trapperChargesText.text = $"{Trapper.charges} / {Trapper.maxCharges}";
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Trapper.charges > 0;
+                    return PlayerControl.LocalPlayer.CanMove && Trapper.charges > 0;
                 },
                 () => { trapperButton.Timer = trapperButton.MaxTimer; },
                 Trapper.getButtonSprite(),
@@ -1797,12 +1801,12 @@ namespace TheOtherRoles
             bomberButton = new CustomButton(
                 () => {
                     if (Helpers.checkMuderAttempt(Bomber.bomber, Bomber.bomber, ignoreMedic: true) != MurderAttemptResult.BlankKill) {
-                        var pos = CachedPlayer.LocalPlayer.transform.position;
+                        var pos = PlayerControl.LocalPlayer.transform.position;
                         byte[] buff = new byte[sizeof(float) * 2];
                         Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                         Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
 
-                        MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PlaceBomb, Hazel.SendOption.Reliable);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PlaceBomb, Hazel.SendOption.Reliable);
                         writer.WriteBytesAndSize(buff);
                         writer.EndMessage();
                         RPCProcedure.placeBomb(buff);
@@ -1813,8 +1817,8 @@ namespace TheOtherRoles
                     bomberButton.Timer = bomberButton.MaxTimer;
                     Bomber.isPlanted = true;
                 },
-                () => { return Bomber.bomber != null && Bomber.bomber == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove && !Bomber.isPlanted; },
+                () => { return Bomber.bomber != null && Bomber.bomber == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove && !Bomber.isPlanted; },
                 () => { bomberButton.Timer = bomberButton.MaxTimer; },
                 Bomber.getButtonSprite(),
                 CustomButton.ButtonPositions.upperRowLeft,
@@ -1838,13 +1842,13 @@ namespace TheOtherRoles
                         defuseButton.PositionOffset = new Vector3(0f, 2f, 0f);
                     else
                         defuseButton.PositionOffset = new Vector3(0f, 1f, 0f);
-                    return Bomber.bomb != null && Bomb.canDefuse && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                    return Bomber.bomb != null && Bomb.canDefuse && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (defuseButton.isEffectActive && !Bomb.canDefuse) {
                         defuseButton.Timer = 0f;
                         defuseButton.isEffectActive = false;
                     }
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove; 
+                    return PlayerControl.LocalPlayer.CanMove; 
                 },
                 () => {
                     defuseButton.Timer = 0f;
@@ -1857,7 +1861,7 @@ namespace TheOtherRoles
                 true,
                 Bomber.defuseDuration,
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.DefuseBomb, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.DefuseBomb, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.defuseBomb();
 
@@ -1879,7 +1883,7 @@ namespace TheOtherRoles
 
                     if (Thief.suicideFlag) {
                         // Suicide
-                        MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
                         writer2.Write(thief.PlayerId);
                         writer2.Write(thief.PlayerId);
                         writer2.Write(0);
@@ -1890,14 +1894,14 @@ namespace TheOtherRoles
 
                     // Steal role if survived.
                     if (!Thief.thief.Data.IsDead && result == MurderAttemptResult.PerformKill) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ThiefStealsRole, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ThiefStealsRole, Hazel.SendOption.Reliable, -1);
                         writer.Write(target.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.thiefStealsRole(target.PlayerId);
                     }
                     // Kill the victim (after becoming their role - so that no win is triggered for other teams)
                     if (result == MurderAttemptResult.PerformKill) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
                         writer.Write(thief.PlayerId);
                         writer.Write(target.PlayerId);
                         writer.Write(byte.MaxValue);
@@ -1905,8 +1909,8 @@ namespace TheOtherRoles
                         RPCProcedure.uncheckedMurderPlayer(thief.PlayerId, target.PlayerId, byte.MaxValue);
                     }
                 },
-               () => { return Thief.thief != null && CachedPlayer.LocalPlayer.PlayerControl == Thief.thief && !CachedPlayer.LocalPlayer.Data.IsDead; },
-               () => { return Thief.currentTarget != null && CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+               () => { return Thief.thief != null && PlayerControl.LocalPlayer == Thief.thief && !PlayerControl.LocalPlayer.Data.IsDead; },
+               () => { return Thief.currentTarget != null && PlayerControl.LocalPlayer.CanMove; },
                () => { thiefKillButton.Timer = thiefKillButton.MaxTimer; },
                __instance.KillButton.graphic.sprite,
                CustomButton.ButtonPositions.upperRowRight,
@@ -1925,13 +1929,13 @@ namespace TheOtherRoles
             // Yoyo button
             yoyoButton = new CustomButton(
                 () => {
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
                     
                     if (Yoyo.markedLocation == null) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoMarkLocation, Hazel.SendOption.Reliable);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.YoyoMarkLocation, Hazel.SendOption.Reliable);
                         writer.WriteBytesAndSize(buff);
                         writer.EndMessage();
                         RPCProcedure.yoyoMarkLocation(buff);
@@ -1946,7 +1950,7 @@ namespace TheOtherRoles
                         if (SubmergedCompatibility.IsSubmerged) {
                             SubmergedCompatibility.ChangeFloor(exit.y > -7);
                         }
-                        MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable);
                         writer.Write(Byte.MaxValue);
                         writer.WriteBytesAndSize(buff);
                         writer.EndMessage();
@@ -1958,8 +1962,8 @@ namespace TheOtherRoles
                         SoundEffectsManager.play("morphlingMorph");
                     }
                 },
-                () => { return Yoyo.yoyo != null && Yoyo.yoyo == CachedPlayer.LocalPlayer.PlayerControl && !CachedPlayer.LocalPlayer.Data.IsDead; },
-                () => { return CachedPlayer.LocalPlayer.PlayerControl.CanMove; },
+                () => { return Yoyo.yoyo != null && Yoyo.yoyo == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; },
+                () => { return PlayerControl.LocalPlayer.CanMove; },
                 () => {
                     if (Yoyo.markStaysOverMeeting) {
                         yoyoButton.Timer = 10f;
@@ -1988,7 +1992,7 @@ namespace TheOtherRoles
                     }
 
                     // jump back!
-                    var pos = CachedPlayer.LocalPlayer.transform.position;
+                    var pos = PlayerControl.LocalPlayer.transform.position;
                     byte[] buff = new byte[sizeof(float) * 2];
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, buff, 0 * sizeof(float), sizeof(float));
                     Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, buff, 1 * sizeof(float), sizeof(float));
@@ -1996,7 +2000,7 @@ namespace TheOtherRoles
                     if (SubmergedCompatibility.IsSubmerged) {
                         SubmergedCompatibility.ChangeFloor(exit.y > -7);
                     }
-                    MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.YoyoBlink, Hazel.SendOption.Reliable);
                     writer.Write((byte)0);
                     writer.WriteBytesAndSize(buff);
                     writer.EndMessage();
@@ -2024,7 +2028,7 @@ namespace TheOtherRoles
                        MapBehaviour.Instance.ShowCountOverlay(allowedToMove: true, showLivePlayerPosition: true, includeDeadBodies: true);
                    }
                },
-               () => { return Yoyo.yoyo != null && Yoyo.yoyo == CachedPlayer.LocalPlayer.PlayerControl && Yoyo.hasAdminTable && !CachedPlayer.LocalPlayer.Data.IsDead; },
+               () => { return Yoyo.yoyo != null && Yoyo.yoyo == PlayerControl.LocalPlayer && Yoyo.hasAdminTable && !PlayerControl.LocalPlayer.Data.IsDead; },
                () => {
                    return true;
                },
@@ -2051,8 +2055,8 @@ namespace TheOtherRoles
             zoomOutButton = new CustomButton(
                 () => { Helpers.toggleZoom();
                 },
-                () => { if (CachedPlayer.LocalPlayer.PlayerControl == null || !CachedPlayer.LocalPlayer.Data.IsDead || (CachedPlayer.LocalPlayer.Data.Role.IsImpostor && !CustomOptionHolder.deadImpsBlockSabotage.getBool())) return false;
-                    var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
+                () => { if (PlayerControl.LocalPlayer == null || !PlayerControl.LocalPlayer.Data.IsDead || (PlayerControl.LocalPlayer.Data.Role.IsImpostor && !CustomOptionHolder.deadImpsBlockSabotage.getBool())) return false;
+                    var (playerCompleted, playerTotal) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
                     int numberOfLeftTasks = playerTotal - playerCompleted;
                     return numberOfLeftTasks <= 0 || !CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool();
                 },
@@ -2068,15 +2072,15 @@ namespace TheOtherRoles
 
             hunterLighterButton = new CustomButton(
                 () => {
-                    Hunter.lightActive.Add(CachedPlayer.LocalPlayer.PlayerId);
+                    Hunter.lightActive.Add(PlayerControl.LocalPlayer.PlayerId);
                     SoundEffectsManager.play("lighterLight");
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
                     writer.Write(Hunter.lightPunish);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.shareTimer(Hunter.lightPunish);
                 },
-                () => { return HideNSeek.isHunter() && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return HideNSeek.isHunter() && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => { return true; },
                 () => {
                     hunterLighterButton.Timer = 30f;
@@ -2090,7 +2094,7 @@ namespace TheOtherRoles
                 true,
                 Hunter.lightDuration,
                 () => {
-                    Hunter.lightActive.Remove(CachedPlayer.LocalPlayer.PlayerId);
+                    Hunter.lightActive.Remove(PlayerControl.LocalPlayer.PlayerId);
                     hunterLighterButton.Timer = hunterLighterButton.MaxTimer;
                     SoundEffectsManager.play("lighterLight");
                 }
@@ -2104,14 +2108,14 @@ namespace TheOtherRoles
                        MapBehaviour.Instance.ShowCountOverlay(allowedToMove: true, showLivePlayerPosition: true, includeDeadBodies: false);
                    }
 
-                   CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement 
+                   PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement 
 
-                   MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
+                   MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
                    writer.Write(Hunter.AdminPunish); 
                    AmongUsClient.Instance.FinishRpcImmediately(writer);
                    RPCProcedure.shareTimer(Hunter.AdminPunish);
                },
-               () => { return HideNSeek.isHunter() && !CachedPlayer.LocalPlayer.Data.IsDead; },
+               () => { return HideNSeek.isHunter() && !PlayerControl.LocalPlayer.Data.IsDead; },
                () => { return true; },
                () => {
                    hunterAdminTableButton.Timer = hunterAdminTableButton.MaxTimer;
@@ -2137,12 +2141,12 @@ namespace TheOtherRoles
                     Hunter.arrowActive = true;
                     SoundEffectsManager.play("trackerTrackPlayer");
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
                     writer.Write(Hunter.ArrowPunish);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.shareTimer(Hunter.ArrowPunish);
                 },
-                () => { return HideNSeek.isHunter() && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return HideNSeek.isHunter() && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => { return true; },
                 () => {
                     hunterArrowButton.Timer = 30f;
@@ -2164,18 +2168,18 @@ namespace TheOtherRoles
 
             huntedShieldButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.HuntedShield, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.HuntedShield, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
-                    RPCProcedure.huntedShield(CachedPlayer.LocalPlayer.PlayerId);
+                    RPCProcedure.huntedShield(PlayerControl.LocalPlayer.PlayerId);
                     SoundEffectsManager.play("timemasterShield");
 
                     Hunted.shieldCount--;
                 },
-                () => { return HideNSeek.isHunted() && !CachedPlayer.LocalPlayer.Data.IsDead; },
+                () => { return HideNSeek.isHunted() && !PlayerControl.LocalPlayer.Data.IsDead; },
                 () => {
                     if (huntedShieldCountText != null) huntedShieldCountText.text = $"{Hunted.shieldCount}";
-                    return CachedPlayer.LocalPlayer.PlayerControl.CanMove && Hunted.shieldCount > 0;
+                    return PlayerControl.LocalPlayer.CanMove && Hunted.shieldCount > 0;
                 },
                 () => {
                     huntedShieldButton.Timer = huntedShieldButton.MaxTimer;
@@ -2209,12 +2213,12 @@ namespace TheOtherRoles
                     GameObject disguiseTarget = PropHunt.currentTarget;
                     if (disguiseTarget != null) {
                         player.transform.localScale = disguiseTarget.transform.lossyScale;
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetProp, Hazel.SendOption.Reliable, -1);
-                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetProp, Hazel.SendOption.Reliable, -1);
+                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer.Write(disguiseTarget.gameObject.name);
                         writer.Write(disguiseTarget.gameObject.transform.position.x);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
-                        RPCProcedure.propHuntSetProp(CachedPlayer.LocalPlayer.PlayerId, disguiseTarget.gameObject.name, disguiseTarget.gameObject.transform.position.x);
+                        RPCProcedure.propHuntSetProp(PlayerControl.LocalPlayer.PlayerId, disguiseTarget.gameObject.name, disguiseTarget.gameObject.transform.position.x);
                         SoundEffectsManager.play("morphlingMorph");
                         propDisguiseButton.Timer = 1f;
                     }
@@ -2265,7 +2269,7 @@ namespace TheOtherRoles
                     var candidates = PlayerControl.AllPlayerControls.ToArray().Where(x => !x.Data.Role.IsImpostor && !x.Data.IsDead && !PropHunt.isCurrentlyRevealed.ContainsKey(x.PlayerId)).ToList();
                     var rng = new System.Random();
                     PlayerControl selectedPlayer = candidates[rng.Next(candidates.Count)];
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetRevealed, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetRevealed, Hazel.SendOption.Reliable, -1);
                     writer.Write(selectedPlayer.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.propHuntSetRevealed(selectedPlayer.PlayerId);
@@ -2287,10 +2291,10 @@ namespace TheOtherRoles
 
             propHuntInvisButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PropHuntSetInvis, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PropHuntSetInvis, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
-                    RPCProcedure.propHuntSetInvis(CachedPlayer.LocalPlayer.PlayerId);
+                    RPCProcedure.propHuntSetInvis(PlayerControl.LocalPlayer.PlayerId);
                     SoundEffectsManager.play("morphlingMorph");
                 },
                 () => { return PropHunt.isPropHuntGM && !PlayerControl.LocalPlayer.Data.IsDead && !PlayerControl.LocalPlayer.Data.Role.IsImpostor && PropHunt.enableInvis; },
@@ -2311,10 +2315,10 @@ namespace TheOtherRoles
 
             propHuntSpeedboostButton = new CustomButton(
                 () => {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PropHuntSetSpeedboost, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PropHuntSetSpeedboost, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
-                    RPCProcedure.propHuntSetSpeedboost(CachedPlayer.LocalPlayer.PlayerId);
+                    RPCProcedure.propHuntSetSpeedboost(PlayerControl.LocalPlayer.PlayerId);
                     SoundEffectsManager.play("timemasterShield");
                 },
                 () => { return PropHunt.isPropHuntGM && !PlayerControl.LocalPlayer.Data.IsDead && !PlayerControl.LocalPlayer.Data.Role.IsImpostor && PropHunt.enableSpeedboost; },
@@ -2341,7 +2345,7 @@ namespace TheOtherRoles
                        MapBehaviour.Instance.ShowCountOverlay(allowedToMove: true, showLivePlayerPosition: true, includeDeadBodies: false);
                    }
 
-                   CachedPlayer.LocalPlayer.NetTransform.Halt(); // Stop current movement
+                   PlayerControl.LocalPlayer.NetTransform.Halt(); // Stop current movement
                },
                () => { return PropHunt.isPropHuntGM && !PlayerControl.LocalPlayer.Data.IsDead && PlayerControl.LocalPlayer.Data.Role.IsImpostor; },
                () => {
index 9aa18d61f4423df5eaddc168cbd8953124f2d884..b49c291795599c96649f2cb0f72f7f76bd8e3acb 100644 (file)
@@ -11,7 +11,6 @@ using UnityEngine;
 using static UnityEngine.UI.Button;
 using UnityEngine.Events;
 using Hazel;
-using TheOtherRoles.Players;
 
 namespace TheOtherRoles.CustomGameModes {
     [HarmonyPatch]
@@ -44,7 +43,7 @@ namespace TheOtherRoles.CustomGameModes {
                 {
                     TORMapOptions.gameMode = (CustomGamemodes)((int)(TORMapOptions.gameMode + 1)  % Enum.GetNames(typeof(CustomGamemodes)).Length);
                     __instance.StartCoroutine(Effects.Lerp(0.1f, new Action<float>(p => { pButton.buttonText.text = Helpers.cs(Color.yellow, GameModeText.GetComponent<TextMeshPro>().text); })));
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
                     writer.Write((byte)TORMapOptions.gameMode);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.shareGamemode((byte)TORMapOptions.gameMode);
index cc0c8cbb0e6b2d88d96b4d82f17f8bff61ee7325..e349caac6e66410cf5a634ff2d3522b0ebfcad04 100644 (file)
@@ -8,6 +8,7 @@ namespace TheOtherRoles.CustomGameModes {
 
         public PlayerControl guesser = null;
         public int shots = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeNumberOfShots.getFloat());
+        public int tasksToUnlock = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeCrewGuesserNumberOfTasks.getFloat());
         public GuesserGM(PlayerControl player) {
             guesser = player;
             guessers.Add(this);
@@ -26,6 +27,7 @@ namespace TheOtherRoles.CustomGameModes {
             if (g == null) return;
             g.guesser = null;
             g.shots = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeNumberOfShots.getFloat());
+            g.tasksToUnlock = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeCrewGuesserNumberOfTasks.getFloat());
 
             guessers.Remove(g);
         }
index 0908fd3971d1e748740a1229a653759a77ccbe8d..e95e838aa3903dbf4af68f67fd48c59fc9fcfd56 100644 (file)
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using TheOtherRoles.Objects;
-using TheOtherRoles.Players;
 using UnityEngine;
 
 namespace TheOtherRoles.CustomGameModes {
@@ -22,17 +21,17 @@ namespace TheOtherRoles.CustomGameModes {
         public static float killCooldown = 10f;
         public static float hunterWaitingTime = 15f;
         public static bool isHunter() {
-            return isHideNSeekGM && CachedPlayer.LocalPlayer != null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor;
+            return isHideNSeekGM && PlayerControl.LocalPlayer != null && PlayerControl.LocalPlayer.Data.Role.IsImpostor;
         }
 
-        public static List<CachedPlayer> getHunters() {
-            List<CachedPlayer> hunters = new List<CachedPlayer>(CachedPlayer.AllPlayers);
+        public static List<PlayerControl> getHunters() {
+            List<PlayerControl> hunters = new List<PlayerControl>(PlayerControl.AllPlayerControls.ToArray());
             hunters.RemoveAll(x => !x.Data.Role.IsImpostor);
             return hunters;
         }
 
         public static bool isHunted() {
-            return isHideNSeekGM && CachedPlayer.LocalPlayer != null && !CachedPlayer.LocalPlayer.Data.Role.IsImpostor;
+            return isHideNSeekGM && PlayerControl.LocalPlayer != null && !PlayerControl.LocalPlayer.Data.Role.IsImpostor;
         }
 
         public static void clearAndReload() {
index 7d0aa063571197e436b17bd7f01296459d72dd03..346e9786f04dab32e034c3e9b8a450ed092a2404 100644 (file)
@@ -7,11 +7,12 @@ using Reactor.Utilities.Extensions;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Reflection;
 using TheOtherRoles.Patches;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using TMPro;
 using UnityEngine;
+using UnityEngine.Video;
 using static TheOtherRoles.Snitch;
 using static UnityEngine.GraphicsBuffer;
 
@@ -259,16 +260,19 @@ namespace TheOtherRoles.CustomGameModes {
                 float dist = 55f;
                 float dist2 = 15f;
                 float curr = float.MaxValue;
-                foreach (PlayerControl playerControl in PlayerControl.AllPlayerControls.ToArray().Where(x => !x.Data.IsDead && (PlayerControl.LocalPlayer.Data.Role.IsImpostor ? !x.Data.Role.IsImpostor : x.Data.Role.IsImpostor))) {
-                    if (invisPlayers.ContainsKey(playerControl.PlayerId)) continue;  // Dont light up for invisible players
-                    if (!(playerControl == null)) {
-
-                        float sqrMagnitude = (playerControl.transform.position - PlayerControl.LocalPlayer.transform.position).sqrMagnitude;
-                        if (sqrMagnitude < dist && curr > sqrMagnitude) {
-                            curr = sqrMagnitude;
+                try {
+                    foreach (PlayerControl playerControl in PlayerControl.AllPlayerControls.ToArray().Where(x => !x.Data.IsDead && (PlayerControl.LocalPlayer.Data.Role.IsImpostor ? !x.Data.Role.IsImpostor : x.Data.Role.IsImpostor))) {
+                        if (invisPlayers.ContainsKey(playerControl.PlayerId)) continue;  // Dont light up for invisible players
+                        if (!(playerControl == null)) {
+
+                            float sqrMagnitude = (playerControl.transform.position - PlayerControl.LocalPlayer.transform.position).sqrMagnitude;
+                            if (sqrMagnitude < dist && curr > sqrMagnitude) {
+                                curr = sqrMagnitude;
+                            }
                         }
                     }
                 }
+                catch { }
                 float dangerLevel1 = Mathf.Clamp01((dist - curr) / (dist - dist2));
                 float dangerLevel2 = Mathf.Clamp01((dist2 - curr) / dist2);
                 HudManager.Instance.DangerMeter.SetDangerValue(dangerLevel1, dangerLevel2);
@@ -356,7 +360,7 @@ namespace TheOtherRoles.CustomGameModes {
                 Collider2D bestCollider = null;
                 float bestDist = 9999;
                 if (whitelistedObjects == null || whitelistedObjects.Count == 0 || verbose) {
-                    updateWhitelistedObjects(true);
+                    updateWhitelistedObjects(verbose);
                 }
                 foreach (Collider2D collider in Physics2D.OverlapCircleAll(origin.transform.position, radius)) {
                     if (verbose) {
@@ -409,37 +413,49 @@ namespace TheOtherRoles.CustomGameModes {
         public static void IntroCutsceneDestroyPatch(IntroCutscene __instance) {
             if (!isPropHuntGM || !PlayerControl.LocalPlayer.Data.Role.IsImpostor) return;
             PlayerControl.LocalPlayer.moveable = false;
-            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PropHuntStartTimer, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PropHuntStartTimer, Hazel.SendOption.Reliable, -1);
             writer2.Write(true);
             AmongUsClient.Instance.FinishRpcImmediately(writer2);
             RPCProcedure.propHuntStartTimer(true);
-            introObject = new GameObject("introrenderer");
-            introObject.layer = HudManager.Instance.FullScreen.gameObject.layer;
-            introObject.transform.SetParent(HudManager.Instance.FullScreen.transform);
-            introObject.transform.localPosition = new Vector3(0, 0, -1f);
-            SpriteRenderer introRenderer = introObject.AddComponent<SpriteRenderer>();
-            introObject.SetActive(true);
-            introRenderer.enabled = true;
-            int nFrames = 25 * (int)initialBlackoutTime + 10;
-            FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(initialBlackoutTime, new Action<float>((p) => {
+
+
+            // Play mp4 video in Full Screen:
+            Assembly assembly = Assembly.GetExecutingAssembly();
+            string[] resourceNames = assembly.GetManifestResourceNames();
+            var resourceBundle = assembly.GetManifestResourceStream("TheOtherRoles.Resources.IntroAnimation.intro");
+            var assetBundle = AssetBundle.LoadFromMemory(resourceBundle.ReadFully());
+            VideoClip introVid = assetBundle.LoadAsset<VideoClip>("Assets/Video/intro.webm");
+            GameObject camera = GameObject.Find("Main Camera");
+            var videoPlayer = camera.AddComponent<UnityEngine.Video.VideoPlayer>();
+            videoPlayer.playOnAwake = false;
+            videoPlayer.renderMode = UnityEngine.Video.VideoRenderMode.CameraNearPlane;
+            videoPlayer.targetCameraAlpha = 1F;
+            videoPlayer.source = VideoSource.VideoClip;
+            videoPlayer.clip = introVid;
+            videoPlayer.aspectRatio = VideoAspectRatio.FitVertically;
+            // Skip the first 100 frames.
+            videoPlayer.frame = (21 - (int)initialBlackoutTime) * 25;
+            videoPlayer.isLooping = false;
+            videoPlayer.Play();
+
+
+            FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(initialBlackoutTime + 10f/25, new Action<float>((p) => {
                 if (p == 1f) {
                     // start timer
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.PropHuntStartTimer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.PropHuntStartTimer, Hazel.SendOption.Reliable, -1);
                     writer.Write(false);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.propHuntStartTimer();
                     PlayerControl.LocalPlayer.moveable = true;
                     HudManager.Instance.FullScreen.enabled = false;
+                    videoPlayer.Destroy();
+                    assetBundle.Unload(false);
                     introObject.Destroy();
                 } else {
                     HudManager.Instance.FullScreen.enabled = true;
                     HudManager.Instance.FullScreen.gameObject.SetActive(true);
-                    HudManager.Instance.FullScreen.color = new Color(0, 0, 0, 1);
-                    introRenderer.sprite?.Destroy();
-                    introRenderer.sprite = getIntroSprite(510 - nFrames + (int)(p * nFrames));
-                    Resources.UnloadUnusedAssets();  // Needed so that the last sprite gets unloaded
                 }
-            })));            
+            })));
         }
 
         [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.FixedUpdate))]
@@ -542,7 +558,7 @@ namespace TheOtherRoles.CustomGameModes {
         [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.MurderPlayer))]
         [HarmonyPostfix]
         public static void MurderPlayerPostfix(PlayerControl __instance, [HarmonyArgument(0)] PlayerControl target) {
-            if (!PropHunt.isPropHuntGM || target != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (!PropHunt.isPropHuntGM || target != PlayerControl.LocalPlayer) return;
             try {
                 target.NetTransform.RpcSnapTo(__instance.transform.position);
             } catch { }
@@ -578,7 +594,7 @@ namespace TheOtherRoles.CustomGameModes {
             if (__instance.currentTarget == null) {
                 PlayerControl.LocalPlayer.SetKillTimer(killCooldownMiss);
             } else {  // There is a target, execute kill!
-                MurderAttemptResult res = Helpers.checkMurderAttemptAndKill(CachedPlayer.LocalPlayer.PlayerControl, __instance.currentTarget);
+                MurderAttemptResult res = Helpers.checkMurderAttemptAndKill(PlayerControl.LocalPlayer, __instance.currentTarget);
                 __instance.SetTarget(null);
                 PlayerControl.LocalPlayer.SetKillTimer(killCooldownHit);
             }
index 0b1772e0665995757e06211915c6f1970f470348..2b1389937f43a01e9a74a06aad66f58170845112 100644 (file)
@@ -311,6 +311,8 @@ namespace TheOtherRoles {
         public static CustomOption modifierChameleonHoldDuration;
         public static CustomOption modifierChameleonFadeDuration;
         public static CustomOption modifierChameleonMinVisibility;
+        
+        public static CustomOption modifierArmored;
 
         public static CustomOption modifierShifter;
 
@@ -345,6 +347,7 @@ namespace TheOtherRoles {
         public static CustomOption guesserGamemodeKillsThroughShield;
         public static CustomOption guesserGamemodeEvilCanKillSpy;
         public static CustomOption guesserGamemodeCantGuessSnitchIfTaksDone;
+        public static CustomOption guesserGamemodeCrewGuesserNumberOfTasks;
         public static CustomOption guesserGamemodeSidekickIsAlwaysGuesser;
 
         // Hide N Seek Gamemode
@@ -730,23 +733,24 @@ namespace TheOtherRoles {
             modifierChameleonFadeDuration = CustomOption.Create(1093, Types.Modifier, "Fade Duration", 1f, 0.25f, 10f, 0.25f, modifierChameleon);
             modifierChameleonMinVisibility = CustomOption.Create(1094, Types.Modifier, "Minimum Visibility", new string[] { "0%", "10%", "20%", "30%", "40%", "50%" }, modifierChameleon);
 
+            modifierArmored = CustomOption.Create(1101, Types.Modifier, cs(Color.yellow, "Armored"), rates, null, true);
+
             modifierShifter = CustomOption.Create(1100, Types.Modifier, cs(Color.yellow, "Shifter"), rates, null, true);
 
             // Guesser Gamemode (2000 - 2999)
-            guesserGamemodeCrewNumber = CustomOption.Create(2001, Types.Guesser, cs(Guesser.color, "Number of Crew Guessers"), 15f, 1f, 15f, 1f, null, true, heading: "Amount of Guessers");
-            guesserGamemodeNeutralNumber = CustomOption.Create(2002, Types.Guesser, cs(Guesser.color, "Number of Neutral Guessers"), 15f, 1f, 15f, 1f, null);
-            guesserGamemodeImpNumber = CustomOption.Create(2003, Types.Guesser, cs(Guesser.color, "Number of Impostor Guessers"), 15f, 1f, 15f, 1f, null);
+            guesserGamemodeCrewNumber = CustomOption.Create(2001, Types.Guesser, cs(Guesser.color, "Number of Crew Guessers"), 15f, 0f, 15f, 1f, null, true, heading: "Amount of Guessers");
+            guesserGamemodeNeutralNumber = CustomOption.Create(2002, Types.Guesser, cs(Guesser.color, "Number of Neutral Guessers"), 15f, 0f, 15f, 1f, null);
+            guesserGamemodeImpNumber = CustomOption.Create(2003, Types.Guesser, cs(Guesser.color, "Number of Impostor Guessers"), 15f, 0f, 15f, 1f, null);
             guesserForceJackalGuesser = CustomOption.Create(2007, Types.Guesser, "Force Jackal Guesser", false, null, true, heading: "Force Guessers");
             guesserGamemodeSidekickIsAlwaysGuesser = CustomOption.Create(2012, Types.Guesser, "Sidekick Is Always Guesser", false, null);
             guesserForceThiefGuesser = CustomOption.Create(2011, Types.Guesser, "Force Thief Guesser", false, null);
             guesserGamemodeHaveModifier = CustomOption.Create(2004, Types.Guesser, "Guessers Can Have A Modifier", true, null, true, heading: "General Guesser Settings");
             guesserGamemodeNumberOfShots = CustomOption.Create(2005, Types.Guesser, "Guesser Number Of Shots", 3f, 1f, 15f, 1f, null);
             guesserGamemodeHasMultipleShotsPerMeeting = CustomOption.Create(2006, Types.Guesser, "Guesser Can Shoot Multiple Times Per Meeting", false, null);
+            guesserGamemodeCrewGuesserNumberOfTasks = CustomOption.Create(2013, Types.Guesser, "Number Of Tasks Needed To Unlock Shooting\nFor Crew Guesser", 0f, 0f, 15f, 1f, null);
             guesserGamemodeKillsThroughShield = CustomOption.Create(2008, Types.Guesser, "Guesses Ignore The Medic Shield", true, null);
             guesserGamemodeEvilCanKillSpy = CustomOption.Create(2009, Types.Guesser, "Evil Guesser Can Guess The Spy", true, null);
             guesserGamemodeCantGuessSnitchIfTaksDone = CustomOption.Create(2010, Types.Guesser, "Guesser Can't Guess Snitch When Tasks Completed", true, null);
-            // Care: 2012 already taken!
-            
 
             // Hide N Seek Gamemode (3000 - 3999)
             hideNSeekMap = CustomOption.Create(3020, Types.HideNSeekMain, cs(Color.yellow, "Map"), new string[] { "The Skeld", "Mira", "Polus", "Airship", "Fungle", "Submerged", "LI Map"}, null, true, onChange: () => { int map = hideNSeekMap.selection; if (map >= 3) map++; GameOptionsManager.Instance.currentNormalGameOptions.MapId = (byte)map; });
index 5f587171b65b06567fd8819cc778b042369a1abd..2e51993d7b2a368b63667a574b92e88a813bd871 100644 (file)
@@ -9,7 +9,6 @@ using static TheOtherRoles.TheOtherRoles;
 using TheOtherRoles.Modules;
 using HarmonyLib;
 using Hazel;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using System.Threading.Tasks;
 using TheOtherRoles.CustomGameModes;
@@ -85,8 +84,10 @@ namespace TheOtherRoles {
             return null;
         }
 
+        /* This function has been removed from TOR because we switched to assetbundles for compressed audio. leaving it here for reference - Gendelo
         public static AudioClip loadAudioClipFromResources(string path, string clipName = "UNNAMED_TOR_AUDIO_CLIP") {
-            // must be "raw (headerless) 2-channel signed 32 bit pcm (le)" (can e.g. use Audacity® to export)
+
+            // must be "raw (headerless) 2-channel signed 32 bit pcm (le) 48kHz" (can e.g. use Audacity® to export )
             try {
                 Assembly assembly = Assembly.GetExecutingAssembly();
                 Stream stream = assembly.GetManifestResourceStream(path);
@@ -109,11 +110,11 @@ namespace TheOtherRoles {
             }
             return null;
 
-            /* Usage example:
-            AudioClip exampleClip = Helpers.loadAudioClipFromResources("TheOtherRoles.Resources.exampleClip.raw");
-            if (Constants.ShouldPlaySfx()) SoundManager.Instance.PlaySound(exampleClip, false, 0.8f);
-            */
-        }
+            // Usage example:
+            //AudioClip exampleClip = Helpers.loadAudioClipFromResources("TheOtherRoles.Resources.exampleClip.raw");
+            //if (Constants.ShouldPlaySfx()) SoundManager.Instance.PlaySound(exampleClip, false, 0.8f);
+            
+        }*/
 
         public static string readTextFromResources(string path) {
             Assembly assembly = Assembly.GetExecutingAssembly();
@@ -130,7 +131,7 @@ namespace TheOtherRoles {
 
         public static PlayerControl playerById(byte id)
         {
-            foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                 if (player.PlayerId == id)
                     return player;
             return null;
@@ -139,7 +140,7 @@ namespace TheOtherRoles {
         public static Dictionary<byte, PlayerControl> allPlayersById()
         {
             Dictionary<byte, PlayerControl> res = new Dictionary<byte, PlayerControl>();
-            foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                 res.Add(player.PlayerId, player);
             return res;
         }
@@ -147,7 +148,7 @@ namespace TheOtherRoles {
         public static void handleVampireBiteOnBodyReport() {
             // Murder the bitten player and reset bitten (regardless whether the kill was successful or not)
             Helpers.checkMurderAttemptAndKill(Vampire.vampire, Vampire.bitten, true, false);
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
             writer.Write(byte.MaxValue);
             writer.Write(byte.MaxValue);
             AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -229,7 +230,7 @@ namespace TheOtherRoles {
         }
 
         public static bool shouldShowGhostInfo() {
-            return CachedPlayer.LocalPlayer.PlayerControl != null && CachedPlayer.LocalPlayer.PlayerControl.Data.IsDead && TORMapOptions.ghostsSeeInformation || AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Ended;
+            return PlayerControl.LocalPlayer != null && PlayerControl.LocalPlayer.Data.IsDead && TORMapOptions.ghostsSeeInformation || AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Ended;
         }
 
         public static void clearAllTasks(this PlayerControl player) {
@@ -274,7 +275,7 @@ namespace TheOtherRoles {
         }
 
         public static bool MushroomSabotageActive() {
-            return CachedPlayer.LocalPlayer.PlayerControl.myTasks.ToArray().Any((x) => x.TaskType == TaskTypes.MushroomMixupSabotage);
+            return PlayerControl.LocalPlayer.myTasks.ToArray().Any((x) => x.TaskType == TaskTypes.MushroomMixupSabotage);
         }
 
 
@@ -367,7 +368,7 @@ namespace TheOtherRoles {
             target.RawSetColor(colorId);
             target.RawSetVisor(visorId, colorId);
             target.RawSetHat(hatId, colorId);
-            target.RawSetName(hidePlayerName(CachedPlayer.LocalPlayer.PlayerControl, target) ? "" : playerName);
+            target.RawSetName(hidePlayerName(PlayerControl.LocalPlayer, target) ? "" : playerName);
 
 
             SkinViewData nextSkin = null;
@@ -440,9 +441,9 @@ namespace TheOtherRoles {
             else if (Thief.canUseVents &&  Thief.thief != null && Thief.thief == player)
                 roleCouldUse = true;
             else if (player.Data?.Role != null && player.Data.Role.CanVent)  {
-                if (Janitor.janitor != null && Janitor.janitor == CachedPlayer.LocalPlayer.PlayerControl)
+                if (Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer)
                     roleCouldUse = false;
-                else if (Mafioso.mafioso != null && Mafioso.mafioso == CachedPlayer.LocalPlayer.PlayerControl && Godfather.godfather != null && !Godfather.godfather.Data.IsDead)
+                else if (Mafioso.mafioso != null && Mafioso.mafioso == PlayerControl.LocalPlayer && Godfather.godfather != null && !Godfather.godfather.Data.IsDead)
                     roleCouldUse = false;
                 else
                     roleCouldUse = true;
@@ -450,9 +451,23 @@ namespace TheOtherRoles {
             return roleCouldUse;
         }
 
+        public static bool checkArmored(PlayerControl target, bool breakShield, bool showShield, bool additionalCondition = true) {
+            if (target != null && Armored.armored != null && Armored.armored == target && !Armored.isBrokenArmor && additionalCondition) {
+                if (breakShield) {
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.BreakArmor, Hazel.SendOption.Reliable, -1);
+                    AmongUsClient.Instance.FinishRpcImmediately(writer);
+                    RPCProcedure.breakArmor();
+                }
+                if (showShield) {
+                    target.ShowFailedMurder();
+                }
+                return true;
+            }
+            return false;
+        }
+
         public static MurderAttemptResult checkMuderAttempt(PlayerControl killer, PlayerControl target, bool blockRewind = false, bool ignoreBlank = false, bool ignoreIfKillerIsDead = false, bool ignoreMedic = false) {
             var targetRole = RoleInfo.getRoleInfoForPlayer(target, false).FirstOrDefault();
-
             // Modified vanilla checks
             if (AmongUsClient.Instance.IsGameOver) return MurderAttemptResult.SuppressKill;
             if (killer == null || killer.Data == null || (killer.Data.IsDead && !ignoreIfKillerIsDead) || killer.Data.Disconnected) return MurderAttemptResult.SuppressKill; // Allow non Impostor kills compared to vanilla code
@@ -464,7 +479,7 @@ namespace TheOtherRoles {
 
             // Handle blank shot
             if (!ignoreBlank && Pursuer.blankedList.Any(x => x.PlayerId == killer.PlayerId)) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetBlanked, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetBlanked, Hazel.SendOption.Reliable, -1);
                 writer.Write(killer.PlayerId);
                 writer.Write((byte)0);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -499,10 +514,17 @@ namespace TheOtherRoles {
 
             // Thief if hit crew only kill if setting says so, but also kill the thief.
             else if (Thief.isFailedThiefKill(target, killer, targetRole)) {
-                Thief.suicideFlag = true;
+                if (!checkArmored(killer, true, true))
+                    Thief.suicideFlag = true;
                 return MurderAttemptResult.SuppressKill;
             }
 
+            // Block Armored with armor kill
+            
+            else if (checkArmored(target, true, killer == PlayerControl.LocalPlayer, Sheriff.sheriff == null || killer.PlayerId != Sheriff.sheriff.PlayerId || isEvil(target) && Sheriff.canKillNeutrals || isKiller(target))) {
+                return MurderAttemptResult.BlankKill;
+            }
+
             // Block hunted with time shield kill
             else if (Hunted.timeshieldActive.Contains(target.PlayerId)) {
                 MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(killer.NetId, (byte)CustomRPC.HuntedRewindTime, Hazel.SendOption.Reliable, -1);
@@ -520,7 +542,7 @@ namespace TheOtherRoles {
         }
 
         public static void MurderPlayer(PlayerControl killer, PlayerControl target, bool showAnimation) {
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedMurderPlayer, Hazel.SendOption.Reliable, -1);
             writer.Write(killer.PlayerId);
             writer.Write(target.PlayerId);
             writer.Write(showAnimation ? Byte.MaxValue : 0);
@@ -538,7 +560,7 @@ namespace TheOtherRoles {
             } else if (murder == MurderAttemptResult.DelayVampireKill) {
                 HudManager.Instance.StartCoroutine(Effects.Lerp(10f, new Action<float>((p) => { 
                     if (!TransportationToolPatches.isUsingTransportation(target) && Vampire.bitten != null) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VampireSetBitten, Hazel.SendOption.Reliable, -1);
                         writer.Write(byte.MaxValue);
                         writer.Write(byte.MaxValue);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -551,7 +573,7 @@ namespace TheOtherRoles {
         }
     
         public static void shareGameVersion() {
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.VersionHandshake, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.VersionHandshake, Hazel.SendOption.Reliable, -1);
             writer.Write((byte)TheOtherRolesPlugin.Version.Major);
             writer.Write((byte)TheOtherRolesPlugin.Version.Minor);
             writer.Write((byte)TheOtherRolesPlugin.Version.Build);
@@ -565,7 +587,7 @@ namespace TheOtherRoles {
 
         public static List<PlayerControl> getKillerTeamMembers(PlayerControl player) {
             List<PlayerControl> team = new List<PlayerControl>();
-            foreach(PlayerControl p in CachedPlayer.AllPlayers) {
+            foreach(PlayerControl p in PlayerControl.AllPlayerControls) {
                 if (player.Data.Role.IsImpostor && p.Data.Role.IsImpostor && player.PlayerId != p.PlayerId && team.All(x => x.PlayerId != p.PlayerId)) team.Add(p);
                 else if (player == Jackal.jackal && p == Sidekick.sidekick) team.Add(p); 
                 else if (player == Sidekick.sidekick && p == Jackal.jackal) team.Add(p);
index 066a0bff343840ff804f5a6f39d1e626076b0864..a3a42d4ffce9007b2453c03e3745496cd80a0b0d 100644 (file)
@@ -14,7 +14,6 @@ using System.Linq;
 using System;
 using UnityEngine;
 using TheOtherRoles.Modules;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using Il2CppSystem.Security.Cryptography;
 using Il2CppSystem.Text;
@@ -33,7 +32,7 @@ namespace TheOtherRoles
     public class TheOtherRolesPlugin : BasePlugin
     {
         public const string Id = "me.eisbison.theotherroles";
-        public const string VersionString = "4.6.0";
+        public const string VersionString = "4.7.0";
         public static uint betaDays = 0;  // amount of days for the build to be usable (0 for infinite!)
 
         public static Version Version = Version.Parse(VersionString);
@@ -118,6 +117,9 @@ namespace TheOtherRoles
             ServerManager.DefaultRegions = new Il2CppReferenceArray<IRegionInfo>(new IRegionInfo[0]);
             UpdateRegions();
 
+            // Reactor Credits (future use?)
+            // Reactor.Utilities.ReactorCredits.Register("TheOtherRoles", VersionString, betaDays > 0, location => location == Reactor.Utilities.ReactorCredits.Location.PingTracker);
+
             DebugMode = Config.Bind("Custom", "Enable Debug Mode", "false");
             Harmony.PatchAll();
             
@@ -189,7 +191,7 @@ namespace TheOtherRoles
                 GameData.Instance.AddPlayer(playerControl, new InnerNet.ClientData(0));
                 AmongUsClient.Instance.Spawn(playerControl, -2, InnerNet.SpawnFlags.None);
                 
-                playerControl.transform.position = CachedPlayer.LocalPlayer.transform.position;
+                playerControl.transform.position = PlayerControl.LocalPlayer.transform.position;
                 playerControl.GetComponent<DummyBehaviour>().enabled = true;
                 playerControl.NetTransform.enabled = false;
                 playerControl.SetName(RandomString(10));
@@ -199,7 +201,7 @@ namespace TheOtherRoles
 
             // Terminate round
             if(Input.GetKeyDown(KeyCode.L)) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ForceEnd, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ForceEnd, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.forceEnd();
             }
index 4f994a7057ef6daf24111a9b32b799cc88251451..ede68dbe3bdbb5caf37f31106e83c8226c3fec90 100644 (file)
@@ -19,8 +19,8 @@ namespace TheOtherRoles.Modules;
 
 public class BepInExUpdater : MonoBehaviour
 {
-    public const string RequiredBepInExVersion = "6.0.0-be.692+851521cc126e4f9d841d2d9bfe857558f0395939";
-    public const string BepInExDownloadURL = "https://builds.bepinex.dev/projects/bepinex_be/692/BepInEx-Unity.IL2CPP-win-x86-6.0.0-be.692%2B851521c.zip";
+    public const string RequiredBepInExVersion = "6.0.0-be.697+53625800b86f6c68751445248260edf0b27a71c2";
+    public const string BepInExDownloadURL = "https://builds.bepinex.dev/projects/bepinex_be/697/BepInEx-Unity.IL2CPP-win-x86-6.0.0-be.697%2B5362580.zip";
     public static bool UpdateRequired => Paths.BepInExVersion.ToString() != RequiredBepInExVersion;
 
     public void Awake()
index 331a91363c0d64687f7f7023a92a34fa398b6119..96d8cf11f9191e01f9ef540a434c7ee95515dce5 100644 (file)
@@ -1,7 +1,6 @@
 using System;
 using HarmonyLib;
 using System.Linq;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using Hazel;
 
@@ -18,7 +17,7 @@ namespace TheOtherRoles.Modules {
                 if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started) {
                     if (text.ToLower().StartsWith("/kick ")) {
                         string playerName = text.Substring(6);
-                        PlayerControl target = CachedPlayer.AllPlayers.FirstOrDefault(x => x.Data.PlayerName.Equals(playerName));
+                        PlayerControl target = PlayerControl.AllPlayerControls.ToArray().FirstOrDefault(x => x.Data.PlayerName.Equals(playerName));
                         if (target != null && AmongUsClient.Instance != null && AmongUsClient.Instance.CanBan()) {
                             var client = AmongUsClient.Instance.GetClient(target.OwnerId);
                             if (client != null) {
@@ -28,7 +27,7 @@ namespace TheOtherRoles.Modules {
                         }
                     } else if (text.ToLower().StartsWith("/ban ")) {
                         string playerName = text.Substring(5);
-                        PlayerControl target = CachedPlayer.AllPlayers.FirstOrDefault(x => x.Data.PlayerName.Equals(playerName));
+                        PlayerControl target = PlayerControl.AllPlayerControls.ToArray().FirstOrDefault(x => x.Data.PlayerName.Equals(playerName));
                         if (target != null && AmongUsClient.Instance != null && AmongUsClient.Instance.CanBan()) {
                             var client = AmongUsClient.Instance.GetClient(target.OwnerId);
                             if (client != null) {
@@ -49,13 +48,13 @@ namespace TheOtherRoles.Modules {
                         // else its classic!
 
                         if (AmongUsClient.Instance.AmHost) {
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
                             writer.Write((byte)TORMapOptions.gameMode);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
                             RPCProcedure.shareGamemode((byte)gameMode);
                             RPCProcedure.shareGamemode((byte)TORMapOptions.gameMode);
                         } else {
-                            __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, "Nice try, but you have to be the host to use this feature");
+                            __instance.AddChat(PlayerControl.LocalPlayer, "Nice try, but you have to be the host to use this feature");
                         }
                         handled = true;
                     }
@@ -63,35 +62,35 @@ namespace TheOtherRoles.Modules {
                 
                 if (AmongUsClient.Instance.NetworkMode == NetworkModes.FreePlay) {
                     if (text.ToLower().Equals("/murder")) {
-                        CachedPlayer.LocalPlayer.PlayerControl.Exiled();
-                        FastDestroyableSingleton<HudManager>.Instance.KillOverlay.ShowKillAnimation(CachedPlayer.LocalPlayer.Data, CachedPlayer.LocalPlayer.Data);
+                        PlayerControl.LocalPlayer.Exiled();
+                        FastDestroyableSingleton<HudManager>.Instance.KillOverlay.ShowKillAnimation(PlayerControl.LocalPlayer.Data, PlayerControl.LocalPlayer.Data);
                         handled = true;
                     } else if (text.ToLower().StartsWith("/color ")) {
                         handled = true;
                         int col;
                         if (!Int32.TryParse(text.Substring(7), out col)) {
-                            __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, "Unable to parse color id\nUsage: /color {id}");
+                            __instance.AddChat(PlayerControl.LocalPlayer, "Unable to parse color id\nUsage: /color {id}");
                         }
                         col = Math.Clamp(col, 0, Palette.PlayerColors.Length - 1);
-                        CachedPlayer.LocalPlayer.PlayerControl.SetColor(col);
-                        __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, "Changed color succesfully");;
+                        PlayerControl.LocalPlayer.SetColor(col);
+                        __instance.AddChat(PlayerControl.LocalPlayer, "Changed color succesfully");;
                     } 
                 }
 
-                if (text.ToLower().StartsWith("/tp ") && CachedPlayer.LocalPlayer.Data.IsDead) {
+                if (text.ToLower().StartsWith("/tp ") && PlayerControl.LocalPlayer.Data.IsDead) {
                     string playerName = text.Substring(4).ToLower();
-                    PlayerControl target = CachedPlayer.AllPlayers.FirstOrDefault(x => x.Data.PlayerName.ToLower().Equals(playerName));
+                    PlayerControl target = PlayerControl.AllPlayerControls.ToArray().FirstOrDefault(x => x.Data.PlayerName.ToLower().Equals(playerName));
                     if (target != null) {
-                        CachedPlayer.LocalPlayer.transform.position = target.transform.position;
+                        PlayerControl.LocalPlayer.transform.position = target.transform.position;
                         handled = true;
                     }
                 }
 
                 if (text.ToLower().StartsWith("/role")) {
-                    RoleInfo localRole = RoleInfo.getRoleInfoForPlayer(CachedPlayer.LocalPlayer.PlayerControl, false).FirstOrDefault();
+                    RoleInfo localRole = RoleInfo.getRoleInfoForPlayer(PlayerControl.LocalPlayer, false).FirstOrDefault();
                     if (localRole != RoleInfo.impostor && localRole != RoleInfo.crewmate) {
                         string info = RoleInfo.GetRoleDescription(localRole);
-                        __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, info);
+                        __instance.AddChat(PlayerControl.LocalPlayer, info);
                         handled = true;
                     }
                 }
@@ -106,7 +105,7 @@ namespace TheOtherRoles.Modules {
         [HarmonyPatch(typeof(HudManager), nameof(HudManager.Update))]
         public static class EnableChat {
             public static void Postfix(HudManager __instance) {
-                if (!__instance.Chat.isActiveAndEnabled && (AmongUsClient.Instance.NetworkMode == NetworkModes.FreePlay || (CachedPlayer.LocalPlayer.PlayerControl.isLover() && Lovers.enableChat)))
+                if (!__instance.Chat.isActiveAndEnabled && (AmongUsClient.Instance.NetworkMode == NetworkModes.FreePlay || (PlayerControl.LocalPlayer.isLover() && Lovers.enableChat)))
                     __instance.Chat.SetVisible(true);
             }
         }
@@ -115,7 +114,7 @@ namespace TheOtherRoles.Modules {
         public static class SetBubbleName { 
             public static void Postfix(ChatBubble __instance, [HarmonyArgument(0)] string playerName) {
                 PlayerControl sourcePlayer = PlayerControl.AllPlayerControls.ToArray().ToList().FirstOrDefault(x => x.Data != null && x.Data.PlayerName.Equals(playerName));
-                if (sourcePlayer != null && CachedPlayer.LocalPlayer != null && CachedPlayer.LocalPlayer.Data?.Role?.IsImpostor == true && (Spy.spy != null && sourcePlayer.PlayerId == Spy.spy.PlayerId || Sidekick.sidekick != null && Sidekick.wasTeamRed && sourcePlayer.PlayerId == Sidekick.sidekick.PlayerId || Jackal.jackal != null && Jackal.wasTeamRed && sourcePlayer.PlayerId == Jackal.jackal.PlayerId) && __instance != null) __instance.NameText.color = Palette.ImpostorRed;
+                if (sourcePlayer != null && PlayerControl.LocalPlayer != null && PlayerControl.LocalPlayer.Data?.Role?.IsImpostor == true && (Spy.spy != null && sourcePlayer.PlayerId == Spy.spy.PlayerId || Sidekick.sidekick != null && Sidekick.wasTeamRed && sourcePlayer.PlayerId == Sidekick.sidekick.PlayerId || Jackal.jackal != null && Jackal.wasTeamRed && sourcePlayer.PlayerId == Jackal.jackal.PlayerId) && __instance != null) __instance.NameText.color = Palette.ImpostorRed;
             }
         }
 
@@ -124,8 +123,8 @@ namespace TheOtherRoles.Modules {
             public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] PlayerControl sourcePlayer) {
                 if (__instance != FastDestroyableSingleton<HudManager>.Instance.Chat)
                     return true;
-                PlayerControl localPlayer = CachedPlayer.LocalPlayer.PlayerControl;
-                return localPlayer == null || (MeetingHud.Instance != null || LobbyBehaviour.Instance != null || (localPlayer.Data.IsDead || localPlayer.isLover() && Lovers.enableChat) || (int)sourcePlayer.PlayerId == (int)CachedPlayer.LocalPlayer.PlayerId);
+                PlayerControl localPlayer = PlayerControl.LocalPlayer;
+                return localPlayer == null || (MeetingHud.Instance != null || LobbyBehaviour.Instance != null || (localPlayer.Data.IsDead || localPlayer.isLover() && Lovers.enableChat) || (int)sourcePlayer.PlayerId == (int)PlayerControl.LocalPlayer.PlayerId);
 
             }
         }
index dd5b4bd69d9c79f1af8b218e3d2d56123446f174..cdbf309a549c10f1d49549f9e9e4e47d496626a4 100644 (file)
@@ -8,7 +8,6 @@ using HarmonyLib;
 using Hazel;
 using System.Reflection;
 using System.Text;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using static TheOtherRoles.TheOtherRoles;
 using static TheOtherRoles.CustomOption;
@@ -18,6 +17,9 @@ using BepInEx.Unity.IL2CPP;
 using BepInEx;
 using static ShipStatus;
 using TMPro;
+using Rewired.Utils.Platforms.Windows;
+using static Il2CppSystem.Xml.Schema.FacetsChecker.FacetsCompiler;
+using TheOtherRoles;
 
 namespace TheOtherRoles {
     public class CustomOption {
@@ -128,7 +130,7 @@ namespace TheOtherRoles {
         public static void ShareOptionChange(uint optionId) {
             var option = options.FirstOrDefault(x => x.id == optionId);
             if (option == null) return;
-            var writer = AmongUsClient.Instance!.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareOptions, SendOption.Reliable, -1);
+            var writer = AmongUsClient.Instance!.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareOptions, SendOption.Reliable, -1);
             writer.Write((byte)1);
             writer.WritePacked((uint)option.id);
             writer.WritePacked(Convert.ToUInt32(option.selection));
@@ -136,12 +138,12 @@ namespace TheOtherRoles {
         }
 
         public static void ShareOptionSelections() {
-            if (CachedPlayer.AllPlayers.Count <= 1 || AmongUsClient.Instance!.AmHost == false && CachedPlayer.LocalPlayer.PlayerControl == null) return;
+            if (PlayerControl.AllPlayerControls.Count <= 1 || AmongUsClient.Instance!.AmHost == false && PlayerControl.LocalPlayer == null) return;
             var optionsList = new List<CustomOption>(CustomOption.options);
             while (optionsList.Any())
             {
                 byte amount = (byte) Math.Min(optionsList.Count, 200); // takes less than 3 bytes per option on average
-                var writer = AmongUsClient.Instance!.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareOptions, SendOption.Reliable, -1);
+                var writer = AmongUsClient.Instance!.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareOptions, SendOption.Reliable, -1);
                 writer.Write(amount);
                 for (int i = 0; i < amount; i++)
                 {
@@ -178,6 +180,7 @@ namespace TheOtherRoles {
             if (AmongUsClient.Instance?.AmClient == true && notifyUsers && selection != newSelection) {
                 DestroyableSingleton<HudManager>.Instance.Notifier.AddSettingsChangeMessage((StringNames)(this.id + 6000), selections[newSelection].ToString(), false);
                 try {
+                    selection = newSelection;
                     if (GameStartManager.Instance != null && GameStartManager.Instance.LobbyInfoPane != null && GameStartManager.Instance.LobbyInfoPane.LobbyViewSettingsPane != null && GameStartManager.Instance.LobbyInfoPane.LobbyViewSettingsPane.gameObject.activeSelf) {
                         LobbyViewSettingsPaneChangeTabPatch.Postfix(GameStartManager.Instance.LobbyInfoPane.LobbyViewSettingsPane, GameStartManager.Instance.LobbyInfoPane.LobbyViewSettingsPane.currentTab);
                     }
@@ -187,10 +190,18 @@ namespace TheOtherRoles {
             try {
                 if (onChange != null) onChange();
             } catch { }
+            if (AmongUsClient.Instance?.AmHost == true) {
+                var currentTab = GameOptionsMenuStartPatch.currentTabs.FirstOrDefault(x => x.active).GetComponent<GameOptionsMenu>();
+                if (currentTab != null) {
+                    var optionType = options.First(x => x.optionBehaviour == currentTab.Children[0]).type;
+                    GameOptionsMenuStartPatch.updateGameOptionsMenu(optionType, currentTab);
+                }
+            }
+
             if (optionBehaviour != null && optionBehaviour is StringOption stringOption) {
                 stringOption.oldValue = stringOption.Value = selection;
                 stringOption.ValueText.text = selections[selection].ToString();
-                if (AmongUsClient.Instance?.AmHost == true && CachedPlayer.LocalPlayer.PlayerControl) {
+                if (AmongUsClient.Instance?.AmHost == true && PlayerControl.LocalPlayer) {
                     if (id == 0 && selection != preset) {
                         switchPreset(selection); // Switch presets
                         ShareOptionSelections();
@@ -469,7 +480,9 @@ namespace TheOtherRoles {
                     __instance.settingsInfo.Add(categoryHeaderMasked.gameObject);
                     num -= 0.85f;
                     i = 0;
-                }
+                } else if (option.parent != null && (option.parent.selection == 0 || option.parent.parent != null && option.parent.parent.selection == 0)) continue;  // Hides options, for which the parent is disabled!
+                if (option == CustomOptionHolder.crewmateRolesCountMax || option == CustomOptionHolder.neutralRolesCountMax || option == CustomOptionHolder.impostorRolesCountMax || option == CustomOptionHolder.modifiersCountMax || option == CustomOptionHolder.crewmateRolesFill)
+                    continue;
 
                 ViewSettingsInfoPanel viewSettingsInfoPanel = UnityEngine.Object.Instantiate<ViewSettingsInfoPanel>(__instance.infoPanelOrigin);
                 viewSettingsInfoPanel.transform.SetParent(__instance.settingsContainer);
@@ -486,8 +499,9 @@ namespace TheOtherRoles {
                 }
                 viewSettingsInfoPanel.transform.localPosition = new Vector3(num2, num, -2f);
                 int value = option.getSelection();
-                viewSettingsInfoPanel.SetInfo(StringNames.ImpostorsCategory, option.selections[value].ToString(), 61);
-                viewSettingsInfoPanel.titleText.text = option.name;
+                var settingTuple = handleSpecialOptionsView(option, option.name, option.selections[value].ToString());
+                viewSettingsInfoPanel.SetInfo(StringNames.ImpostorsCategory, settingTuple.Item2, 61);
+                viewSettingsInfoPanel.titleText.text = settingTuple.Item1;
                 if (option.isHeader && (int)optionType != 99 && option.heading == "" && (option.type == CustomOptionType.Neutral || option.type == CustomOptionType.Crewmate || option.type == CustomOptionType.Impostor || option.type == CustomOptionType.Modifier)) {
                     viewSettingsInfoPanel.titleText.text = "Spawn Chance";
                 }
@@ -506,6 +520,53 @@ namespace TheOtherRoles {
 
         }
 
+        private static Tuple<string, string> handleSpecialOptionsView(CustomOption option, string defaultString, string defaultVal) {
+            string name = defaultString;
+            string val = defaultVal;
+            if (option == CustomOptionHolder.crewmateRolesCountMin) {
+                val = "";
+                name = "Crewmate Roles";
+                var min = CustomOptionHolder.crewmateRolesCountMin.getSelection();
+                var max = CustomOptionHolder.crewmateRolesCountMax.getSelection();
+                if (CustomOptionHolder.crewmateRolesFill.getBool()) {
+                    var crewCount = PlayerControl.AllPlayerControls.Count - GameOptionsManager.Instance.currentGameOptions.NumImpostors;
+                    int minNeutral = CustomOptionHolder.neutralRolesCountMin.getSelection();
+                    int maxNeutral = CustomOptionHolder.neutralRolesCountMax.getSelection();
+                    if (minNeutral > maxNeutral) minNeutral = maxNeutral;
+                    min = crewCount - maxNeutral;
+                    max = crewCount - minNeutral;
+                    if (min < 0) min = 0;
+                    if (max < 0) max = 0;
+                    val = "Fill: ";
+                }
+                if (min > max) min = max;
+                val += (min == max) ? $"{max}" : $"{min} - {max}";
+            }
+            if (option == CustomOptionHolder.neutralRolesCountMin) { 
+                name = "Neutral Roles";
+                var min = CustomOptionHolder.neutralRolesCountMin.getSelection();
+                var max = CustomOptionHolder.neutralRolesCountMax.getSelection();
+                if (min > max) min = max;
+                val = (min == max) ? $"{max}" : $"{min} - {max}";
+            }
+            if (option == CustomOptionHolder.impostorRolesCountMin) {
+                name = "Impostor Roles";
+                var min = CustomOptionHolder.impostorRolesCountMin.getSelection();
+                var max = CustomOptionHolder.impostorRolesCountMax.getSelection();
+                if (max > GameOptionsManager.Instance.currentGameOptions.NumImpostors) max = GameOptionsManager.Instance.currentGameOptions.NumImpostors;
+                if (min > max) min = max;
+                val = (min == max) ? $"{max}" : $"{min} - {max}";
+            }
+            if (option == CustomOptionHolder.modifiersCountMin) {
+                name = "Modifiers";
+                var min = CustomOptionHolder.modifiersCountMin.getSelection();
+                var max = CustomOptionHolder.modifiersCountMax.getSelection();
+                if (min > max) min = max;
+                val = (min == max) ? $"{max}" : $"{min} - {max}";
+            }
+            return new(name, val);
+        }
+
         public static void createSettingTabs(LobbyViewSettingsPane __instance) {
             // Handle different gamemodes and tabs needed therein.
             int next = 3;
@@ -640,7 +701,7 @@ namespace TheOtherRoles {
                     categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f;
                     categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, num, -2f);
                     num -= 0.63f;
-                }
+                } else if (option.parent != null && (option.parent.selection == 0 || option.parent.parent != null && option.parent.parent.selection == 0)) continue;  // Hides options, for which the parent is disabled!
                 OptionBehaviour optionBehaviour = UnityEngine.Object.Instantiate<StringOption>(menu.stringOptionOrigin, Vector3.zero, Quaternion.identity, menu.settingsContainer);
                 optionBehaviour.transform.localPosition = new Vector3(0.952f, num, -2f);
                 optionBehaviour.SetClickMask(menu.ButtonClickMask);
@@ -722,6 +783,14 @@ namespace TheOtherRoles {
             torSettingsTab.name = settingName;
                 
             var torSettingsGOM = torSettingsTab.GetComponent<GameOptionsMenu>();
+
+            updateGameOptionsMenu(optionType, torSettingsGOM);
+
+            currentTabs.Add(torSettingsTab);
+            torSettingsTab.SetActive(false);
+        }
+
+        public static void updateGameOptionsMenu(CustomOptionType optionType, GameOptionsMenu torSettingsGOM) {
             foreach (var child in torSettingsGOM.Children) {
                 child.Destroy();
             }
@@ -731,9 +800,6 @@ namespace TheOtherRoles {
             if (TORMapOptions.gameMode == CustomGamemodes.Guesser) // Exclude guesser options in neutral mode
                 relevantOptions = relevantOptions.Where(x => !(new List<int> { 310, 311, 312, 313, 314, 315, 316, 317, 318 }).Contains(x.id)).ToList();
             createSettings(torSettingsGOM, relevantOptions);
-
-            currentTabs.Add(torSettingsTab);
-            torSettingsTab.SetActive(false);
         }
 
         private static void createSettingTabs(GameSettingMenu __instance) {
@@ -1136,6 +1202,14 @@ namespace TheOtherRoles {
             GameOptionsData.KillDistances = new(new float[] { 0.5f, 1f, 1.8f, 2.5f });
             GameOptionsData.KillDistanceStrings = new(new string[] { "Very Short", "Short", "Medium", "Long" });
         }
+
+        [HarmonyPatch(typeof(StringGameSetting), nameof(StringGameSetting.GetValueString))]
+        [HarmonyPrefix]
+        public static bool AjdustStringForViewPanel(StringGameSetting __instance, float value, ref string __result) {
+            if (__instance.OptionName != Int32OptionNames.KillDistance) return true;
+            __result = GameOptionsData.KillDistanceStrings[(int)value];
+            return false;
+        }
     }
 
     [HarmonyPatch(typeof(KeyboardJoystick), nameof(KeyboardJoystick.Update))]
@@ -1219,7 +1293,7 @@ namespace TheOtherRoles {
             Scroller.ContentYBounds = new FloatRange(MinY, maxY);
 
             // Prevent scrolling when the player is interacting with a menu
-            if (CachedPlayer.LocalPlayer?.PlayerControl.CanMove != true) {
+            if (PlayerControl.LocalPlayer.CanMove != true) {
                 GameSettings.transform.localPosition = LastPosition;
 
                 return;
@@ -1357,9 +1431,9 @@ namespace TheOtherRoles {
                 toggleZoomButton.OnClick.RemoveAllListeners();
                 toggleZoomButton.OnClick.AddListener((Action)(() => Helpers.toggleZoom()));
             }
-            var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
+            var (playerCompleted, playerTotal) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
             int numberOfLeftTasks = playerTotal - playerCompleted;
-            bool zoomButtonActive = !(CachedPlayer.LocalPlayer.PlayerControl == null || !CachedPlayer.LocalPlayer.Data.IsDead || (CachedPlayer.LocalPlayer.Data.Role.IsImpostor && !CustomOptionHolder.deadImpsBlockSabotage.getBool()));
+            bool zoomButtonActive = !(PlayerControl.LocalPlayer == null || !PlayerControl.LocalPlayer.Data.IsDead || (PlayerControl.LocalPlayer.Data.Role.IsImpostor && !CustomOptionHolder.deadImpsBlockSabotage.getBool()) || MeetingHud.Instance);
             zoomButtonActive &= numberOfLeftTasks <= 0 || !CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool();
             toggleZoomButtonObject.SetActive(zoomButtonActive);
             var posOffset = Helpers.zoomOutStatus ? new Vector3(-1.27f, -7.92f, -52f) : new Vector3(0, -1.6f, -52f);
index cabb5eeae8a2d0635a694401e7a0f189fec2f5ea..36509caabeb375cf3bc5bfbc5fbae8e48856379c 100644 (file)
@@ -4,7 +4,7 @@ using AmongUs.GameOptions;
 using HarmonyLib;
 using Hazel;
 using InnerNet;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 
 namespace TheOtherRoles.Modules {
@@ -21,16 +21,16 @@ namespace TheOtherRoles.Modules {
                             if (AmongUsClient.Instance.AmHost && AmongUsClient.Instance.CanBan()) { // checking both just cause
                                 handled = true;
                                 if (!Int32.TryParse(text.Substring(6), out LobbyLimit)) {
-                                    __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, "Invalid Size\nUsage: /size {amount}");
+                                    __instance.AddChat(PlayerControl.LocalPlayer, "Invalid Size\nUsage: /size {amount}");
                                 } else {
                                     LobbyLimit = Math.Clamp(LobbyLimit, 4, 15);
                                     if (LobbyLimit != GameOptionsManager.Instance.currentNormalGameOptions.MaxPlayers) {
                                         GameOptionsManager.Instance.currentNormalGameOptions.MaxPlayers = LobbyLimit;
                                         FastDestroyableSingleton<GameStartManager>.Instance.LastPlayerCount = LobbyLimit;
-                                        CachedPlayer.LocalPlayer.PlayerControl.RpcSyncSettings(GameOptionsManager.Instance.gameOptionsFactory.ToBytes(GameOptionsManager.Instance.currentGameOptions, false));  // TODO Maybe simpler?? 
-                                        __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, $"Lobby Size changed to {LobbyLimit} players");
+                                        PlayerControl.LocalPlayer.RpcSyncSettings(GameOptionsManager.Instance.gameOptionsFactory.ToBytes(GameOptionsManager.Instance.currentGameOptions, false));  // TODO Maybe simpler?? 
+                                        __instance.AddChat(PlayerControl.LocalPlayer, $"Lobby Size changed to {LobbyLimit} players");
                                     } else {
-                                        __instance.AddChat(CachedPlayer.LocalPlayer.PlayerControl, $"Lobby Size is already {LobbyLimit}");
+                                        __instance.AddChat(PlayerControl.LocalPlayer, $"Lobby Size is already {LobbyLimit}");
                                     }
                                 }
                             }
index 69708f49b24448b030d813a72a933f8ac9001b24..f881162fbb72c25ae8a4cfe1b3c4acc2a4303bcc 100644 (file)
@@ -2,7 +2,6 @@ using Hazel;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using UnityEngine;
 
@@ -51,7 +50,7 @@ namespace TheOtherRoles.Objects {
 
             bomb.SetActive(false);
             background.SetActive(false);
-            if (CachedPlayer.LocalPlayer.PlayerControl == Bomber.bomber) {
+            if (PlayerControl.LocalPlayer == Bomber.bomber) {
                 bomb.SetActive(true);
             }
             Bomber.bomb = this;
@@ -82,18 +81,18 @@ namespace TheOtherRoles.Objects {
             if (b == null) return;
             if (Bomber.bomber != null) {
                 var position = b.bomb.transform.position;
-                var distance = Vector2.Distance(position, CachedPlayer.LocalPlayer.transform.position);  // every player only checks that for their own client (desynct with positions sucks)
-                if (distance < Bomber.destructionRange && !CachedPlayer.LocalPlayer.Data.IsDead) {
-                    Helpers.checkMurderAttemptAndKill(Bomber.bomber, CachedPlayer.LocalPlayer.PlayerControl, false, false, true, true);
+                var distance = Vector2.Distance(position, PlayerControl.LocalPlayer.transform.position);  // every player only checks that for their own client (desynct with positions sucks)
+                if (distance < Bomber.destructionRange && !PlayerControl.LocalPlayer.Data.IsDead) {
+                    Helpers.checkMurderAttemptAndKill(Bomber.bomber, PlayerControl.LocalPlayer, false, false, true, true);
                     
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     writer.Write((byte)RPCProcedure.GhostInfoTypes.DeathReasonAndKiller);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     writer.Write((byte)DeadPlayer.CustomDeathReason.Bomb);
                     writer.Write(Bomber.bomber.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
-                    GameHistory.overrideDeathReasonAndKiller(CachedPlayer.LocalPlayer, DeadPlayer.CustomDeathReason.Bomb, killer: Bomber.bomber);
+                    GameHistory.overrideDeathReasonAndKiller(PlayerControl.LocalPlayer, DeadPlayer.CustomDeathReason.Bomb, killer: Bomber.bomber);
                 }
                 SoundEffectsManager.playAtPosition("bombExplosion", position, range: Bomber.hearRange) ;
             }
@@ -113,7 +112,7 @@ namespace TheOtherRoles.Objects {
                 Bomber.clearBomb();
             }
 
-            if (Vector2.Distance(CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition(), Bomber.bomb.bomb.transform.position) > 1f) canDefuse = false;
+            if (Vector2.Distance(PlayerControl.LocalPlayer.GetTruePosition(), Bomber.bomb.bomb.transform.position) > 1f) canDefuse = false;
             else canDefuse = true;
         }
 
index 525f463a124c396c7b6019e63afa035ddba78c18..ce4d85ab32b0ce5868b51e4026c29f89b0cc82a9 100644 (file)
@@ -1,7 +1,6 @@
 using Il2CppSystem.Runtime.ExceptionServices;
 using System;
 using System.Collections.Generic;
-using TheOtherRoles.Players;
 using TMPro;
 using UnityEngine;
 using UnityEngine.UI;
@@ -89,7 +88,7 @@ namespace TheOtherRoles.Objects {
                 this.OnClick();
 
                 // Deputy skip onClickEvent if handcuffed
-                if (Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] > 0f) return;
+                if (Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[PlayerControl.LocalPlayer.PlayerId] > 0f) return;
 
                 if (this.HasEffect && !this.isEffectActive) {
                     this.DeputyTimer = this.EffectDuration;
@@ -161,8 +160,8 @@ namespace TheOtherRoles.Objects {
 
         public void Update()
         {
-            var localPlayer = CachedPlayer.LocalPlayer;
-            var moveable = localPlayer.PlayerControl.moveable;
+            var localPlayer = PlayerControl.LocalPlayer;
+            var moveable = localPlayer.moveable;
             
             if (localPlayer.Data == null || MeetingHud.Instance || ExileController.Instance || !HasButton()) {
                 setActive(false);
@@ -173,7 +172,7 @@ namespace TheOtherRoles.Objects {
             if (DeputyTimer >= 0) { // This had to be reordered, so that the handcuffs do not stop the underlying timers from running
                 if (HasEffect && isEffectActive)
                     DeputyTimer -= Time.deltaTime;
-                else if (!localPlayer.PlayerControl.inVent && moveable)
+                else if (!localPlayer.inVent && moveable)
                     DeputyTimer -= Time.deltaTime;
             }
 
@@ -214,7 +213,7 @@ namespace TheOtherRoles.Objects {
             if (Timer >= 0) {
                 if (HasEffect && isEffectActive)
                     Timer -= Time.deltaTime;
-                else if (!localPlayer.PlayerControl.inVent && moveable)
+                else if (!localPlayer.inVent && moveable)
                     Timer -= Time.deltaTime;
             }
             
index 88faa78a798c06e4bf0c111f56ce5ff4a125d020..faf870f0f21146d260c11a50e60e6837606b2f2c 100644 (file)
@@ -4,7 +4,6 @@ using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using UnityEngine;
 using static TheOtherRoles.TheOtherRoles;
index e44ba283607fcf59d4996238db5b05c101fa6866..9781c9e90b2b8febceff016a8611c73e6ec46c6d 100644 (file)
@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using UnityEngine;
 using System.Linq;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using Reactor.Utilities.Extensions;
 
@@ -43,7 +43,7 @@ namespace TheOtherRoles.Objects {
             gameObject = new GameObject("JackInTheBox"){layer = 11};
             gameObject.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
             Vector3 position = new Vector3(p.x, p.y,  p.y/1000f + 0.01f);
-            position += (Vector3)CachedPlayer.LocalPlayer.PlayerControl.Collider.offset; // Add collider offset that DoMove moves the player up at a valid position
+            position += (Vector3)PlayerControl.LocalPlayer.Collider.offset; // Add collider offset that DoMove moves the player up at a valid position
             // Create the marker
             gameObject.transform.position = position;
             boxRenderer = gameObject.AddComponent<SpriteRenderer>();
@@ -79,7 +79,7 @@ namespace TheOtherRoles.Objects {
             vent.name = "JackInTheBoxVent_" + vent.Id;
 
             // Only render the box for the Trickster and for Ghosts
-            var showBoxToLocalPlayer = CachedPlayer.LocalPlayer.PlayerControl == Trickster.trickster || PlayerControl.LocalPlayer.Data.IsDead;
+            var showBoxToLocalPlayer = PlayerControl.LocalPlayer == Trickster.trickster || PlayerControl.LocalPlayer.Data.IsDead;
             gameObject.SetActive(showBoxToLocalPlayer);
 
             AllJackInTheBoxes.Add(this);
@@ -88,7 +88,7 @@ namespace TheOtherRoles.Objects {
         public static void UpdateStates() {
             if (boxesConvertedToVents == true) return;
             foreach (var box in AllJackInTheBoxes) {
-                var showBoxToLocalPlayer = CachedPlayer.LocalPlayer.PlayerControl == Trickster.trickster || PlayerControl.LocalPlayer.Data.IsDead;
+                var showBoxToLocalPlayer = PlayerControl.LocalPlayer == Trickster.trickster || PlayerControl.LocalPlayer.Data.IsDead;
                 box.gameObject.SetActive(showBoxToLocalPlayer);
             }
         }
index 8194739d16e2053b4c091f80efac7ea8c4f45e74..fcdfce9bdb1962046493bb4f43d5c541273b148a 100644 (file)
@@ -20,7 +20,7 @@ namespace TheOtherRoles.Objects {
         public NinjaTrace(Vector2 p, float duration=1f) {
             trace = new GameObject("NinjaTrace");
             trace.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
-            //Vector3 position = new Vector3(p.x, p.y, CachedPlayer.LocalPlayer.transform.localPosition.z + 0.001f); // just behind player
+            //Vector3 position = new Vector3(p.x, p.y, PlayerControl.LocalPlayer.transform.localPosition.z + 0.001f); // just behind player
             Vector3 position = new Vector3(p.x, p.y, p.y / 1000f + 0.01f);
             trace.transform.position = position;
             trace.transform.localPosition = position;
index a512a322ac7369f7e23a914b8a1abb8a16f83045..11fa4b43350c811cd243b252d9580b043bc77ace 100644 (file)
@@ -1,7 +1,7 @@
 using System;
 using UnityEngine;
 using System.Collections.Generic;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using static TheOtherRoles.TheOtherRoles;
 
@@ -82,7 +82,7 @@ namespace TheOtherRoles.Objects {
 
         public Portal(Vector2 p) {
             portalGameObject = new GameObject("Portal"){ layer = 11 };
-            //Vector3 position = new Vector3(p.x, p.y, CachedPlayer.LocalPlayer.transform.position.z + 1f);
+            //Vector3 position = new Vector3(p.x, p.y, PlayerControl.LocalPlayer.transform.position.z + 1f);
             Vector3 position = new Vector3(p.x, p.y, p.y / 1000f + 0.01f);
 
             // Create the portal            
@@ -100,7 +100,7 @@ namespace TheOtherRoles.Objects {
             animationFgRenderer.material = FastDestroyableSingleton<HatManager>.Instance.PlayerMaterial;
 
             // Only render the inactive portals for the Portalmaker
-            bool playerIsPortalmaker = CachedPlayer.LocalPlayer.PlayerControl == TheOtherRoles.Portalmaker.portalmaker;
+            bool playerIsPortalmaker = PlayerControl.LocalPlayer == TheOtherRoles.Portalmaker.portalmaker;
             portalGameObject.SetActive(playerIsPortalmaker);
             portalFgAnimationGameObject.SetActive(true);
 
index 7d2cfaab2ab09652c6d8dd96ee7463e03928bcb1..b1046487e6f24ca8030c410c580bedb259d7e6a6 100644 (file)
@@ -34,7 +34,7 @@ namespace TheOtherRoles.Objects {
             this.visibleForEveryOne = visibleForEveryOne;
             gameObject = new GameObject("Silhouette");
             gameObject.AddSubmergedComponent(SubmergedCompatibility.Classes.ElevatorMover);
-            //Vector3 position = new Vector3(p.x, p.y, CachedPlayer.LocalPlayer.transform.localPosition.z + 0.001f); // just behind player
+            //Vector3 position = new Vector3(p.x, p.y, PlayerControl.LocalPlayer.transform.localPosition.z + 0.001f); // just behind player
             Vector3 position = new Vector3(p.x, p.y, p.y / 1000f + 0.01f);
             gameObject.transform.position = position;
             gameObject.transform.localPosition = position;
index e8ce26599faf13782c46ac1e0a91623a830b4d1f..d6133881dfb40b411c2bf47ad347de03ccd59034 100644 (file)
@@ -2,7 +2,6 @@ using Hazel;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using UnityEngine;
 
@@ -38,7 +37,7 @@ namespace TheOtherRoles.Objects {
             var trapRenderer = trap.AddComponent<SpriteRenderer>();
             trapRenderer.sprite = getTrapSprite();
             trap.SetActive(false);
-            if (CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) trap.SetActive(true);
+            if (PlayerControl.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) trap.SetActive(true);
             trapRenderer.color = Color.white * new Vector4(1, 1, 1, 0.5f);
             this.instanceId = ++instanceCounter;
             traps.Add(this);
@@ -75,11 +74,11 @@ namespace TheOtherRoles.Objects {
             Trap t = traps.FirstOrDefault(x => x.instanceId == (int)trapId);
             PlayerControl player = Helpers.playerById(playerId);
             if (Trapper.trapper == null || t == null || player == null) return;
-            bool localIsTrapper = CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId;
+            bool localIsTrapper = PlayerControl.LocalPlayer.PlayerId == Trapper.trapper.PlayerId;
             if (!trapPlayerIdMap.ContainsKey(playerId)) trapPlayerIdMap.Add(playerId, t);
             t.usedCount ++;
             t.triggerable = false;
-            if (playerId == CachedPlayer.LocalPlayer.PlayerId || playerId == Trapper.trapper.PlayerId) {
+            if (playerId == PlayerControl.LocalPlayer.PlayerId || playerId == Trapper.trapper.PlayerId) {
                 t.trap.SetActive(true);
                 SoundEffectsManager.play("trapperTrap");
             }
@@ -108,7 +107,7 @@ namespace TheOtherRoles.Objects {
 
         public static void Update() {
             if (Trapper.trapper == null) return;
-            CachedPlayer player = CachedPlayer.LocalPlayer;
+            var player = PlayerControl.LocalPlayer;
             Vent vent = MapUtilities.CachedShipStatus.AllVents[0];
             float closestDistance = float.MaxValue;
 
@@ -117,16 +116,16 @@ namespace TheOtherRoles.Objects {
             Trap target = null;
             foreach (Trap trap in traps) {
                 if (trap.arrow.arrow.active) trap.arrow.Update();
-                if (trap.revealed || !trap.triggerable || trap.trappedPlayer.Contains(player.PlayerControl)) continue;
-                if (player.PlayerControl.inVent || !player.PlayerControl.CanMove) continue;
-                float distance = Vector2.Distance(trap.trap.transform.position, player.PlayerControl.GetTruePosition());
+                if (trap.revealed || !trap.triggerable || trap.trappedPlayer.Contains(player)) continue;
+                if (player.inVent || !player.CanMove) continue;
+                float distance = Vector2.Distance(trap.trap.transform.position, player.GetTruePosition());
                 if (distance <= ud && distance < closestDistance) {
                     closestDistance = distance;
                     target = trap;
                 }
             }
             if (target != null && player.PlayerId != Trapper.trapper.PlayerId && !player.Data.IsDead) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.TriggerTrap, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.TriggerTrap, Hazel.SendOption.Reliable, -1);
                 writer.Write(player.PlayerId);
                 writer.Write(target.instanceId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
index bc252ff5b714433e921c4471c7a0814d46b75820..778e86ad90883f027f5f9067e7ca1258b57b8205 100644 (file)
@@ -6,7 +6,6 @@ using System.Net.Http;
 using System.Threading.Tasks;
 using TheOtherRoles;
 using TheOtherRoles.CustomGameModes;
-using TheOtherRoles.Players;
 using TheOtherRoles.Utilities;
 using TMPro;
 using UnityEngine;
index c3f041e7de4cfb768215857ae825c8cb4f8ae398..7f8d275e34cb4c640aae9db937c8df1878ad6096 100644 (file)
@@ -1,5 +1,5 @@
 using HarmonyLib;
-using TheOtherRoles.Players;
+
 using UnityEngine;
 
 namespace TheOtherRoles.Patches {
@@ -12,7 +12,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPrefix]
 
         public static void Prefix(DangerMeter __instance, ref Color color) {
-            if (CachedPlayer.LocalPlayer.PlayerControl != Tracker.tracker) return;
+            if (PlayerControl.LocalPlayer != Tracker.tracker) return;
             if (__instance == HudManager.Instance.DangerMeter) return;
 
             color = color.SetAlpha(0.5f);
index 485c621101d894f001b6acd6efd7931be925a7a3..ac3c1315f3b18f8a9be0bc3463be18ab9642ac2d 100644 (file)
@@ -6,9 +6,10 @@ using UnityEngine;
 using System.Linq;
 using System;
 using System.Text;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
+using LibCpp2IL.Elf;
 
 namespace TheOtherRoles.Patches {
     enum CustomGameOverReason {
@@ -63,8 +64,8 @@ namespace TheOtherRoles.Patches {
 
 
     [HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.OnGameEnd))]
-    public class OnGameEndPatch {
-        private static GameOverReason gameOverReason;
+    public static class OnGameEndPatch {
+        public static GameOverReason gameOverReason = GameOverReason.HumansByTask;
         public static void Prefix(AmongUsClient __instance, [HarmonyArgument(0)]ref EndGameResult endGameResult) {
             gameOverReason = endGameResult.GameOverReason;
             if ((int)endGameResult.GameOverReason >= 10) endGameResult.GameOverReason = GameOverReason.ImpostorByKill;
@@ -76,7 +77,7 @@ namespace TheOtherRoles.Patches {
         public static void Postfix(AmongUsClient __instance, [HarmonyArgument(0)]ref EndGameResult endGameResult) {
             AdditionalTempData.clear();
 
-            foreach(var playerControl in CachedPlayer.AllPlayers) {
+            foreach(var playerControl in PlayerControl.AllPlayerControls) {
                 var roles = RoleInfo.getRoleInfoForPlayer(playerControl);
                 var (tasksCompleted, tasksTotal) = TasksHandler.taskInfo(playerControl.Data);
                 bool isGuesser = HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(playerControl.PlayerId);
@@ -123,7 +124,7 @@ namespace TheOtherRoles.Patches {
                 CachedPlayerData wpd = new CachedPlayerData(Mini.mini.Data);
                 wpd.IsYou = false; // If "no one is the Mini", it will display the Mini, but also show defeat to everyone
                 EndGameResult.CachedWinners.Add(wpd);
-                AdditionalTempData.winCondition = WinCondition.MiniLose;  
+                AdditionalTempData.winCondition = WinCondition.MiniLose;
             }
 
             // Jester win
@@ -164,7 +165,7 @@ namespace TheOtherRoles.Patches {
                 if (!Lovers.existingWithKiller()) {
                     AdditionalTempData.winCondition = WinCondition.LoversTeamWin;
                     EndGameResult.CachedWinners = new Il2CppSystem.Collections.Generic.List<CachedPlayerData>();
-                    foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                    foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                         if (p == null) continue;
                         if (p == Lovers.lover1 || p == Lovers.lover2)
                             EndGameResult.CachedWinners.Add(new CachedPlayerData(p.Data));
@@ -182,24 +183,24 @@ namespace TheOtherRoles.Patches {
                     EndGameResult.CachedWinners.Add(new CachedPlayerData(Lovers.lover2.Data));
                 }
             }
-            
+
             // Jackal win condition (should be implemented using a proper GameOverReason in the future)
             else if (teamJackalWin) {
                 // Jackal wins if nobody except jackal is alive
                 AdditionalTempData.winCondition = WinCondition.JackalWin;
                 EndGameResult.CachedWinners = new Il2CppSystem.Collections.Generic.List<CachedPlayerData>();
                 CachedPlayerData wpd = new CachedPlayerData(Jackal.jackal.Data);
-                wpd.IsImpostor = false; 
+                wpd.IsImpostor = false;
                 EndGameResult.CachedWinners.Add(wpd);
                 // If there is a sidekick. The sidekick also wins
                 if (Sidekick.sidekick != null) {
                     CachedPlayerData wpdSidekick = new CachedPlayerData(Sidekick.sidekick.Data);
-                    wpdSidekick.IsImpostor = false; 
+                    wpdSidekick.IsImpostor = false;
                     EndGameResult.CachedWinners.Add(wpdSidekick);
                 }
-                foreach(var player in Jackal.formerJackals) {
+                foreach (var player in Jackal.formerJackals) {
                     CachedPlayerData wpdFormerJackal = new CachedPlayerData(player.Data);
-                    wpdFormerJackal.IsImpostor = false; 
+                    wpdFormerJackal.IsImpostor = false;
                     EndGameResult.CachedWinners.Add(wpdFormerJackal);
                 }
             }
@@ -292,36 +293,60 @@ namespace TheOtherRoles.Patches {
             if (AdditionalTempData.winCondition == WinCondition.JesterWin) {
                 textRenderer.text = "Jester Wins";
                 textRenderer.color = Jester.color;
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.ArsonistWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.ArsonistWin) {
                 textRenderer.text = "Arsonist Wins";
                 textRenderer.color = Arsonist.color;
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.VultureWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.VultureWin) {
                 textRenderer.text = "Vulture Wins";
                 textRenderer.color = Vulture.color;
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.ProsecutorWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.ProsecutorWin) {
                 textRenderer.text = "Prosecutor Wins";
                 textRenderer.color = Lawyer.color;
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.LoversTeamWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.LoversTeamWin) {
                 textRenderer.text = "Lovers And Crewmates Win";
                 textRenderer.color = Lovers.color;
                 __instance.BackgroundBar.material.SetColor("_Color", Lovers.color);
-            } 
-            else if (AdditionalTempData.winCondition == WinCondition.LoversSoloWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.LoversSoloWin) {
                 textRenderer.text = "Lovers Win";
                 textRenderer.color = Lovers.color;
                 __instance.BackgroundBar.material.SetColor("_Color", Lovers.color);
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.JackalWin) {
+            } else if (AdditionalTempData.winCondition == WinCondition.JackalWin) {
                 textRenderer.text = "Team Jackal Wins";
                 textRenderer.color = Jackal.color;
-            }
-            else if (AdditionalTempData.winCondition == WinCondition.MiniLose) {
+            } else if (AdditionalTempData.winCondition == WinCondition.MiniLose) {
                 textRenderer.text = "Mini died";
                 textRenderer.color = Mini.color;
+            } else if (AdditionalTempData.winCondition == WinCondition.Default) {
+                switch (OnGameEndPatch.gameOverReason) {
+                    case GameOverReason.ImpostorDisconnect:
+                        textRenderer.text = "Last Crewmate Disconnected";
+                        textRenderer.color = Color.red;
+                        break;
+                    case GameOverReason.ImpostorByKill:
+                        textRenderer.text = "Impostors Win - By Kill";
+                        textRenderer.color = Color.red;
+                        break;
+                    case GameOverReason.ImpostorBySabotage:
+                        textRenderer.text = "Impostors Win - By Sabotage";
+                        textRenderer.color = Color.red;
+                        break;
+                    case GameOverReason.ImpostorByVote:
+                        textRenderer.text = "Impostors Win - By Vote, Guess or DC";
+                        textRenderer.color = Color.red;
+                        break;
+                    case GameOverReason.HumansByTask:
+                        textRenderer.text = "Crew Wins - Taskwin";
+                        textRenderer.color = Color.white;
+                        break;
+                    case GameOverReason.HumansDisconnect:
+                        textRenderer.text = "Crew Wins - No Evil Killers Left";
+                        textRenderer.color = Color.white;
+                        break;
+                    case GameOverReason.HumansByVote:
+                        textRenderer.text = "Crew Wins - No Evil Killers Left";
+                        textRenderer.color = Color.white;
+                        break;
+                }
             }
 
             foreach (WinCondition cond in AdditionalTempData.additionalWinConditions) {
index 12b1ea2f34745a1628eb27aaa17205694c201cd0..5ff9fb3f693a1dab0d120dfc1c7f1eb16ed4b3aa 100644 (file)
@@ -5,7 +5,7 @@ using System.Linq;
 using static TheOtherRoles.TheOtherRoles;
 using TheOtherRoles.Objects;
 using System;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using UnityEngine;
 
@@ -13,13 +13,11 @@ namespace TheOtherRoles.Patches {
     [HarmonyPatch(typeof(ExileController), nameof(ExileController.Begin))]
     [HarmonyPriority(Priority.First)]
     class ExileControllerBeginPatch {
-        public static NetworkedPlayerInfo lastExiled;
-        public static void Prefix(ExileController __instance, [HarmonyArgument(0)]ref NetworkedPlayerInfo exiled, [HarmonyArgument(1)]bool tie) {
-            lastExiled = exiled;
+        public static void Prefix(ExileController __instance, [HarmonyArgument(0)]ref NetworkedPlayerInfo exiled) {
 
             // Medic shield
             if (Medic.medic != null && AmongUsClient.Instance.AmHost && Medic.futureShielded != null && !Medic.medic.Data.IsDead) { // We need to send the RPC from the host here, to make sure that the order of shifting and setting the shield is correct(for that reason the futureShifted and futureShielded are being synced)
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MedicSetShielded, Hazel.SendOption.Reliable, -1);
                 writer.Write(Medic.futureShielded.PlayerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.medicSetShielded(Medic.futureShielded.PlayerId);
@@ -28,7 +26,7 @@ namespace TheOtherRoles.Patches {
 
             // Shifter shift
             if (Shifter.shifter != null && AmongUsClient.Instance.AmHost && Shifter.futureShift != null) { // We need to send the RPC from the host here, to make sure that the order of shifting and erasing is correct (for that reason the futureShifted and futureErased are being synced)
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShifterShift, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShifterShift, Hazel.SendOption.Reliable, -1);
                 writer.Write(Shifter.futureShift.PlayerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.shifterShift(Shifter.futureShift.PlayerId);
@@ -38,7 +36,7 @@ namespace TheOtherRoles.Patches {
             // Eraser erase
             if (Eraser.eraser != null && AmongUsClient.Instance.AmHost && Eraser.futureErased != null) {  // We need to send the RPC from the host here, to make sure that the order of shifting and erasing is correct (for that reason the futureShifted and futureErased are being synced)
                 foreach (PlayerControl target in Eraser.futureErased) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ErasePlayerRoles, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ErasePlayerRoles, Hazel.SendOption.Reliable, -1);
                     writer.Write(target.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.erasePlayerRoles(target.PlayerId);
@@ -66,17 +64,17 @@ namespace TheOtherRoles.Patches {
                         if (exiled != null && Lawyer.lawyer != null && (target == Lawyer.lawyer || target == Lovers.otherLover(Lawyer.lawyer)) && Lawyer.target != null && Lawyer.isProsecutor && Lawyer.target.PlayerId == exiled.PlayerId)
                             continue;
                         if (target == Lawyer.target && Lawyer.lawyer != null) {
-                            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer2 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                             AmongUsClient.Instance.FinishRpcImmediately(writer2);
                             RPCProcedure.lawyerPromotesToPursuer();
                         }
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedExilePlayer, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedExilePlayer, Hazel.SendOption.Reliable, -1);
                         writer.Write(target.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.uncheckedExilePlayer(target.PlayerId);
 
-                        MessageWriter writer3 = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                        writer3.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        MessageWriter writer3 = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                        writer3.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer3.Write((byte)RPCProcedure.GhostInfoTypes.DeathReasonAndKiller);
                         writer3.Write(target.PlayerId);
                         writer3.Write((byte)DeadPlayer.CustomDeathReason.WitchExile);
@@ -128,14 +126,16 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(ExileController), nameof(ExileController.WrapUp))]
         class BaseExileControllerPatch {
             public static void Postfix(ExileController __instance) {
-                WrapUpPostfix(__instance.exiled);
+                NetworkedPlayerInfo networkedPlayer = __instance.initData.networkedPlayer;
+                WrapUpPostfix((networkedPlayer != null) ? networkedPlayer.Object : null);
             }
         }
 
         [HarmonyPatch(typeof(AirshipExileController), nameof(AirshipExileController.WrapUpAndSpawn))]
         class AirshipExileControllerPatch {
             public static void Postfix(AirshipExileController __instance) {
-                WrapUpPostfix(__instance.exiled);
+                NetworkedPlayerInfo networkedPlayer = __instance.initData.networkedPlayer;
+                WrapUpPostfix((networkedPlayer != null) ? networkedPlayer.Object : null);
             }
         }
 
@@ -151,14 +151,14 @@ namespace TheOtherRoles.Patches {
             // submerged
             if (!SubmergedCompatibility.IsSubmerged) return;
             if (obj.name.Contains("ExileCutscene")) {
-                WrapUpPostfix(ExileControllerBeginPatch.lastExiled);
+                WrapUpPostfix(obj.GetComponent<ExileController>().initData.networkedPlayer?.Object);
             } else if (obj.name.Contains("SpawnInMinigame")) {
                 AntiTeleport.setPosition();
                 Chameleon.lastMoved.Clear();
             }
         }
 
-        static void WrapUpPostfix(NetworkedPlayerInfo exiled) {
+        static void WrapUpPostfix(PlayerControl exiled) {
             // Prosecutor win condition
             if (exiled != null && Lawyer.lawyer != null && Lawyer.target != null && Lawyer.isProsecutor && Lawyer.target.PlayerId == exiled.PlayerId && !Lawyer.lawyer.Data.IsDead)
                 Lawyer.triggerProsecutorWin = true;
@@ -177,13 +177,13 @@ namespace TheOtherRoles.Patches {
             CustomButton.MeetingEndedUpdate();
 
             // Mini set adapted cooldown
-            if (Mini.mini != null && CachedPlayer.LocalPlayer.PlayerControl == Mini.mini && Mini.mini.Data.Role.IsImpostor) {
+            if (Mini.mini != null && PlayerControl.LocalPlayer == Mini.mini && Mini.mini.Data.Role.IsImpostor) {
                 var multiplier = Mini.isGrownUp() ? 0.66f : 2f;
                 Mini.mini.SetKillTimer(GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown * multiplier);
             }
 
             // Seer spawn souls
-            if (Seer.deadBodyPositions != null && Seer.seer != null && CachedPlayer.LocalPlayer.PlayerControl == Seer.seer && (Seer.mode == 0 || Seer.mode == 2)) {
+            if (Seer.deadBodyPositions != null && Seer.seer != null && PlayerControl.LocalPlayer == Seer.seer && (Seer.mode == 0 || Seer.mode == 2)) {
                 foreach (Vector3 pos in Seer.deadBodyPositions) {
                     GameObject soul = new GameObject();
                     //soul.transform.position = pos;
@@ -211,11 +211,11 @@ namespace TheOtherRoles.Patches {
             Tracker.deadBodyPositions = new List<Vector3>();
 
             // Arsonist deactivate dead poolable players
-            if (Arsonist.arsonist != null && Arsonist.arsonist == CachedPlayer.LocalPlayer.PlayerControl) {
+            if (Arsonist.arsonist != null && Arsonist.arsonist == PlayerControl.LocalPlayer) {
                 int visibleCounter = 0;
                 Vector3 newBottomLeft = IntroCutsceneOnDestroyPatch.bottomLeft;
                 var BottomLeft = newBottomLeft + new Vector3(-0.25f, -0.25f, 0);
-                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                     if (!TORMapOptions.playerIcons.ContainsKey(p.PlayerId)) continue;
                     if (p.Data.IsDead || p.Data.Disconnected) {
                         TORMapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false);
@@ -233,11 +233,11 @@ namespace TheOtherRoles.Patches {
             }
 
             // Force Bounty Hunter Bounty Update
-            if (BountyHunter.bountyHunter != null && BountyHunter.bountyHunter == CachedPlayer.LocalPlayer.PlayerControl)
+            if (BountyHunter.bountyHunter != null && BountyHunter.bountyHunter == PlayerControl.LocalPlayer)
                 BountyHunter.bountyUpdateTimer = 0f;
 
             // Medium spawn souls
-            if (Medium.medium != null && CachedPlayer.LocalPlayer.PlayerControl == Medium.medium) {
+            if (Medium.medium != null && PlayerControl.LocalPlayer == Medium.medium) {
                 if (Medium.souls != null) {
                     foreach (SpriteRenderer sr in Medium.souls) UnityEngine.Object.Destroy(sr.gameObject);
                     Medium.souls = new List<SpriteRenderer>();
@@ -289,8 +289,8 @@ namespace TheOtherRoles.Patches {
     class ExileControllerMessagePatch {
         static void Postfix(ref string __result, [HarmonyArgument(0)]StringNames id) {
             try {
-                if (ExileController.Instance != null && ExileController.Instance.exiled != null) {
-                    PlayerControl player = Helpers.playerById(ExileController.Instance.exiled.Object.PlayerId);
+                if (ExileController.Instance != null && ExileController.Instance.initData != null) {
+                    PlayerControl player = ExileController.Instance.initData.networkedPlayer.Object;
                     if (player == null) return;
                     // Exile role text
                     if (id == StringNames.ExileTextPN || id == StringNames.ExileTextSN || id == StringNames.ExileTextPP || id == StringNames.ExileTextSP) {
index afe8f4b0efb4865ad790021ca0fef09c207591a9..1e0b3c6188bf4f0fb015313a038437386e23f5e0 100644 (file)
@@ -5,7 +5,7 @@ using System.Reflection;
 using System.Collections.Generic;
 using Hazel;
 using System;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using System.Linq;
 using Reactor.Utilities.Extensions;
@@ -21,7 +21,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.OnPlayerJoined))]
         public class AmongUsClientOnPlayerJoinedPatch {
             public static void Postfix(AmongUsClient __instance) {
-                if (CachedPlayer.LocalPlayer != null) {
+                if (PlayerControl.LocalPlayer != null) {
                     Helpers.shareGameVersion();
                 }
                 GameStartManagerUpdatePatch.sendGamemode = true;
@@ -59,7 +59,7 @@ namespace TheOtherRoles.Patches {
             }
 
             public static void Postfix(GameStartManager __instance) {
-                // Send version as soon as CachedPlayer.LocalPlayer.PlayerControl exists
+                // Send version as soon as PlayerControl.LocalPlayer exists
                 if (PlayerControl.LocalPlayer != null && !versionSent) {
                     versionSent = true;
                     Helpers.shareGameVersion();
@@ -109,7 +109,7 @@ namespace TheOtherRoles.Patches {
                         copiedStartButton?.Destroy();
                     // Make starting info available to clients:
                     if (startingTimer <= 0 && __instance.startState == GameStartManager.StartingStates.Countdown) {
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetGameStarting, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetGameStarting, Hazel.SendOption.Reliable, -1);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.setGameStarting();
                         // Activate Stop-Button
@@ -180,7 +180,7 @@ namespace TheOtherRoles.Patches {
                         PassiveButton startButtonPassiveButton = copiedStartButton.GetComponent<PassiveButton>();
 
                         void StopStartFunc() {
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.StopStart, Hazel.SendOption.Reliable, AmongUsClient.Instance.HostId);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.StopStart, Hazel.SendOption.Reliable, AmongUsClient.Instance.HostId);
                             writer.Write(PlayerControl.LocalPlayer.PlayerId);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
                             copiedStartButton.Destroy();
@@ -209,8 +209,8 @@ namespace TheOtherRoles.Patches {
 
                 if (!AmongUsClient.Instance) return;
 
-                if (AmongUsClient.Instance.AmHost && sendGamemode && CachedPlayer.LocalPlayer != null) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
+                if (AmongUsClient.Instance.AmHost && sendGamemode && PlayerControl.LocalPlayer != null) {
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGamemode, Hazel.SendOption.Reliable, -1);
                     writer.Write((byte) TORMapOptions.gameMode);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.shareGamemode((byte) TORMapOptions.gameMode);
@@ -249,7 +249,7 @@ namespace TheOtherRoles.Patches {
                         if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek) mapId = (byte)CustomOptionHolder.hideNSeekMap.getSelection();
                         else if (TORMapOptions.gameMode == CustomGamemodes.PropHunt) mapId = (byte)CustomOptionHolder.propHuntMap.getSelection();
                         if (mapId >= 3) mapId++;
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.DynamicMapOption, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.DynamicMapOption, Hazel.SendOption.Reliable, -1);
                         writer.Write(mapId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.dynamicMapOption(mapId);
@@ -300,7 +300,7 @@ namespace TheOtherRoles.Patches {
                         }
                         if (chosenMapId >= 3) chosenMapId++;  // Skip dlekS
                                                               
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.DynamicMapOption, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.DynamicMapOption, Hazel.SendOption.Reliable, -1);
                         writer.Write(chosenMapId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
                         RPCProcedure.dynamicMapOption(chosenMapId);
index 7837d79dc07c57fe2f160289989cb4480c450d76..9e2eed60bbf3a24b5e7396600e965cef4a24163c 100644 (file)
@@ -2,7 +2,7 @@
 using AmongUs.GameOptions;
 using System.Collections.Generic;
 using System.Linq;
-using TheOtherRoles.Players;
+
 using System;
 using TheOtherRoles.CustomGameModes;
 
@@ -64,7 +64,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(HauntMenuMinigame), nameof(HauntMenuMinigame.FixedUpdate))]
         public static void UpdatePostfix(HauntMenuMinigame __instance) {
             if (GameOptionsManager.Instance.currentGameOptions.GameMode != GameModes.Normal) return;
-            if (CachedPlayer.LocalPlayer.Data.Role.IsImpostor && Vampire.vampire != CachedPlayer.LocalPlayer.PlayerControl)
+            if (PlayerControl.LocalPlayer.Data.Role.IsImpostor && Vampire.vampire != PlayerControl.LocalPlayer)
                 __instance.gameObject.transform.localPosition = new UnityEngine.Vector3(-6f, -1.1f, __instance.gameObject.transform.localPosition.z);
             return;
         }
@@ -73,9 +73,9 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(AbilityButton), nameof(AbilityButton.Update))]
         public static void showOrHideAbilityButtonPostfix(AbilityButton __instance) {
             bool isGameMode = GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek || PropHunt.isPropHuntGM || HideNSeek.isHideNSeekGM;
-            if (CachedPlayer.LocalPlayer.Data.IsDead && (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool() || isGameMode)) {
+            if (PlayerControl.LocalPlayer.Data.IsDead && (CustomOptionHolder.finishTasksBeforeHauntingOrZoomingOut.getBool() || isGameMode)) {
                 // player has haunt button.
-                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
+                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
                 int numberOfLeftTasks = playerTotal - playerCompleted;
                 if (numberOfLeftTasks <= 0 || isGameMode)
                     __instance.Show();
index e2bb76795af0ac6a4a1056f312adae66db8d3ed4..cbf12f4602086ba982a9f7ead0bab69a51b334b6 100644 (file)
@@ -5,7 +5,7 @@ using UnityEngine;
 using System.Collections.Generic;
 using System.Linq;
 using Hazel;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
 
@@ -19,14 +19,14 @@ namespace TheOtherRoles.Patches {
             // Generate and initialize player icons
             int playerCounter = 0;
             int hideNSeekCounter = 0;
-            if (CachedPlayer.LocalPlayer != null && FastDestroyableSingleton<HudManager>.Instance != null) {
+            if (PlayerControl.LocalPlayer != null && FastDestroyableSingleton<HudManager>.Instance != null) {
                 float aspect = Camera.main.aspect;
                 float safeOrthographicSize = CameraSafeArea.GetSafeOrthographicSize(Camera.main);
                 float xpos = 1.75f - safeOrthographicSize * aspect * 1.70f;
                 float ypos = 0.15f - safeOrthographicSize * 1.7f;
                 bottomLeft = new Vector3(xpos / 2, ypos/2, -61f);
 
-                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                     NetworkedPlayerInfo data = p.Data;
                     PoolablePlayer player = UnityEngine.Object.Instantiate<PoolablePlayer>(__instance.PlayerPrefab, FastDestroyableSingleton<HudManager>.Instance.transform);
                     playerPrefab = __instance.PlayerPrefab;
@@ -39,7 +39,7 @@ namespace TheOtherRoles.Patches {
                     TORMapOptions.playerIcons[p.PlayerId] = player;
                     player.gameObject.SetActive(false);
 
-                    if (CachedPlayer.LocalPlayer.PlayerControl == Arsonist.arsonist && p != Arsonist.arsonist) {
+                    if (PlayerControl.LocalPlayer == Arsonist.arsonist && p != Arsonist.arsonist) {
                         player.transform.localPosition = bottomLeft + new Vector3(-0.25f, -0.25f, 0) + Vector3.right * playerCounter++ * 0.35f;
                         player.transform.localScale = Vector3.one * 0.2f;
                         player.setSemiTransparent(true);
@@ -73,7 +73,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Force Bounty Hunter to load a new Bounty when the Intro is over
-            if (BountyHunter.bounty != null && CachedPlayer.LocalPlayer.PlayerControl == BountyHunter.bountyHunter) {
+            if (BountyHunter.bounty != null && PlayerControl.LocalPlayer == BountyHunter.bountyHunter) {
                 BountyHunter.bountyUpdateTimer = 0f;
                 if (FastDestroyableSingleton<HudManager>.Instance != null) {
                     BountyHunter.cooldownText = UnityEngine.Object.Instantiate<TMPro.TextMeshPro>(FastDestroyableSingleton<HudManager>.Instance.KillButton.cooldownTimerText, FastDestroyableSingleton<HudManager>.Instance.transform);
@@ -91,7 +91,7 @@ namespace TheOtherRoles.Patches {
             if (AmongUsClient.Instance.AmHost && TORMapOptions.shieldFirstKill && TORMapOptions.firstKillName != "" && !HideNSeek.isHideNSeekGM && !PropHunt.isPropHuntGM) {
                 PlayerControl target = PlayerControl.AllPlayerControls.ToArray().ToList().FirstOrDefault(x => x.Data.PlayerName.Equals(TORMapOptions.firstKillName));
                 if (target != null) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetFirstKill, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetFirstKill, Hazel.SendOption.Reliable, -1);
                     writer.Write(target.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.setFirstKill(target.PlayerId);
@@ -152,19 +152,19 @@ namespace TheOtherRoles.Patches {
     class IntroPatch {
         public static void setupIntroTeamIcons(IntroCutscene __instance, ref  Il2CppSystem.Collections.Generic.List<PlayerControl> yourTeam) {
             // Intro solo teams
-            if (Helpers.isNeutral(CachedPlayer.LocalPlayer.PlayerControl)) {
+            if (Helpers.isNeutral(PlayerControl.LocalPlayer)) {
                 var soloTeam = new Il2CppSystem.Collections.Generic.List<PlayerControl>();
-                soloTeam.Add(CachedPlayer.LocalPlayer.PlayerControl);
+                soloTeam.Add(PlayerControl.LocalPlayer);
                 yourTeam = soloTeam;
             }
 
             // Add the Spy to the Impostor team (for the Impostors)
-            if (Spy.spy != null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor) {
+            if (Spy.spy != null && PlayerControl.LocalPlayer.Data.Role.IsImpostor) {
                 List<PlayerControl> players = PlayerControl.AllPlayerControls.ToArray().ToList().OrderBy(x => Guid.NewGuid()).ToList();
                 var fakeImpostorTeam = new Il2CppSystem.Collections.Generic.List<PlayerControl>(); // The local player always has to be the first one in the list (to be displayed in the center)
-                fakeImpostorTeam.Add(CachedPlayer.LocalPlayer.PlayerControl);
+                fakeImpostorTeam.Add(PlayerControl.LocalPlayer);
                 foreach (PlayerControl p in players) {
-                    if (CachedPlayer.LocalPlayer.PlayerControl != p && (p == Spy.spy || p.Data.Role.IsImpostor))
+                    if (PlayerControl.LocalPlayer != p && (p == Spy.spy || p.Data.Role.IsImpostor))
                         fakeImpostorTeam.Add(p);
                 }
                 yourTeam = fakeImpostorTeam;
@@ -172,7 +172,7 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void setupIntroTeam(IntroCutscene __instance, ref  Il2CppSystem.Collections.Generic.List<PlayerControl> yourTeam) {
-            List<RoleInfo> infos = RoleInfo.getRoleInfoForPlayer(CachedPlayer.LocalPlayer.PlayerControl);
+            List<RoleInfo> infos = RoleInfo.getRoleInfoForPlayer(PlayerControl.LocalPlayer);
             RoleInfo roleInfo = infos.Where(info => !info.isModifier).FirstOrDefault();
             if (roleInfo == null) return;
             if (roleInfo.isNeutral) {
@@ -205,7 +205,7 @@ namespace TheOtherRoles.Patches {
             static int seed = 0;
             static public void SetRoleTexts(IntroCutscene __instance) {
                 // Don't override the intro of the vanilla roles
-                List<RoleInfo> infos = RoleInfo.getRoleInfoForPlayer(CachedPlayer.LocalPlayer.PlayerControl);
+                List<RoleInfo> infos = RoleInfo.getRoleInfoForPlayer(PlayerControl.LocalPlayer);
                 RoleInfo roleInfo = infos.Where(info => !info.isModifier).FirstOrDefault();
                 RoleInfo modifierInfo = infos.Where(info => info.isModifier).FirstOrDefault();
 
@@ -229,7 +229,7 @@ namespace TheOtherRoles.Patches {
                     if (modifierInfo.roleId != RoleId.Lover)
                         __instance.RoleBlurbText.text += Helpers.cs(modifierInfo.color, $"\n{modifierInfo.introDescription}");
                     else {
-                        PlayerControl otherLover = CachedPlayer.LocalPlayer.PlayerControl == Lovers.lover1 ? Lovers.lover2 : Lovers.lover1;
+                        PlayerControl otherLover = PlayerControl.LocalPlayer == Lovers.lover1 ? Lovers.lover2 : Lovers.lover1;
                         __instance.RoleBlurbText.text += Helpers.cs(Lovers.color, $"\n♥ You are in love with {otherLover?.Data?.PlayerName ?? ""} ♥");
                     }
                 }
diff --git a/TheOtherRoles/Patches/LobbyScreenPatch.cs b/TheOtherRoles/Patches/LobbyScreenPatch.cs
new file mode 100644 (file)
index 0000000..b133beb
--- /dev/null
@@ -0,0 +1,68 @@
+
+using AmongUs.Data;
+using HarmonyLib;
+using InnerNet;
+using System.Text.RegularExpressions;
+using UnityEngine;
+
+namespace TheOtherRoles.Patches {
+    [HarmonyPatch]
+
+    public sealed class LobbyJoinBind {
+        static int GameId;
+
+        static GameObject LobbyText;
+
+        [HarmonyPatch(typeof(InnerNetClient), nameof(InnerNetClient.JoinGame))]
+        [HarmonyPostfix]
+
+        public static void Postfix(InnerNetClient __instance) {
+            GameId = __instance.GameId;
+        }
+
+        [HarmonyPatch(typeof(MMOnlineManager), nameof(MMOnlineManager.Start))]
+        [HarmonyPostfix]
+
+        public static void Postfix() {
+            if (!LobbyText) {
+                LobbyText = new("lobbycode");
+                var comp = LobbyText.AddComponent<TMPro.TextMeshPro>();
+                comp.fontSize = 2.5f;
+                LobbyText.transform.localPosition = new(10.3f, -3.9f, 0);
+                LobbyText.SetActive(true);
+            }
+        }
+
+        [HarmonyPatch(typeof(MMOnlineManager), nameof(MMOnlineManager.Update))]
+        [HarmonyPostfix]
+
+        public static void Postfix(MMOnlineManager __instance) {
+
+            string code2 = GUIUtility.systemCopyBuffer;
+
+            if (code2.Length != 6 || !Regex.IsMatch(code2, @"^[a-zA-Z]+$"))
+                code2 = "";
+            string code2Disp = DataManager.Settings.Gameplay.StreamerMode ? "****" : code2.ToUpper();
+            if (GameId != 0 && Input.GetKeyDown(KeyCode.LeftShift)) {
+                __instance.StartCoroutine(AmongUsClient.Instance.CoJoinOnlineGameFromCode(GameId));
+            } else if (Input.GetKeyDown(KeyCode.RightShift) && code2 != "") {
+                __instance.StartCoroutine(AmongUsClient.Instance.CoJoinOnlineGameFromCode(GameCode.GameNameToInt(code2)));
+            }
+
+            if (LobbyText) {
+                LobbyText.GetComponent<TMPro.TextMeshPro>().text = "";
+                if (GameId != 0 && GameId != 32) {
+                    string code = GameCode.IntToGameName(GameId);
+                    if (code != "") {
+                        code = DataManager.Settings.Gameplay.StreamerMode ? "****" : code;
+                        LobbyText.GetComponent<TMPro.TextMeshPro>().text = $"Prev Lobby: {code}   [LShift]";
+
+                    }
+                }
+                if (code2 != "") {
+                    LobbyText.GetComponent<TMPro.TextMeshPro>().text += $"\nClipboard: {code2Disp}  [RShift]";
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index 76e92722256e3c05ad5065b598d3af4c895de73f..2830179851740bfaaf72886eaf6c0395b89bc98a 100644 (file)
@@ -4,7 +4,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using TheOtherRoles.Objects;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using UnityEngine;
 
@@ -13,7 +13,7 @@ namespace TheOtherRoles.Patches {
 
        [HarmonyPatch(typeof(MapBehaviour))]
        static class MapBehaviourPatch {
-               public static Dictionary<PlayerControl, SpriteRenderer> herePoints = new();
+               public static Dictionary<Byte, SpriteRenderer> herePoints = new();
 
                public static Sprite Vent = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.Vent.png", 150f);
 
@@ -39,9 +39,9 @@ namespace TheOtherRoles.Patches {
                        }
 
                        __instance.HerePoint.transform.SetLocalZ(-2.1f);
-                       if (Trapper.trapper != null && CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) {
+                       if (Trapper.trapper != null && PlayerControl.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) {
                                foreach (PlayerControl player in Trapper.playersOnMap) {
-                                       if (herePoints.ContainsKey(player)) continue;
+                                       if (herePoints.ContainsKey(player.PlayerId)) continue;
                                        Vector3 v = Trap.trapPlayerIdMap[player.PlayerId].trap.transform.position;
                                        v /= MapUtilities.CachedShipStatus.MapScale;
                                        v.x *= Mathf.Sign(MapUtilities.CachedShipStatus.transform.localScale.x);
@@ -53,19 +53,19 @@ namespace TheOtherRoles.Patches {
                                        if (Trapper.anonymousMap) player.CurrentOutfit.ColorId = 6;
                                        player.SetPlayerMaterialColors(herePoint);
                                        player.CurrentOutfit.ColorId = colorId;
-                                       herePoints.Add(player, herePoint);
+                                       herePoints.Add(player.PlayerId, herePoint);
                                }
-                               foreach (var s in herePoints.Where(x => !Trapper.playersOnMap.Contains(x.Key)).ToList()) {
+                               foreach (var s in herePoints.Where(x => !Trapper.playersOnMap.Contains(Helpers.playerById(x.Key))).ToList()) {
                                        UnityEngine.Object.Destroy(s.Value);
                                        herePoints.Remove(s.Key);
                                }
-                       } else if (Snitch.snitch != null && CachedPlayer.LocalPlayer.PlayerId == Snitch.snitch.PlayerId && !Snitch.snitch.Data.IsDead && Snitch.mode != Snitch.Mode.Chat) {
+                       } else if (Snitch.snitch != null && PlayerControl.LocalPlayer.PlayerId == Snitch.snitch.PlayerId && !Snitch.snitch.Data.IsDead && Snitch.mode != Snitch.Mode.Chat) {
                                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(Snitch.snitch.Data);
                                int numberOfTasks = playerTotal - playerCompleted;
 
                                if (numberOfTasks == 0) {
                                        if (MeetingHud.Instance == null) {
-                                               foreach (PlayerControl player in CachedPlayer.AllPlayers) {
+                                               foreach (PlayerControl player in PlayerControl.AllPlayerControls) {
                                                        if (Snitch.targets == Snitch.Targets.EvilPlayers && !Helpers.isEvil(player)) continue;
                                                        else if (Snitch.targets == Snitch.Targets.Killers && !Helpers.isKiller(player)) continue;
                                                        if (player.Data.IsDead) continue;
@@ -73,8 +73,8 @@ namespace TheOtherRoles.Patches {
                                                        v /= MapUtilities.CachedShipStatus.MapScale;
                                                        v.x *= Mathf.Sign(MapUtilities.CachedShipStatus.transform.localScale.x);
                                                        v.z = -2.1f;
-                                                       if (herePoints.ContainsKey(player)) {
-                                                               herePoints[player].transform.localPosition = v;
+                                                       if (herePoints.ContainsKey(player.PlayerId)) {
+                                                               herePoints[player.PlayerId].transform.localPosition = v;
                                                                continue;
                                                        }
                                                        var herePoint = UnityEngine.Object.Instantiate(__instance.HerePoint, __instance.HerePoint.transform.parent, true);
@@ -84,7 +84,7 @@ namespace TheOtherRoles.Patches {
                                                        player.CurrentOutfit.ColorId = 6;
                                                        player.SetPlayerMaterialColors(herePoint);
                                                        player.CurrentOutfit.ColorId = colorId;
-                                                       herePoints.Add(player, herePoint);
+                                                       herePoints.Add(player.PlayerId, herePoint);
                                                }
                                        } else {
                                                foreach (var s in herePoints) {
@@ -97,7 +97,7 @@ namespace TheOtherRoles.Patches {
 
                        // Show location of all players on the map for ghosts!
                        if (PlayerControl.LocalPlayer.Data.IsDead && (!PlayerControl.LocalPlayer.Data.Role.IsImpostor || CustomOptionHolder.deadImpsBlockSabotage.getBool())) {
-                               foreach (PlayerControl player in CachedPlayer.AllPlayers) {
+                               foreach (PlayerControl player in PlayerControl.AllPlayerControls) {
                     if (player == PlayerControl.LocalPlayer)
                         continue;
                     var alpha = player.Data.IsDead ? 0.25f : 1f;
@@ -105,18 +105,29 @@ namespace TheOtherRoles.Patches {
                     v /= MapUtilities.CachedShipStatus.MapScale;
                     v.x *= Mathf.Sign(MapUtilities.CachedShipStatus.transform.localScale.x);
                     v.z = -2.1f;
-                    if (herePoints.ContainsKey(player)) {
-                        herePoints[player].transform.localPosition = v;
-                                               herePoints[player].color = herePoints[player].color.SetAlpha(alpha);
+                    if (herePoints.TryGetValue(player.PlayerId, out _)) {
+                        herePoints[player.PlayerId].transform.localPosition = v;
+                                               herePoints[player.PlayerId].color = herePoints[player.PlayerId].color.SetAlpha(alpha);
                         continue;
                     }
-                    var herePoint = UnityEngine.Object.Instantiate(__instance.HerePoint, __instance.HerePoint.transform.parent, true);
+
+                    string pointName = $"TOR HerePoint {player.PlayerId}";
+                    var doublePoint = GameObject.Find(pointName);
+                                       if (doublePoint != null) {
+                                               doublePoint.Destroy();
+                                       }
+
+                                       var herePoint = UnityEngine.Object.Instantiate(__instance.HerePoint, __instance.HerePoint.transform.parent, true);
+                                       
+                                       herePoint.name = pointName;
                     herePoint.transform.localPosition = v;
                     herePoint.enabled = true;
+
+
                                        
                     int colorId = player.CurrentOutfit.ColorId;
                     player.SetPlayerMaterialColors(herePoint);
-                    herePoints.Add(player, herePoint);
+                    herePoints.Add(player.PlayerId, herePoint);
                 }
                        }
                        foreach (var vent in MapUtilities.CachedShipStatus.AllVents) {
index e73bbf3de3c41f3bd11dad0c78df55290b4434f7..da0f91b5cba80397e1cc1882bf57faf946f7c0f4 100644 (file)
@@ -6,7 +6,7 @@ using static TheOtherRoles.TheOtherRoles;
 using static TheOtherRoles.TORMapOptions;
 using TheOtherRoles.Objects;
 using System;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using UnityEngine;
 using Innersloth.Assets;
@@ -123,7 +123,7 @@ namespace TheOtherRoles.Patches {
                             exiled = potentialExiled.ToArray().FirstOrDefault(v => v.PlayerId == tiebreakerVote);
                             tie = false;
 
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetTiebreak, Hazel.SendOption.Reliable, -1);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetTiebreak, Hazel.SendOption.Reliable, -1);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
                             RPCProcedure.setTiebreak();
                         }
@@ -141,8 +141,8 @@ namespace TheOtherRoles.Patches {
             public static bool Prefix(MeetingHud __instance, NetworkedPlayerInfo voterPlayer, int index, Transform parent) {
                 var spriteRenderer = UnityEngine.Object.Instantiate<SpriteRenderer>(__instance.PlayerVotePrefab);
                 var showVoteColors = !GameManager.Instance.LogicOptions.GetAnonymousVotes() ||
-                                      (CachedPlayer.LocalPlayer.Data.IsDead && TORMapOptions.ghostsSeeVotes) || 
-                                      (Mayor.mayor != null && Mayor.mayor == CachedPlayer.LocalPlayer.PlayerControl && Mayor.canSeeVoteColors && TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data).Item1 >= Mayor.tasksNeededToSeeVoteColors);
+                                      (PlayerControl.LocalPlayer.Data.IsDead && TORMapOptions.ghostsSeeVotes) || 
+                                      (Mayor.mayor != null && Mayor.mayor == PlayerControl.LocalPlayer && Mayor.canSeeVoteColors && TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data).Item1 >= Mayor.tasksNeededToSeeVoteColors);
                 if (showVoteColors)
                 {
                     PlayerMaterial.SetColors(voterPlayer.DefaultOutfit.ColorId, spriteRenderer);
@@ -300,7 +300,7 @@ namespace TheOtherRoles.Patches {
                 if (swapperButtonList[A] != null) swapperButtonList[A].OnClick.RemoveAllListeners();  // Swap buttons can't be clicked / changed anymore
             }
             if (firstPlayer != null && secondPlayer != null) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SwapperSwap, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SwapperSwap, Hazel.SendOption.Reliable, -1);
                 writer.Write((byte)firstPlayer.TargetPlayerId);
                 writer.Write((byte)secondPlayer.TargetPlayerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -325,7 +325,7 @@ namespace TheOtherRoles.Patches {
             
 
             // Only for the swapper: Reset all the buttons and charges value to their original state.
-            if (CachedPlayer.LocalPlayer.PlayerControl != Swapper.swapper) return;
+            if (PlayerControl.LocalPlayer != Swapper.swapper) return;
 
 
             // check if dying player was a selected player (but not confirmed yet)
@@ -365,7 +365,7 @@ namespace TheOtherRoles.Patches {
 
             Mayor.voteTwice = !Mayor.voteTwice;
 
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.MayorSetVoteTwice, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.MayorSetVoteTwice, Hazel.SendOption.Reliable, -1);
             writer.Write(Mayor.voteTwice);
             AmongUsClient.Instance.FinishRpcImmediately(writer);
 
@@ -404,7 +404,7 @@ namespace TheOtherRoles.Patches {
             guesserUIExitButton.OnClick.AddListener((System.Action)(() => {
                 __instance.playerStates.ToList().ForEach(x => {
                     x.gameObject.SetActive(true);
-                    if (CachedPlayer.LocalPlayer.Data.IsDead && x.transform.FindChild("ShootButton") != null) UnityEngine.Object.Destroy(x.transform.FindChild("ShootButton").gameObject);
+                    if (PlayerControl.LocalPlayer.Data.IsDead && x.transform.FindChild("ShootButton") != null) UnityEngine.Object.Destroy(x.transform.FindChild("ShootButton").gameObject);
                 });
                 UnityEngine.Object.Destroy(container.gameObject);
             }));
@@ -413,10 +413,10 @@ namespace TheOtherRoles.Patches {
             Transform selectedButton = null;
 
             foreach (RoleInfo roleInfo in RoleInfo.allRoleInfos) {
-                RoleId guesserRole = (Guesser.niceGuesser != null && CachedPlayer.LocalPlayer.PlayerId == Guesser.niceGuesser.PlayerId) ? RoleId.NiceGuesser :  RoleId.EvilGuesser;
+                RoleId guesserRole = (Guesser.niceGuesser != null && PlayerControl.LocalPlayer.PlayerId == Guesser.niceGuesser.PlayerId) ? RoleId.NiceGuesser :  RoleId.EvilGuesser;
                 if (roleInfo.isModifier || roleInfo.roleId == guesserRole || (!HandleGuesser.evilGuesserCanGuessSpy && guesserRole == RoleId.EvilGuesser && roleInfo.roleId == RoleId.Spy && !HandleGuesser.isGuesserGm)) continue; // Not guessable roles & modifier
                 if (HandleGuesser.isGuesserGm && (roleInfo.roleId == RoleId.NiceGuesser || roleInfo.roleId == RoleId.EvilGuesser)) continue; // remove Guesser for guesser game mode
-                if (HandleGuesser.isGuesserGm && CachedPlayer.LocalPlayer.PlayerControl.Data.Role.IsImpostor && !HandleGuesser.evilGuesserCanGuessSpy && roleInfo.roleId == RoleId.Spy) continue;
+                if (HandleGuesser.isGuesserGm && PlayerControl.LocalPlayer.Data.Role.IsImpostor && !HandleGuesser.evilGuesserCanGuessSpy && roleInfo.roleId == RoleId.Spy) continue;
                 // remove all roles that cannot spawn due to the settings from the ui.
                 RoleManagerSelectRolesPatch.RoleAssignmentData roleData = RoleManagerSelectRolesPatch.getRoleAssignmentData();
                 if (roleData.neutralSettings.ContainsKey((byte)roleInfo.roleId) && roleData.neutralSettings[(byte)roleInfo.roleId] == 0) continue;
@@ -452,19 +452,19 @@ namespace TheOtherRoles.Patches {
                 int copiedIndex = i;
 
                 button.GetComponent<PassiveButton>().OnClick.RemoveAllListeners();
-                if (!CachedPlayer.LocalPlayer.Data.IsDead && !Helpers.playerById((byte)__instance.playerStates[buttonTarget].TargetPlayerId).Data.IsDead) button.GetComponent<PassiveButton>().OnClick.AddListener((System.Action)(() => {
+                if (!PlayerControl.LocalPlayer.Data.IsDead && !Helpers.playerById((byte)__instance.playerStates[buttonTarget].TargetPlayerId).Data.IsDead) button.GetComponent<PassiveButton>().OnClick.AddListener((System.Action)(() => {
                     if (selectedButton != button) {
                         selectedButton = button;
                         buttons.ForEach(x => x.GetComponent<SpriteRenderer>().color = x == selectedButton ? Color.red : Color.white);
                     } else {
                         PlayerControl focusedTarget = Helpers.playerById((byte)__instance.playerStates[buttonTarget].TargetPlayerId);
-                        if (!(__instance.state == MeetingHud.VoteStates.Voted || __instance.state == MeetingHud.VoteStates.NotVoted) || focusedTarget == null || HandleGuesser.remainingShots(CachedPlayer.LocalPlayer.PlayerId) <= 0 ) return;
+                        if (!(__instance.state == MeetingHud.VoteStates.Voted || __instance.state == MeetingHud.VoteStates.NotVoted) || focusedTarget == null || HandleGuesser.remainingShots(PlayerControl.LocalPlayer.PlayerId) <= 0 ) return;
 
                         if (!HandleGuesser.killsThroughShield && focusedTarget == Medic.shielded) { // Depending on the options, shooting the shielded player will not allow the guess, notifiy everyone about the kill attempt and close the window
                             __instance.playerStates.ToList().ForEach(x => x.gameObject.SetActive(true)); 
                             UnityEngine.Object.Destroy(container.gameObject);
 
-                            MessageWriter murderAttemptWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShieldedMurderAttempt, Hazel.SendOption.Reliable, -1);
+                            MessageWriter murderAttemptWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShieldedMurderAttempt, Hazel.SendOption.Reliable, -1);
                             AmongUsClient.Instance.FinishRpcImmediately(murderAttemptWriter);
                             RPCProcedure.shieldedMurderAttempt();
                             SoundEffectsManager.play("fail");
@@ -474,24 +474,24 @@ namespace TheOtherRoles.Patches {
                         var mainRoleInfo = RoleInfo.getRoleInfoForPlayer(focusedTarget, false).FirstOrDefault();
                         if (mainRoleInfo == null) return;
 
-                        PlayerControl dyingTarget = (mainRoleInfo == roleInfo) ? focusedTarget : CachedPlayer.LocalPlayer.PlayerControl;
+                        PlayerControl dyingTarget = (mainRoleInfo == roleInfo) ? focusedTarget : PlayerControl.LocalPlayer;
 
                         // Reset the GUI
                         __instance.playerStates.ToList().ForEach(x => x.gameObject.SetActive(true));
                         UnityEngine.Object.Destroy(container.gameObject);
-                        if (HandleGuesser.hasMultipleShotsPerMeeting && HandleGuesser.remainingShots(CachedPlayer.LocalPlayer.PlayerId) > 1 && dyingTarget != CachedPlayer.LocalPlayer.PlayerControl)
+                        if (HandleGuesser.hasMultipleShotsPerMeeting && HandleGuesser.remainingShots(PlayerControl.LocalPlayer.PlayerId) > 1 && dyingTarget != PlayerControl.LocalPlayer)
                             __instance.playerStates.ToList().ForEach(x => { if (x.TargetPlayerId == dyingTarget.PlayerId && x.transform.FindChild("ShootButton") != null) UnityEngine.Object.Destroy(x.transform.FindChild("ShootButton").gameObject); });
                         else
                             __instance.playerStates.ToList().ForEach(x => { if (x.transform.FindChild("ShootButton") != null) UnityEngine.Object.Destroy(x.transform.FindChild("ShootButton").gameObject); });
 
                         // Shoot player and send chat info if activated
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.GuesserShoot, Hazel.SendOption.Reliable, -1);
-                        writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.GuesserShoot, Hazel.SendOption.Reliable, -1);
+                        writer.Write(PlayerControl.LocalPlayer.PlayerId);
                         writer.Write(dyingTarget.PlayerId);
                         writer.Write(focusedTarget.PlayerId);
                         writer.Write((byte)roleInfo.roleId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
-                        RPCProcedure.guesserShoot(CachedPlayer.LocalPlayer.PlayerId, dyingTarget.PlayerId, focusedTarget.PlayerId, (byte)roleInfo.roleId);
+                        RPCProcedure.guesserShoot(PlayerControl.LocalPlayer.PlayerId, dyingTarget.PlayerId, focusedTarget.PlayerId, (byte)roleInfo.roleId);
                     }
                 }));
 
@@ -503,14 +503,14 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(PlayerVoteArea), nameof(PlayerVoteArea.Select))]
         class PlayerVoteAreaSelectPatch {
             static bool Prefix(MeetingHud __instance) {
-                return !(CachedPlayer.LocalPlayer != null && HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId) && guesserUI != null);
+                return !(PlayerControl.LocalPlayer != null && HandleGuesser.isGuesser(PlayerControl.LocalPlayer.PlayerId) && guesserUI != null);
             }
         }
 
         static void populateButtonsPostfix(MeetingHud __instance) {
             // Add Swapper Buttons
-            bool addSwapperButtons = Swapper.swapper != null && CachedPlayer.LocalPlayer.PlayerControl == Swapper.swapper && !Swapper.swapper.Data.IsDead;
-            bool addMayorButton = Mayor.mayor != null && CachedPlayer.LocalPlayer.PlayerControl == Mayor.mayor && !Mayor.mayor.Data.IsDead && Mayor.mayorChooseSingleVote > 0;
+            bool addSwapperButtons = Swapper.swapper != null && PlayerControl.LocalPlayer == Swapper.swapper && !Swapper.swapper.Data.IsDead;
+            bool addMayorButton = Mayor.mayor != null && PlayerControl.LocalPlayer == Mayor.mayor && !Mayor.mayor.Data.IsDead && Mayor.mayorChooseSingleVote > 0;
             if (addSwapperButtons) {
                 selections = new bool[__instance.playerStates.Length];
                 renderers = new SpriteRenderer[__instance.playerStates.Length];
@@ -525,7 +525,7 @@ namespace TheOtherRoles.Patches {
                     checkbox.transform.SetParent(playerVoteArea.transform);
                     checkbox.transform.position = template.transform.position;
                     checkbox.transform.localPosition = new Vector3(-0.95f, 0.03f, -1.3f);
-                    if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId)) checkbox.transform.localPosition = new Vector3(-0.5f, 0.03f, -1.3f);
+                    if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(PlayerControl.LocalPlayer.PlayerId)) checkbox.transform.localPosition = new Vector3(-0.5f, 0.03f, -1.3f);
                     SpriteRenderer renderer = checkbox.GetComponent<SpriteRenderer>();
                     renderer.sprite = Swapper.getCheckSprite();
                     renderer.color = Color.red;
@@ -579,7 +579,7 @@ namespace TheOtherRoles.Patches {
                 }
                 PassiveButton passiveButton = meetingExtraButton.GetComponent<PassiveButton>();
                 passiveButton.OnClick.RemoveAllListeners();
-                if (!CachedPlayer.LocalPlayer.Data.IsDead) {
+                if (!PlayerControl.LocalPlayer.Data.IsDead) {
                     if (addSwapperButtons)
                         passiveButton.OnClick.AddListener((Action)(() => swapperConfirm(__instance)));
                     else if (addMayorButton)
@@ -594,7 +594,7 @@ namespace TheOtherRoles.Patches {
             }
 
 
-            bool isGuesser = HandleGuesser.isGuesser(CachedPlayer.LocalPlayer.PlayerId);
+            bool isGuesser = HandleGuesser.isGuesser(PlayerControl.LocalPlayer.PlayerId);
 
             // Add overlay for spelled players
             if (Witch.witch != null && Witch.futureSpelled != null) {
@@ -604,20 +604,22 @@ namespace TheOtherRoles.Patches {
                         rend.transform.SetParent(pva.transform);
                         rend.gameObject.layer = pva.Megaphone.gameObject.layer;
                         rend.transform.localPosition = new Vector3(-0.5f, -0.03f, -1f);
-                        if (CachedPlayer.LocalPlayer.PlayerControl == Swapper.swapper && isGuesser) rend.transform.localPosition = new Vector3(-0.725f, -0.15f, -1f);
+                        if (PlayerControl.LocalPlayer == Swapper.swapper && isGuesser) rend.transform.localPosition = new Vector3(-0.725f, -0.15f, -1f);
                         rend.sprite = Witch.getSpelledOverlaySprite();
                     }
                 }
             }
 
             // Add Guesser Buttons
-            int remainingShots = HandleGuesser.remainingShots(CachedPlayer.LocalPlayer.PlayerId);
+            int remainingShots = HandleGuesser.remainingShots(PlayerControl.LocalPlayer.PlayerId);
+            var (playerCompleted, playerTotal) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
 
-            if (isGuesser && !CachedPlayer.LocalPlayer.Data.IsDead && remainingShots > 0) {
+            if (isGuesser && !PlayerControl.LocalPlayer.Data.IsDead && remainingShots > 0) {
                 for (int i = 0; i < __instance.playerStates.Length; i++) {
                     PlayerVoteArea playerVoteArea = __instance.playerStates[i];
-                    if (playerVoteArea.AmDead || playerVoteArea.TargetPlayerId == CachedPlayer.LocalPlayer.PlayerId) continue;
-                    if (CachedPlayer.LocalPlayer != null && CachedPlayer.LocalPlayer.PlayerControl == Eraser.eraser && Eraser.alreadyErased.Contains(playerVoteArea.TargetPlayerId)) continue;
+                    if (playerVoteArea.AmDead || playerVoteArea.TargetPlayerId == PlayerControl.LocalPlayer.PlayerId) continue;
+                    if (PlayerControl.LocalPlayer != null && PlayerControl.LocalPlayer == Eraser.eraser && Eraser.alreadyErased.Contains(playerVoteArea.TargetPlayerId)) continue;
+                    if (PlayerControl.LocalPlayer != null && !Helpers.isEvil(PlayerControl.LocalPlayer) && playerCompleted < HandleGuesser.tasksToUnlock) continue;
 
                     GameObject template = playerVoteArea.Buttons.transform.Find("CancelButton").gameObject;
                     GameObject targetBox = UnityEngine.Object.Instantiate(template, playerVoteArea.transform);
@@ -661,8 +663,8 @@ namespace TheOtherRoles.Patches {
                     roomId = (byte)roomTracker.LastRoom?.RoomId;
                 }
                 if (Snitch.snitch != null && roomTracker != null) {
-                    MessageWriter roomWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareRoom, Hazel.SendOption.Reliable, -1);
-                    roomWriter.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter roomWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareRoom, Hazel.SendOption.Reliable, -1);
+                    roomWriter.Write(PlayerControl.LocalPlayer.PlayerId);
                     roomWriter.Write(roomId);
                     AmongUsClient.Instance.FinishRpcImmediately(roomWriter);
                 }
@@ -670,11 +672,11 @@ namespace TheOtherRoles.Patches {
                 // Resett Bait list
                 Bait.active = new Dictionary<DeadPlayer, float>();
                 // Save AntiTeleport position, if the player is able to move (i.e. not on a ladder or a gap thingy)
-                if (CachedPlayer.LocalPlayer.PlayerPhysics.enabled && (CachedPlayer.LocalPlayer.PlayerControl.moveable || CachedPlayer.LocalPlayer.PlayerControl.inVent
+                if (PlayerControl.LocalPlayer.MyPhysics.enabled && (PlayerControl.LocalPlayer.moveable || PlayerControl.LocalPlayer.inVent
                     || HudManagerStartPatch.hackerVitalsButton.isEffectActive || HudManagerStartPatch.hackerAdminTableButton.isEffectActive || HudManagerStartPatch.securityGuardCamButton.isEffectActive
-                    || Portal.isTeleporting && Portal.teleportedPlayers.Last().playerId == CachedPlayer.LocalPlayer.PlayerId)) {
-                    if (!CachedPlayer.LocalPlayer.PlayerControl.inMovingPlat)
-                        AntiTeleport.position = CachedPlayer.LocalPlayer.transform.position;
+                    || Portal.isTeleporting && Portal.teleportedPlayers.Last().playerId == PlayerControl.LocalPlayer.PlayerId)) {
+                    if (!PlayerControl.LocalPlayer.inMovingPlat)
+                        AntiTeleport.position = PlayerControl.LocalPlayer.transform.position;
                 }
 
                 // Medium meeting start time
@@ -691,7 +693,7 @@ namespace TheOtherRoles.Patches {
 
 
                 // Add Portal info into Portalmaker Chat:
-                if (Portalmaker.portalmaker != null && (CachedPlayer.LocalPlayer.PlayerControl == Portalmaker.portalmaker || Helpers.shouldShowGhostInfo()) && !Portalmaker.portalmaker.Data.IsDead) {
+                if (Portalmaker.portalmaker != null && (PlayerControl.LocalPlayer == Portalmaker.portalmaker || Helpers.shouldShowGhostInfo()) && !Portalmaker.portalmaker.Data.IsDead) {
                     if (Portal.teleportedPlayers.Count > 0) {
                         string msg = "Portal Log:\n";
                         foreach (var entry in Portal.teleportedPlayers) {
@@ -704,7 +706,7 @@ namespace TheOtherRoles.Patches {
                 }
 
                 // Add trapped Info into Trapper chat
-                if (Trapper.trapper != null && (CachedPlayer.LocalPlayer.PlayerControl == Trapper.trapper || Helpers.shouldShowGhostInfo()) && !Trapper.trapper.Data.IsDead) {
+                if (Trapper.trapper != null && (PlayerControl.LocalPlayer == Trapper.trapper || Helpers.shouldShowGhostInfo()) && !Trapper.trapper.Data.IsDead) {
                     if (Trap.traps.Any(x => x.revealed))
                         FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(Trapper.trapper, "Trap Logs:");
                     foreach (Trap trap in Trap.traps) {
@@ -726,14 +728,14 @@ namespace TheOtherRoles.Patches {
                 // Add Snitch info
                 string output = "";
 
-                if (Snitch.snitch != null && Snitch.mode != Snitch.Mode.Map && (CachedPlayer.LocalPlayer.PlayerControl == Snitch.snitch || Helpers.shouldShowGhostInfo()) && !Snitch.snitch.Data.IsDead) {
+                if (Snitch.snitch != null && Snitch.mode != Snitch.Mode.Map && (PlayerControl.LocalPlayer == Snitch.snitch || Helpers.shouldShowGhostInfo()) && !Snitch.snitch.Data.IsDead) {
                     var (playerCompleted, playerTotal) = TasksHandler.taskInfo(Snitch.snitch.Data);
                     int numberOfTasks = playerTotal - playerCompleted;
                     if (numberOfTasks == 0) {
                         output = $"Bad alive roles in game: \n \n";
                         FastDestroyableSingleton<HudManager>.Instance.StartCoroutine(Effects.Lerp(0.4f, new Action<float>((x) => {
                             if (x == 1f) {
-                                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                                     if (Snitch.targets == Snitch.Targets.Killers && !Helpers.isKiller(p)) continue;
                                     if (Snitch.targets == Snitch.Targets.EvilPlayers && !Helpers.isEvil(p)) continue;
                                     if (!Snitch.playerRoomMap.ContainsKey(p.PlayerId)) continue;
@@ -751,7 +753,7 @@ namespace TheOtherRoles.Patches {
                     }
                 }
 
-                if (CachedPlayer.LocalPlayer.Data.IsDead && output != "") FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(CachedPlayer.LocalPlayer, $"{output}");
+                if (PlayerControl.LocalPlayer.Data.IsDead && output != "") FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(PlayerControl.LocalPlayer, $"{output}");
 
                 Trapper.playersOnMap = new List<PlayerControl>();
                 Snitch.playerRoomMap = new Dictionary<byte, byte>();
index ace0e5f25ee6f6b2267d99be04a27419c8d4f7fd..790f27abc0af2509e6cca9a6d31a0018ecdc65d5 100644 (file)
@@ -6,7 +6,7 @@ using System.Linq;
 using static TheOtherRoles.TheOtherRoles;
 using static TheOtherRoles.GameHistory;
 using TheOtherRoles.Objects;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using UnityEngine;
 using TheOtherRoles.CustomGameModes;
@@ -25,7 +25,7 @@ namespace TheOtherRoles.Patches {
             PlayerControl result = null;
             float num = AmongUs.GameOptions.GameOptionsData.KillDistances[Mathf.Clamp(GameOptionsManager.Instance.currentNormalGameOptions.KillDistance, 0, 2)];
             if (!MapUtilities.CachedShipStatus) return result;
-            if (targetingPlayer == null) targetingPlayer = CachedPlayer.LocalPlayer.PlayerControl;
+            if (targetingPlayer == null) targetingPlayer = PlayerControl.LocalPlayer;
             if (targetingPlayer.Data.IsDead) return result;
 
             Vector2 truePosition = targetingPlayer.GetTruePosition();
@@ -63,7 +63,7 @@ namespace TheOtherRoles.Patches {
         // Update functions
 
         static void setBasePlayerOutlines() {
-            foreach (PlayerControl target in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl target in PlayerControl.AllPlayerControls) {
                 if (target == null || target.cosmetics?.currentBodySprite?.BodySprite == null) continue;
 
                 bool isMorphedMorphling = target == Morphling.morphling && Morphling.morphTarget != null && Morphling.morphTimer > 0f;
@@ -77,22 +77,27 @@ namespace TheOtherRoles.Patches {
                     color = Color.blue;
                 }
 
+                if (PlayerControl.LocalPlayer.Data.IsDead && Armored.armored != null && target == Armored.armored && !Armored.isBrokenArmor && !hasVisibleShield) {
+                    hasVisibleShield = true;
+                    color = Color.yellow;
+                }
+
                 if (hasVisibleShield) {
                 target.cosmetics.currentBodySprite.BodySprite.material.SetFloat("_Outline", 1f);
                 target.cosmetics.currentBodySprite.BodySprite.material.SetColor("_OutlineColor", color);
                 }
                 else {
                     target.cosmetics.currentBodySprite.BodySprite.material.SetFloat("_Outline", 0f);
-                }
+                }                
             }
         }
 
         static void setPetVisibility() {
-            bool localalive = !CachedPlayer.LocalPlayer.Data.IsDead;
-            foreach (var player in CachedPlayer.AllPlayers)
+            bool localalive = PlayerControl.LocalPlayer.Data.IsDead;
+            foreach (var player in PlayerControl.AllPlayerControls)
             {
                 bool playeralive = !player.Data.IsDead;
-                player.PlayerControl.cosmetics.SetPetVisible((localalive && playeralive) || !localalive);
+                player.cosmetics.SetPetVisible((localalive && playeralive) || !localalive);
             }
         }
 
@@ -103,22 +108,22 @@ namespace TheOtherRoles.Patches {
                     var next = localPlayerPositions[0];
                     if (next.Item2 == true) {
                         // Exit current vent if necessary
-                        if (CachedPlayer.LocalPlayer.PlayerControl.inVent) {
+                        if (PlayerControl.LocalPlayer.inVent) {
                             foreach (Vent vent in MapUtilities.CachedShipStatus.AllVents) {
                                 bool canUse;
                                 bool couldUse;
-                                vent.CanUse(CachedPlayer.LocalPlayer.Data, out canUse, out couldUse);
+                                vent.CanUse(PlayerControl.LocalPlayer.Data, out canUse, out couldUse);
                                 if (canUse) {
-                                    CachedPlayer.LocalPlayer.PlayerPhysics.RpcExitVent(vent.Id);
+                                    PlayerControl.LocalPlayer.MyPhysics.RpcExitVent(vent.Id);
                                     vent.SetButtons(false);
                                 }
                             }
                         }
                         // Set position
-                        CachedPlayer.LocalPlayer.transform.position = next.Item1;
+                        PlayerControl.LocalPlayer.transform.position = next.Item1;
                     }
                     else if (localPlayerPositions.Any(x => x.Item2 == true)) {
-                        CachedPlayer.LocalPlayer.transform.position = next.Item1;
+                        PlayerControl.LocalPlayer.transform.position = next.Item1;
                     }
                     if (SubmergedCompatibility.IsSubmerged) {
                         SubmergedCompatibility.ChangeFloor(next.Item1.y > -7);
@@ -130,43 +135,43 @@ namespace TheOtherRoles.Patches {
                 }
                 else {
                     TimeMaster.isRewinding = false;
-                    CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                    PlayerControl.LocalPlayer.moveable = true;
                 }
             }
             else {
                 while (localPlayerPositions.Count >= Mathf.Round(TimeMaster.rewindTime / Time.fixedDeltaTime)) localPlayerPositions.RemoveAt(localPlayerPositions.Count - 1);
-                localPlayerPositions.Insert(0, new Tuple<Vector3, bool>(CachedPlayer.LocalPlayer.transform.position, CachedPlayer.LocalPlayer.PlayerControl.CanMove)); // CanMove = CanMove
+                localPlayerPositions.Insert(0, new Tuple<Vector3, bool>(PlayerControl.LocalPlayer.transform.position, PlayerControl.LocalPlayer.CanMove)); // CanMove = CanMove
             }
         }
 
         static void medicSetTarget() {
-            if (Medic.medic == null || Medic.medic != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Medic.medic == null || Medic.medic != PlayerControl.LocalPlayer) return;
             Medic.currentTarget = setTarget();
             if (!Medic.usedShield) setPlayerOutline(Medic.currentTarget, Medic.shieldedColor);
         }
 
         static void shifterSetTarget() {
-            if (Shifter.shifter == null || Shifter.shifter != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Shifter.shifter == null || Shifter.shifter != PlayerControl.LocalPlayer) return;
             Shifter.currentTarget = setTarget();
             if (Shifter.futureShift == null) setPlayerOutline(Shifter.currentTarget, Color.yellow);
         }
 
 
         static void morphlingSetTarget() {
-            if (Morphling.morphling == null || Morphling.morphling != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Morphling.morphling == null || Morphling.morphling != PlayerControl.LocalPlayer) return;
             Morphling.currentTarget = setTarget();
             setPlayerOutline(Morphling.currentTarget, Morphling.color);
         }
 
         static void sheriffSetTarget() {
-            if (Sheriff.sheriff == null || Sheriff.sheriff != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Sheriff.sheriff == null || Sheriff.sheriff != PlayerControl.LocalPlayer) return;
             Sheriff.currentTarget = setTarget();
             setPlayerOutline(Sheriff.currentTarget, Sheriff.color);
         }
 
         static void deputySetTarget()
         {
-            if (Deputy.deputy == null || Deputy.deputy != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Deputy.deputy == null || Deputy.deputy != PlayerControl.LocalPlayer) return;
             Deputy.currentTarget = setTarget();
             setPlayerOutline(Deputy.currentTarget, Deputy.color);
         }
@@ -174,30 +179,30 @@ namespace TheOtherRoles.Patches {
         public static void deputyCheckPromotion(bool isMeeting=false)
         {
             // If LocalPlayer is Deputy, the Sheriff is disconnected and Deputy promotion is enabled, then trigger promotion
-            if (Deputy.deputy == null || Deputy.deputy != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Deputy.deputy == null || Deputy.deputy != PlayerControl.LocalPlayer) return;
             if (Deputy.promotesToSheriff == 0 || Deputy.deputy.Data.IsDead == true || Deputy.promotesToSheriff == 2 && !isMeeting) return;
             if (Sheriff.sheriff == null || Sheriff.sheriff?.Data?.Disconnected == true || Sheriff.sheriff.Data.IsDead)
             {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.DeputyPromotes, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.DeputyPromotes, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.deputyPromotes();
             }
         }
 
         static void trackerSetTarget() {
-            if (Tracker.tracker == null || Tracker.tracker != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Tracker.tracker == null || Tracker.tracker != PlayerControl.LocalPlayer) return;
             Tracker.currentTarget = setTarget();
             if (!Tracker.usedTracker) setPlayerOutline(Tracker.currentTarget, Tracker.color);
         }
 
         static void detectiveUpdateFootPrints() {
-            if (Detective.detective == null || Detective.detective != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Detective.detective == null || Detective.detective != PlayerControl.LocalPlayer) return;
 
             Detective.timer -= Time.fixedDeltaTime;
             if (Detective.timer <= 0f) {
                 Detective.timer = Detective.footprintIntervall;
-                foreach (PlayerControl player in CachedPlayer.AllPlayers) {
-                    if (player != null && player != CachedPlayer.LocalPlayer.PlayerControl && !player.Data.IsDead && !player.inVent) 
+                foreach (PlayerControl player in PlayerControl.AllPlayerControls) {
+                    if (player != null && player != PlayerControl.LocalPlayer && !player.Data.IsDead && !player.inVent) 
                     {
                         FootprintHolder.Instance.MakeFootprint(player);
                     }
@@ -206,7 +211,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void vampireSetTarget() {
-            if (Vampire.vampire == null || Vampire.vampire != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Vampire.vampire == null || Vampire.vampire != PlayerControl.LocalPlayer) return;
 
             PlayerControl target = null;
             if (Spy.spy != null || Sidekick.wasSpy || Jackal.wasSpy) {
@@ -235,7 +240,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void jackalSetTarget() {
-            if (Jackal.jackal == null || Jackal.jackal != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Jackal.jackal == null || Jackal.jackal != PlayerControl.LocalPlayer) return;
             var untargetablePlayers = new List<PlayerControl>();
             if (Jackal.canCreateSidekickFromImpostor) {
                 // Only exclude sidekick from beeing targeted if the jackal can create sidekicks from impostors
@@ -247,7 +252,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void sidekickSetTarget() {
-            if (Sidekick.sidekick == null || Sidekick.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Sidekick.sidekick == null || Sidekick.sidekick != PlayerControl.LocalPlayer) return;
             var untargetablePlayers = new List<PlayerControl>();
             if (Jackal.jackal != null) untargetablePlayers.Add(Jackal.jackal);
             if (Mini.mini != null && !Mini.isGrownUp()) untargetablePlayers.Add(Mini.mini); // Exclude Sidekick from targeting the Mini unless it has grown up
@@ -257,17 +262,17 @@ namespace TheOtherRoles.Patches {
 
         static void sidekickCheckPromotion() {
             // If LocalPlayer is Sidekick, the Jackal is disconnected and Sidekick promotion is enabled, then trigger promotion
-            if (Sidekick.sidekick == null || Sidekick.sidekick != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Sidekick.sidekick == null || Sidekick.sidekick != PlayerControl.LocalPlayer) return;
             if (Sidekick.sidekick.Data.IsDead == true || !Sidekick.promotesToJackal) return;
             if (Jackal.jackal == null || Jackal.jackal?.Data?.Disconnected == true) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.sidekickPromotes();
             }
         }
 
         static void eraserSetTarget() {
-            if (Eraser.eraser == null || Eraser.eraser != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Eraser.eraser == null || Eraser.eraser != PlayerControl.LocalPlayer) return;
 
             List<PlayerControl> untargetables = new List<PlayerControl>();
             if (Spy.spy != null) untargetables.Add(Spy.spy);
@@ -279,17 +284,17 @@ namespace TheOtherRoles.Patches {
 
         static void deputyUpdate()
         {
-            if (CachedPlayer.LocalPlayer.PlayerControl == null || !Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId)) return;
+            if (PlayerControl.LocalPlayer == null || !Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId)) return;
             
-            if (Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] <= 0)
+            if (Deputy.handcuffedKnows[PlayerControl.LocalPlayer.PlayerId] <= 0)
             {
-                Deputy.handcuffedKnows.Remove(CachedPlayer.LocalPlayer.PlayerId);
+                Deputy.handcuffedKnows.Remove(PlayerControl.LocalPlayer.PlayerId);
                 // Resets the buttons
                 Deputy.setHandcuffedKnows(false);
                 
                 // Ghost info
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                writer.Write(PlayerControl.LocalPlayer.PlayerId);
                 writer.Write((byte)RPCProcedure.GhostInfoTypes.HandcuffOver);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
             }
@@ -297,8 +302,8 @@ namespace TheOtherRoles.Patches {
         }
 
         static void engineerUpdate() {
-            bool jackalHighlight = Engineer.highlightForTeamJackal && (CachedPlayer.LocalPlayer.PlayerControl == Jackal.jackal || CachedPlayer.LocalPlayer.PlayerControl == Sidekick.sidekick);
-            bool impostorHighlight = Engineer.highlightForImpostors && CachedPlayer.LocalPlayer.Data.Role.IsImpostor;
+            bool jackalHighlight = Engineer.highlightForTeamJackal && (PlayerControl.LocalPlayer == Jackal.jackal || PlayerControl.LocalPlayer == Sidekick.sidekick);
+            bool impostorHighlight = Engineer.highlightForImpostors && PlayerControl.LocalPlayer.Data.Role.IsImpostor;
             if ((jackalHighlight || impostorHighlight) && MapUtilities.CachedShipStatus?.AllVents != null) {
                 foreach (Vent vent in MapUtilities.CachedShipStatus.AllVents) {
                     try {
@@ -318,7 +323,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void impostorSetTarget() {
-            if (!CachedPlayer.LocalPlayer.Data.Role.IsImpostor ||!CachedPlayer.LocalPlayer.PlayerControl.CanMove || CachedPlayer.LocalPlayer.Data.IsDead) { // !isImpostor || !canMove || isDead
+            if (!PlayerControl.LocalPlayer.Data.Role.IsImpostor ||!PlayerControl.LocalPlayer.CanMove || PlayerControl.LocalPlayer.Data.IsDead) { // !isImpostor || !canMove || isDead
                 FastDestroyableSingleton<HudManager>.Instance.KillButton.SetTarget(null);
                 return;
             }
@@ -340,7 +345,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void warlockSetTarget() {
-            if (Warlock.warlock == null || Warlock.warlock != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Warlock.warlock == null || Warlock.warlock != PlayerControl.LocalPlayer) return;
             if (Warlock.curseVictim != null && (Warlock.curseVictim.Data.Disconnected || Warlock.curseVictim.Data.IsDead)) {
                 // If the cursed victim is disconnected or dead reset the curse so a new curse can be applied
                 Warlock.resetCurse();
@@ -357,9 +362,9 @@ namespace TheOtherRoles.Patches {
 
         static void ninjaUpdate()
         {
-            if (Ninja.isInvisble && Ninja.invisibleTimer <= 0 && Ninja.ninja == CachedPlayer.LocalPlayer.PlayerControl)
+            if (Ninja.isInvisble && Ninja.invisibleTimer <= 0 && Ninja.ninja == PlayerControl.LocalPlayer)
             {
-                MessageWriter invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetInvisible, Hazel.SendOption.Reliable, -1);
+                MessageWriter invisibleWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetInvisible, Hazel.SendOption.Reliable, -1);
                 invisibleWriter.Write(Ninja.ninja.PlayerId);
                 invisibleWriter.Write(byte.MaxValue);
                 AmongUsClient.Instance.FinishRpcImmediately(invisibleWriter);
@@ -367,11 +372,11 @@ namespace TheOtherRoles.Patches {
             }
             if (Ninja.arrow?.arrow != null)
             {
-                if (Ninja.ninja == null || Ninja.ninja != CachedPlayer.LocalPlayer.PlayerControl || !Ninja.knowsTargetLocation) {
+                if (Ninja.ninja == null || Ninja.ninja != PlayerControl.LocalPlayer || !Ninja.knowsTargetLocation) {
                     Ninja.arrow.arrow.SetActive(false);
                     return;
                 }
-                if (Ninja.ninjaMarked != null && !CachedPlayer.LocalPlayer.Data.IsDead)
+                if (Ninja.ninjaMarked != null && !PlayerControl.LocalPlayer.Data.IsDead)
                 {
                     bool trackedOnMap = !Ninja.ninjaMarked.Data.IsDead;
                     Vector3 position = Ninja.ninjaMarked.transform.position;
@@ -396,7 +401,7 @@ namespace TheOtherRoles.Patches {
         static void trackerUpdate() {
             // Handle player tracking
             if (Tracker.arrow?.arrow != null) {
-                if (Tracker.tracker == null || CachedPlayer.LocalPlayer.PlayerControl != Tracker.tracker) {
+                if (Tracker.tracker == null || PlayerControl.LocalPlayer != Tracker.tracker) {
                     Tracker.arrow.arrow.SetActive(false);
                     if (Tracker.DangerMeterParent) Tracker.DangerMeterParent.SetActive(false);
                     return;
@@ -433,7 +438,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Handle corpses tracking
-            if (Tracker.tracker != null && Tracker.tracker == CachedPlayer.LocalPlayer.PlayerControl && Tracker.corpsesTrackingTimer >= 0f && !Tracker.tracker.Data.IsDead) {
+            if (Tracker.tracker != null && Tracker.tracker == PlayerControl.LocalPlayer && Tracker.corpsesTrackingTimer >= 0f && !Tracker.tracker.Data.IsDead) {
                 bool arrowsCountChanged = Tracker.localArrows.Count != Tracker.deadBodyPositions.Count();
                 int index = 0;
 
@@ -483,7 +488,7 @@ namespace TheOtherRoles.Patches {
         public static void updatePlayerInfo() {
             Vector3 colorBlindTextMeetingInitialLocalPos = new Vector3(0.3384f, -0.16666f, -0.01f);
             Vector3 colorBlindTextMeetingInitialLocalScale = new Vector3(0.9f, 1f, 1f);
-            foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                 
                 // Colorblind Text in Meeting
                 PlayerVoteArea playerVoteArea = MeetingHud.Instance?.playerStates?.FirstOrDefault(x => x.TargetPlayerId == p.PlayerId);
@@ -499,7 +504,7 @@ namespace TheOtherRoles.Patches {
 
                 p.cosmetics.nameText.transform.parent.SetLocalZ(-0.0001f);  // This moves both the name AND the colorblindtext behind objects (if the player is behind the object), like the rock on polus
 
-                if ((Lawyer.lawyerKnowsRole && CachedPlayer.LocalPlayer.PlayerControl == Lawyer.lawyer && p == Lawyer.target) || p == CachedPlayer.LocalPlayer.PlayerControl || CachedPlayer.LocalPlayer.Data.IsDead) {
+                if ((Lawyer.lawyerKnowsRole && PlayerControl.LocalPlayer == Lawyer.lawyer && p == Lawyer.target) || p == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead) {
                     Transform playerInfoTransform = p.cosmetics.nameText.transform.parent.FindChild("Info");
                     TMPro.TextMeshPro playerInfo = playerInfoTransform != null ? playerInfoTransform.GetComponent<TMPro.TextMeshPro>() : null;
                     if (playerInfo == null) {
@@ -532,7 +537,7 @@ namespace TheOtherRoles.Patches {
 
                     string playerInfoText = "";
                     string meetingInfoText = "";                    
-                    if (p == CachedPlayer.LocalPlayer.PlayerControl) {
+                    if (p == PlayerControl.LocalPlayer) {
                         if (p.Data.IsDead) roleNames = roleText;
                         playerInfoText = $"{roleNames}";
                         if (p == Swapper.swapper) playerInfoText = $"{roleNames}" + Helpers.cs(Swapper.color, $" ({Swapper.charges})");
@@ -550,7 +555,7 @@ namespace TheOtherRoles.Patches {
                         playerInfoText = $"{taskInfo}".Trim();
                         meetingInfoText = playerInfoText;
                     }
-                    else if (TORMapOptions.ghostsSeeRoles || (Lawyer.lawyerKnowsRole && CachedPlayer.LocalPlayer.PlayerControl == Lawyer.lawyer && p == Lawyer.target)) {
+                    else if (TORMapOptions.ghostsSeeRoles || (Lawyer.lawyerKnowsRole && PlayerControl.LocalPlayer == Lawyer.lawyer && p == Lawyer.target)) {
                         playerInfoText = $"{roleText}";
                         meetingInfoText = playerInfoText;
                     }
@@ -563,10 +568,10 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void securityGuardSetTarget() {
-            if (SecurityGuard.securityGuard == null || SecurityGuard.securityGuard != CachedPlayer.LocalPlayer.PlayerControl || MapUtilities.CachedShipStatus == null || MapUtilities.CachedShipStatus.AllVents == null) return;
+            if (SecurityGuard.securityGuard == null || SecurityGuard.securityGuard != PlayerControl.LocalPlayer || MapUtilities.CachedShipStatus == null || MapUtilities.CachedShipStatus.AllVents == null) return;
 
             Vent target = null;
-            Vector2 truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition();
+            Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition();
             float closestDistance = float.MaxValue;
             for (int i = 0; i < MapUtilities.CachedShipStatus.AllVents.Length; i++) {
                 Vent vent = MapUtilities.CachedShipStatus.AllVents[i];
@@ -582,7 +587,7 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void securityGuardUpdate() {
-            if (SecurityGuard.securityGuard == null || CachedPlayer.LocalPlayer.PlayerControl != SecurityGuard.securityGuard || SecurityGuard.securityGuard.Data.IsDead) return;
+            if (SecurityGuard.securityGuard == null || PlayerControl.LocalPlayer != SecurityGuard.securityGuard || SecurityGuard.securityGuard.Data.IsDead) return;
             var (playerCompleted, _) = TasksHandler.taskInfo(SecurityGuard.securityGuard.Data);
             if (playerCompleted == SecurityGuard.rechargedTasks) {
                 SecurityGuard.rechargedTasks += SecurityGuard.rechargeTasksNumber;
@@ -591,16 +596,16 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void arsonistSetTarget() {
-            if (Arsonist.arsonist == null || Arsonist.arsonist != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Arsonist.arsonist == null || Arsonist.arsonist != PlayerControl.LocalPlayer) return;
             List<PlayerControl> untargetables;
             if (Arsonist.douseTarget != null)
             {
                 untargetables = new();
-                foreach (CachedPlayer cachedPlayer in CachedPlayer.AllPlayers)
+                foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                 {
-                    if (cachedPlayer.PlayerId != Arsonist.douseTarget.PlayerId)
+                    if (player.PlayerId != Arsonist.douseTarget.PlayerId)
                     {
-                        untargetables.Add(cachedPlayer);
+                        untargetables.Add(player);
                     }
                 }
             }
@@ -617,7 +622,7 @@ namespace TheOtherRoles.Patches {
             var (playerCompleted, playerTotal) = TasksHandler.taskInfo(Snitch.snitch.Data);
 
             if (playerTotal == 0) return;
-            PlayerControl local = CachedPlayer.LocalPlayer.PlayerControl;
+            PlayerControl local = PlayerControl.LocalPlayer;
 
             int numberOfTasks = playerTotal - playerCompleted;
 
@@ -643,7 +648,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void bountyHunterUpdate() {
-            if (BountyHunter.bountyHunter == null || CachedPlayer.LocalPlayer.PlayerControl != BountyHunter.bountyHunter) return;
+            if (BountyHunter.bountyHunter == null || PlayerControl.LocalPlayer != BountyHunter.bountyHunter) return;
 
             if (BountyHunter.bountyHunter.Data.IsDead) {
                 if (BountyHunter.arrow != null || BountyHunter.arrow.arrow != null) UnityEngine.Object.Destroy(BountyHunter.arrow.arrow);
@@ -666,15 +671,15 @@ namespace TheOtherRoles.Patches {
                 BountyHunter.arrowUpdateTimer = 0f; // Force arrow to update
                 BountyHunter.bountyUpdateTimer = BountyHunter.bountyDuration;
                 var possibleTargets = new List<PlayerControl>();
-                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                     if (!p.Data.IsDead && !p.Data.Disconnected && p != p.Data.Role.IsImpostor && p != Spy.spy && (p != Sidekick.sidekick || !Sidekick.wasTeamRed) && (p != Jackal.jackal || !Jackal.wasTeamRed) && (p != Mini.mini || Mini.isGrownUp()) && (Lovers.getPartner(BountyHunter.bountyHunter) == null || p != Lovers.getPartner(BountyHunter.bountyHunter))) possibleTargets.Add(p);
                 }
                 BountyHunter.bounty = possibleTargets[TheOtherRoles.rnd.Next(0, possibleTargets.Count)];
                 if (BountyHunter.bounty == null) return;
 
                 // Ghost Info
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                writer.Write(PlayerControl.LocalPlayer.PlayerId);
                 writer.Write((byte)RPCProcedure.GhostInfoTypes.BountyTarget);
                 writer.Write(BountyHunter.bounty.PlayerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -709,7 +714,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void vultureUpdate() {
-            if (Vulture.vulture == null || CachedPlayer.LocalPlayer.PlayerControl != Vulture.vulture || Vulture.localArrows == null || !Vulture.showArrows) return;
+            if (Vulture.vulture == null || PlayerControl.LocalPlayer != Vulture.vulture || Vulture.localArrows == null || !Vulture.showArrows) return;
             if (Vulture.vulture.Data.IsDead) {
                 foreach (Arrow arrow in Vulture.localArrows) UnityEngine.Object.Destroy(arrow.arrow);
                 Vulture.localArrows = new List<Arrow>();
@@ -736,10 +741,10 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void mediumSetTarget() {
-            if (Medium.medium == null || Medium.medium != CachedPlayer.LocalPlayer.PlayerControl || Medium.medium.Data.IsDead || Medium.deadBodies == null || MapUtilities.CachedShipStatus?.AllVents == null) return;
+            if (Medium.medium == null || Medium.medium != PlayerControl.LocalPlayer || Medium.medium.Data.IsDead || Medium.deadBodies == null || MapUtilities.CachedShipStatus?.AllVents == null) return;
 
             DeadPlayer target = null;
-            Vector2 truePosition = CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition();
+            Vector2 truePosition = PlayerControl.LocalPlayer.GetTruePosition();
             float closestDistance = float.MaxValue;
             float usableDistance = MapUtilities.CachedShipStatus.AllVents.FirstOrDefault().UsableDistance;
             foreach ((DeadPlayer dp, Vector3 ps) in Medium.deadBodies) {
@@ -780,7 +785,7 @@ namespace TheOtherRoles.Patches {
                     Morphling.morphling.setLook(target.Data.PlayerName, target.Data.DefaultOutfit.ColorId, target.Data.DefaultOutfit.HatId, target.Data.DefaultOutfit.VisorId, target.Data.DefaultOutfit.SkinId, target.Data.DefaultOutfit.PetId);
                 }
                 if (Camouflager.camouflageTimer > 0) {
-                    foreach (PlayerControl player in CachedPlayer.AllPlayers)
+                    foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                         player.setLook("", 6, "", "", "", "");
                 }
             }
@@ -792,11 +797,11 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void lawyerUpdate() {
-            if (Lawyer.lawyer == null || Lawyer.lawyer != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Lawyer.lawyer == null || Lawyer.lawyer != PlayerControl.LocalPlayer) return;
 
             // Promote to Pursuer
             if (Lawyer.target != null && Lawyer.target.Data.Disconnected && !Lawyer.lawyer.Data.IsDead) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.lawyerPromotesToPursuer();
                 return;
@@ -804,7 +809,7 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void hackerUpdate() {
-            if (Hacker.hacker == null || CachedPlayer.LocalPlayer.PlayerControl != Hacker.hacker || Hacker.hacker.Data.IsDead) return;
+            if (Hacker.hacker == null || PlayerControl.LocalPlayer != Hacker.hacker || Hacker.hacker.Data.IsDead) return;
             var (playerCompleted, _) = TasksHandler.taskInfo(Hacker.hacker.Data);
             if (playerCompleted == Hacker.rechargedTasks) {
                 Hacker.rechargedTasks += Hacker.rechargeTasksNumber;
@@ -815,8 +820,8 @@ namespace TheOtherRoles.Patches {
 
         // For swapper swap charges        
         public static void swapperUpdate() {
-            if (Swapper.swapper == null || CachedPlayer.LocalPlayer.PlayerControl != Swapper.swapper || CachedPlayer.LocalPlayer.Data.IsDead) return;
-            var (playerCompleted, _) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
+            if (Swapper.swapper == null || PlayerControl.LocalPlayer != Swapper.swapper || PlayerControl.LocalPlayer.Data.IsDead) return;
+            var (playerCompleted, _) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
             if (playerCompleted == Swapper.rechargedTasks) {
                 Swapper.rechargedTasks += Swapper.rechargeTasksNumber;
                 Swapper.charges++;
@@ -824,13 +829,13 @@ namespace TheOtherRoles.Patches {
         }
 
         static void pursuerSetTarget() {
-            if (Pursuer.pursuer == null || Pursuer.pursuer != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Pursuer.pursuer == null || Pursuer.pursuer != PlayerControl.LocalPlayer) return;
             Pursuer.target = setTarget();
             setPlayerOutline(Pursuer.target, Pursuer.color);
         }
 
         static void witchSetTarget() {
-            if (Witch.witch == null || Witch.witch != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Witch.witch == null || Witch.witch != PlayerControl.LocalPlayer) return;
             List<PlayerControl> untargetables;
             if (Witch.spellCastingTarget != null)
                 untargetables = PlayerControl.AllPlayerControls.ToArray().Where(x => x.PlayerId != Witch.spellCastingTarget.PlayerId).ToList(); // Don't switch the target from the the one you're currently casting a spell on
@@ -846,7 +851,7 @@ namespace TheOtherRoles.Patches {
 
         static void ninjaSetTarget()
         {
-            if (Ninja.ninja == null || Ninja.ninja != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Ninja.ninja == null || Ninja.ninja != PlayerControl.LocalPlayer) return;
             List<PlayerControl> untargetables = new List<PlayerControl>();
             if (Spy.spy != null && !Spy.impostorsCanKillAnyone) untargetables.Add(Spy.spy);
             if (Mini.mini != null && !Mini.isGrownUp()) untargetables.Add(Mini.mini);
@@ -857,7 +862,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void thiefSetTarget() {
-            if (Thief.thief == null || Thief.thief != CachedPlayer.LocalPlayer.PlayerControl) return;
+            if (Thief.thief == null || Thief.thief != PlayerControl.LocalPlayer) return;
             List<PlayerControl> untargetables = new List<PlayerControl>();
             if (Mini.mini != null && !Mini.isGrownUp()) untargetables.Add(Mini.mini);
             Thief.currentTarget = setTarget(onlyCrewmates: false, untargetablePlayers: untargetables);
@@ -875,11 +880,11 @@ namespace TheOtherRoles.Patches {
                 Bait.active[entry.Key] = entry.Value - Time.fixedDeltaTime;
                 if (entry.Value <= 0) {
                     Bait.active.Remove(entry.Key);
-                    if (entry.Key.killerIfExisting != null && entry.Key.killerIfExisting.PlayerId == CachedPlayer.LocalPlayer.PlayerId) {
+                    if (entry.Key.killerIfExisting != null && entry.Key.killerIfExisting.PlayerId == PlayerControl.LocalPlayer.PlayerId) {
                         Helpers.handleVampireBiteOnBodyReport(); // Manually call Vampire handling, since the CmdReportDeadBody Prefix won't be called
                         RPCProcedure.uncheckedCmdReportDeadBody(entry.Key.killerIfExisting.PlayerId, entry.Key.player.PlayerId);
 
-                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UncheckedCmdReportDeadBody, Hazel.SendOption.Reliable, -1);
+                        MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UncheckedCmdReportDeadBody, Hazel.SendOption.Reliable, -1);
                         writer.Write(entry.Key.killerIfExisting.PlayerId);
                         writer.Write(entry.Key.player.PlayerId);
                         AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -905,7 +910,7 @@ namespace TheOtherRoles.Patches {
 
         // Mini set adapted button cooldown for Vampire, Sheriff, Jackal, Sidekick, Warlock, Cleaner
         public static void miniCooldownUpdate() {
-            if (Mini.mini != null && CachedPlayer.LocalPlayer.PlayerControl == Mini.mini) {
+            if (Mini.mini != null && PlayerControl.LocalPlayer == Mini.mini) {
                 var multiplier = Mini.isGrownUp() ? 0.66f : 2f;
                 HudManagerStartPatch.sheriffKillButton.MaxTimer = Sheriff.cooldown * multiplier;
                 HudManagerStartPatch.vampireKillButton.MaxTimer = Vampire.cooldown * multiplier;
@@ -920,7 +925,7 @@ namespace TheOtherRoles.Patches {
         }
 
         public static void trapperUpdate() {
-            if (Trapper.trapper == null || CachedPlayer.LocalPlayer.PlayerControl != Trapper.trapper || Trapper.trapper.Data.IsDead) return;
+            if (Trapper.trapper == null || PlayerControl.LocalPlayer != Trapper.trapper || Trapper.trapper.Data.IsDead) return;
             var (playerCompleted, _) = TasksHandler.taskInfo(Trapper.trapper.Data);
             if (playerCompleted == Trapper.rechargedTasks) {
                 Trapper.rechargedTasks += Trapper.rechargeTasksNumber;
@@ -957,10 +962,10 @@ namespace TheOtherRoles.Patches {
                 }
             }
             if (HideNSeek.isHunted() && !Hunted.taskPunish && !HideNSeek.isWaitingTimer) {
-                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(CachedPlayer.LocalPlayer.Data);
+                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(PlayerControl.LocalPlayer.Data);
                 int numberOfTasks = playerTotal - playerCompleted;
                 if (numberOfTasks == 0) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareTimer, Hazel.SendOption.Reliable, -1);
                     writer.Write(HideNSeek.taskPunish);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.shareTimer(HideNSeek.taskPunish);
@@ -971,11 +976,11 @@ namespace TheOtherRoles.Patches {
 
             if (!HideNSeek.isHunter()) return;
 
-            byte playerId = CachedPlayer.LocalPlayer.PlayerId;
+            byte playerId = PlayerControl.LocalPlayer.PlayerId;
             foreach (Arrow arrow in Hunter.localArrows) arrow.arrow.SetActive(false);
             if (Hunter.arrowActive) {
                 int arrowIndex = 0;
-                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                     if (!p.Data.IsDead && !p.Data.Role.IsImpostor) {
                         if (arrowIndex >= Hunter.localArrows.Count) {
                             Hunter.localArrows.Add(new Arrow(Color.blue));
@@ -1001,7 +1006,7 @@ namespace TheOtherRoles.Patches {
                 //pc.cosmetics.colorBlindText.gameObject.transform.localPosition = new Vector3(0, 0, -0.0001f);
             }
             
-            if (CachedPlayer.LocalPlayer.PlayerControl == __instance) {
+            if (PlayerControl.LocalPlayer == __instance) {
                 // Update player outlines
                 setBasePlayerOutlines();
 
@@ -1130,14 +1135,14 @@ namespace TheOtherRoles.Patches {
         }
     }
 
-    [HarmonyPatch(typeof(PlayerControl), nameof(CachedPlayer.LocalPlayer.PlayerControl.CmdReportDeadBody))]
+    [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.LocalPlayer.CmdReportDeadBody))]
     class BodyReportPatch
     {
         static void Postfix(PlayerControl __instance, [HarmonyArgument(0)]NetworkedPlayerInfo target)
         {
             // Medic or Detective report
-            bool isMedicReport = Medic.medic != null && Medic.medic == CachedPlayer.LocalPlayer.PlayerControl && __instance.PlayerId == Medic.medic.PlayerId;
-            bool isDetectiveReport = Detective.detective != null && Detective.detective == CachedPlayer.LocalPlayer.PlayerControl && __instance.PlayerId == Detective.detective.PlayerId;
+            bool isMedicReport = Medic.medic != null && Medic.medic == PlayerControl.LocalPlayer && __instance.PlayerId == Medic.medic.PlayerId;
+            bool isDetectiveReport = Detective.detective != null && Detective.detective == PlayerControl.LocalPlayer && __instance.PlayerId == Detective.detective.PlayerId;
             if (isMedicReport || isDetectiveReport)
             {
                 DeadPlayer deadPlayer = deadPlayers?.Where(x => x.player?.PlayerId == target?.PlayerId)?.FirstOrDefault();
@@ -1163,11 +1168,11 @@ namespace TheOtherRoles.Patches {
                     {   
                         if (AmongUsClient.Instance.AmClient && FastDestroyableSingleton<HudManager>.Instance)
                         {
-                            FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(CachedPlayer.LocalPlayer.PlayerControl, msg);
+                            FastDestroyableSingleton<HudManager>.Instance.Chat.AddChat(PlayerControl.LocalPlayer, msg);
 
                             // Ghost Info
-                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                            writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                            writer.Write(PlayerControl.LocalPlayer.PlayerId);
                             writer.Write((byte)RPCProcedure.GhostInfoTypes.DetectiveOrMedicInfo);
                             writer.Write(msg);
                             AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1224,21 +1229,21 @@ namespace TheOtherRoles.Patches {
             }
 
             // Sidekick promotion trigger on murder
-            if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && target == Jackal.jackal && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
+            if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && target == Jackal.jackal && Jackal.jackal == PlayerControl.LocalPlayer) {
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.sidekickPromotes();
             }
 
             // Pursuer promotion trigger on murder (the host sends the call such that everyone recieves the update before a possible game End)
             if (target == Lawyer.target && AmongUsClient.Instance.AmHost && Lawyer.lawyer != null) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.lawyerPromotesToPursuer();
             }
 
             // Seer show flash and add dead player position
-            if (Seer.seer != null && (CachedPlayer.LocalPlayer.PlayerControl == Seer.seer || Helpers.shouldShowGhostInfo()) && !Seer.seer.Data.IsDead && Seer.seer != target && Seer.mode <= 1) {
+            if (Seer.seer != null && (PlayerControl.LocalPlayer == Seer.seer || Helpers.shouldShowGhostInfo()) && !Seer.seer.Data.IsDead && Seer.seer != target && Seer.mode <= 1) {
                 Helpers.showFlash(new Color(42f / 255f, 187f / 255f, 245f / 255f), message : "Seer Info: Someone Died");
             }
             if (Seer.deadBodyPositions != null) Seer.deadBodyPositions.Add(target.transform.position);
@@ -1252,7 +1257,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Set bountyHunter cooldown
-            if (BountyHunter.bountyHunter != null && CachedPlayer.LocalPlayer.PlayerControl == BountyHunter.bountyHunter && __instance == BountyHunter.bountyHunter) {
+            if (BountyHunter.bountyHunter != null && PlayerControl.LocalPlayer == BountyHunter.bountyHunter && __instance == BountyHunter.bountyHunter) {
                 if (target == BountyHunter.bounty) {
                     BountyHunter.bountyHunter.SetKillTimer(BountyHunter.bountyKillCooldown);
                     BountyHunter.bountyUpdateTimer = 0f; // Force bounty update
@@ -1262,28 +1267,28 @@ namespace TheOtherRoles.Patches {
             }
 
             // Mini Set Impostor Mini kill timer (Due to mini being a modifier, all "SetKillTimers" must have happened before this!)
-            if (Mini.mini != null && __instance == Mini.mini && __instance == CachedPlayer.LocalPlayer.PlayerControl) {
+            if (Mini.mini != null && __instance == Mini.mini && __instance == PlayerControl.LocalPlayer) {
                 float multiplier = 1f;
-                if (Mini.mini != null && CachedPlayer.LocalPlayer.PlayerControl == Mini.mini) multiplier = Mini.isGrownUp() ? 0.66f : 2f;
+                if (Mini.mini != null && PlayerControl.LocalPlayer == Mini.mini) multiplier = Mini.isGrownUp() ? 0.66f : 2f;
                 Mini.mini.SetKillTimer(__instance.killTimer * multiplier);
             }
 
             // Cleaner Button Sync
-            if (Cleaner.cleaner != null && CachedPlayer.LocalPlayer.PlayerControl == Cleaner.cleaner && __instance == Cleaner.cleaner && HudManagerStartPatch.cleanerCleanButton != null)
+            if (Cleaner.cleaner != null && PlayerControl.LocalPlayer == Cleaner.cleaner && __instance == Cleaner.cleaner && HudManagerStartPatch.cleanerCleanButton != null)
                 HudManagerStartPatch.cleanerCleanButton.Timer = Cleaner.cleaner.killTimer;
 
             // Witch Button Sync
-            if (Witch.triggerBothCooldowns && Witch.witch != null && CachedPlayer.LocalPlayer.PlayerControl == Witch.witch && __instance == Witch.witch && HudManagerStartPatch.witchSpellButton != null)
+            if (Witch.triggerBothCooldowns && Witch.witch != null && PlayerControl.LocalPlayer == Witch.witch && __instance == Witch.witch && HudManagerStartPatch.witchSpellButton != null)
                 HudManagerStartPatch.witchSpellButton.Timer = HudManagerStartPatch.witchSpellButton.MaxTimer;
 
             // Warlock Button Sync
-            if (Warlock.warlock != null && CachedPlayer.LocalPlayer.PlayerControl == Warlock.warlock && __instance == Warlock.warlock && HudManagerStartPatch.warlockCurseButton != null) {
+            if (Warlock.warlock != null && PlayerControl.LocalPlayer == Warlock.warlock && __instance == Warlock.warlock && HudManagerStartPatch.warlockCurseButton != null) {
                 if (Warlock.warlock.killTimer > HudManagerStartPatch.warlockCurseButton.Timer) {
                     HudManagerStartPatch.warlockCurseButton.Timer = Warlock.warlock.killTimer;
                 }
             }
             // Ninja Button Sync
-            if (Ninja.ninja != null && CachedPlayer.LocalPlayer.PlayerControl == Ninja.ninja && __instance == Ninja.ninja && HudManagerStartPatch.ninjaButton != null)
+            if (Ninja.ninja != null && PlayerControl.LocalPlayer == Ninja.ninja && __instance == Ninja.ninja && HudManagerStartPatch.ninjaButton != null)
                 HudManagerStartPatch.ninjaButton.Timer = HudManagerStartPatch.ninjaButton.MaxTimer;
 
             // Bait
@@ -1291,12 +1296,12 @@ namespace TheOtherRoles.Patches {
                 float reportDelay = (float) rnd.Next((int)Bait.reportDelayMin, (int)Bait.reportDelayMax + 1);
                 Bait.active.Add(deadPlayer, reportDelay);
 
-                if (Bait.showKillFlash && __instance == CachedPlayer.LocalPlayer.PlayerControl) Helpers.showFlash(new Color(204f / 255f, 102f / 255f, 0f / 255f));
+                if (Bait.showKillFlash && __instance == PlayerControl.LocalPlayer) Helpers.showFlash(new Color(204f / 255f, 102f / 255f, 0f / 255f));
             }
 
             // Add Bloody Modifier
             if (Bloody.bloody.FindAll(x => x.PlayerId == target.PlayerId).Count > 0) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.Bloody, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.Bloody, Hazel.SendOption.Reliable, -1);
                 writer.Write(__instance.PlayerId);
                 writer.Write(target.PlayerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -1318,7 +1323,7 @@ namespace TheOtherRoles.Patches {
             if (HideNSeek.isHideNSeekGM) {
                 int visibleCounter = 0;
                 Vector3 bottomLeft = IntroCutsceneOnDestroyPatch.bottomLeft + new Vector3(-0.25f, -0.25f, 0);
-                foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                     if (!TORMapOptions.playerIcons.ContainsKey(p.PlayerId) || p.Data.Role.IsImpostor) continue;
                     if (p.Data.IsDead || p.Data.Disconnected) {
                         TORMapOptions.playerIcons[p.PlayerId].gameObject.SetActive(false);
@@ -1331,8 +1336,8 @@ namespace TheOtherRoles.Patches {
             }
 
             // Snitch
-            if (Snitch.snitch != null && CachedPlayer.LocalPlayer.PlayerId == Snitch.snitch.PlayerId && MapBehaviourPatch.herePoints.Keys.Any(x => x.PlayerId == target.PlayerId)) {
-                foreach (var a in MapBehaviourPatch.herePoints.Where(x => x.Key.PlayerId == target.PlayerId)) {
+            if (Snitch.snitch != null && PlayerControl.LocalPlayer.PlayerId == Snitch.snitch.PlayerId && MapBehaviourPatch.herePoints.Keys.Any(x => x == target.PlayerId)) {
+                foreach (var a in MapBehaviourPatch.herePoints.Where(x => x.Key == target.PlayerId)) {
                     UnityEngine.Object.Destroy(a.Value);
                     MapBehaviourPatch.herePoints.Remove(a.Key);
                 }
@@ -1347,8 +1352,8 @@ namespace TheOtherRoles.Patches {
             if (GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown <= 0f) return false;
             float multiplier = 1f;
             float addition = 0f;
-            if (Mini.mini != null && CachedPlayer.LocalPlayer.PlayerControl == Mini.mini) multiplier = Mini.isGrownUp() ? 0.66f : 2f;
-            if (BountyHunter.bountyHunter != null && CachedPlayer.LocalPlayer.PlayerControl == BountyHunter.bountyHunter) addition = BountyHunter.punishmentTime;
+            if (Mini.mini != null && PlayerControl.LocalPlayer == Mini.mini) multiplier = Mini.isGrownUp() ? 0.66f : 2f;
+            if (BountyHunter.bountyHunter != null && PlayerControl.LocalPlayer == BountyHunter.bountyHunter) addition = BountyHunter.punishmentTime;
 
             __instance.killTimer = Mathf.Clamp(time, 0f, GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown * multiplier + addition);
             FastDestroyableSingleton<HudManager>.Instance.KillButton.SetCoolDown(__instance.killTimer, GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown * multiplier + addition);
@@ -1407,8 +1412,8 @@ namespace TheOtherRoles.Patches {
 
             }            
             // Sidekick promotion trigger on exile
-            if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && __instance == Jackal.jackal && Jackal.jackal == CachedPlayer.LocalPlayer.PlayerControl) {
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
+            if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && __instance == Jackal.jackal && Jackal.jackal == PlayerControl.LocalPlayer) {
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.Reliable, -1);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.sidekickPromotes();
             }
@@ -1417,7 +1422,7 @@ namespace TheOtherRoles.Patches {
             if (Lawyer.lawyer != null && __instance == Lawyer.target) {
                 PlayerControl lawyer = Lawyer.lawyer;
                 if (AmongUsClient.Instance.AmHost && ((Lawyer.target != Jester.jester && !Lawyer.isProsecutor) || Lawyer.targetWasGuessed)) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.lawyerPromotesToPursuer();
                 }
@@ -1426,8 +1431,8 @@ namespace TheOtherRoles.Patches {
                     if (Lawyer.lawyer != null) Lawyer.lawyer.Exiled();
                     if (Pursuer.pursuer != null) Pursuer.pursuer.Exiled();
 
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     writer.Write((byte)RPCProcedure.GhostInfoTypes.DeathReasonAndKiller);
                     writer.Write(lawyer.PlayerId);
                     writer.Write((byte)DeadPlayer.CustomDeathReason.LawyerSuicide);
@@ -1443,11 +1448,11 @@ namespace TheOtherRoles.Patches {
     public static class PlayerPhysicsFixedUpdate {
         public static void Postfix(PlayerPhysics __instance)
         {
-            bool shouldInvert = Invert.invert.FindAll(x => x.PlayerId == CachedPlayer.LocalPlayer.PlayerId).Count > 0 && Invert.meetings > 0;
+            bool shouldInvert = Invert.invert.FindAll(x => x.PlayerId == PlayerControl.LocalPlayer.PlayerId).Count > 0 && Invert.meetings > 0;
             if (__instance.AmOwner &&
                 AmongUsClient.Instance &&
                 AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Started &&
-                !CachedPlayer.LocalPlayer.Data.IsDead && 
+                !PlayerControl.LocalPlayer.Data.IsDead && 
                 shouldInvert && 
                 GameData.Instance && 
                 __instance.myPlayer.CanMove)  
@@ -1461,7 +1466,7 @@ namespace TheOtherRoles.Patches {
             if (GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek)
                 return true;
             __result = false;
-            if (!CachedPlayer.LocalPlayer.Data.IsDead && Lighter.lighter != null && Lighter.lighter.PlayerId == CachedPlayer.LocalPlayer.PlayerId) {
+            if (!PlayerControl.LocalPlayer.Data.IsDead && Lighter.lighter != null && Lighter.lighter.PlayerId == PlayerControl.LocalPlayer.PlayerId) {
                 __result = true;
             }
 
@@ -1472,9 +1477,9 @@ namespace TheOtherRoles.Patches {
     [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.AdjustLighting))]
     public static class AdjustLight {
         public static bool Prefix(PlayerControl __instance) {
-            if (__instance == null || CachedPlayer.LocalPlayer == null || Lighter.lighter == null) return true;
+            if (__instance == null || PlayerControl.LocalPlayer == null || Lighter.lighter == null) return true;
 
-            bool hasFlashlight = !CachedPlayer.LocalPlayer.Data.IsDead && Lighter.lighter.PlayerId == CachedPlayer.LocalPlayer.PlayerId;
+            bool hasFlashlight = !PlayerControl.LocalPlayer.Data.IsDead && Lighter.lighter.PlayerId == PlayerControl.LocalPlayer.PlayerId;
             __instance.SetFlashlightInputMethod();
             __instance.lightSource.SetupLightingForGameplay(hasFlashlight, Lighter.flashlightWidth, __instance.TargetFlashlight.transform);
 
index b9363c767724c9468cdc2f5adea3ba662ba74d00..f607b3dc46e92153974d059becdafd87c3a1434a 100644 (file)
@@ -145,13 +145,14 @@ namespace TheOtherRoles.Patches {
 
             if (serverWarning == null) {
                 var tmplt = __instance.ButtonPool.activeChildren[^1] ;
-                serverWarning = GameObject.Instantiate(tmplt.transform.GetChild(0).gameObject, tmplt.transform);
-                var comp = serverWarning.GetComponent<TMPro.TextMeshPro>();
-                comp.fontSizeMin = 2;
-                comp.fontSizeMax = 2;
-                serverWarning.transform.localPosition = new Vector3(0f, -3f, -10f);
+                serverWarning = new GameObject("serverWarning");  // GameObject.Instantiate(tmplt.transform.GetChild(0).gameObject, tmplt.transform);
+                var comp = serverWarning.AddComponent<TMPro.TextMeshPro>();  // serverWarning.GetComponent<TMPro.TextMeshPro>();
+                //serverWarning.transform.SetParent(tmplt.transform, true);
+                comp.fontSize = 0.2f;
+                serverWarning.transform.position = new Vector3(5f, 1f, -200f);
                 __instance.StartCoroutine(Effects.Lerp(0.1f, new Action<float>((p) => {
                     comp.text = Helpers.cs(Color.red, "Vanilla Servers Are Currently Not Compatible With TOR");
+                    serverWarning.transform.position = new Vector3(0f, 1f, -200f);
                 })));
                 serverWarning.SetActive(true);
             }
index ded2828b3bdbadc7772fd97c6cc7321105359cf5..012903bc64adabedacc4495d47545eb5a8095aa9 100644 (file)
@@ -5,7 +5,7 @@ using System.Linq;
 using UnityEngine;
 using System;
 using AmongUs.GameOptions;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using static TheOtherRoles.TheOtherRoles;
 using TheOtherRoles.CustomGameModes;
@@ -48,7 +48,7 @@ namespace TheOtherRoles.Patches {
         private static List<Tuple<byte, byte>> playerRoleMap = new List<Tuple<byte, byte>>();
         public static bool isGuesserGamemode { get { return TORMapOptions.gameMode == CustomGamemodes.Guesser; } }
         public static void Postfix() {
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ResetVaribles, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ResetVaribles, Hazel.SendOption.Reliable, -1);
             AmongUsClient.Instance.FinishRpcImmediately(writer);
             RPCProcedure.resetVariables();
             if (TORMapOptions.gameMode == CustomGamemodes.HideNSeek || TORMapOptions.gameMode == CustomGamemodes.PropHunt || GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return; // Don't assign Roles in Hide N Seek
@@ -97,6 +97,9 @@ namespace TheOtherRoles.Patches {
             int crewCountSettings = rnd.Next(crewmateMin, crewmateMax + 1);
             int neutralCountSettings = rnd.Next(neutralMin, neutralMax + 1);
             int impCountSettings = rnd.Next(impostorMin, impostorMax + 1);
+            // If fill crewmates is enabled, make sure crew + neutral >= crewmates s.t. everyone has a role!
+            while (crewCountSettings + neutralCountSettings < crewmates.Count && CustomOptionHolder.crewmateRolesFill.getBool())
+                crewCountSettings++;
 
             // Potentially lower the actual maximum to the assignable players
             int maxCrewmateRoles = Mathf.Min(crewmates.Count, crewCountSettings);
@@ -385,24 +388,24 @@ namespace TheOtherRoles.Patches {
             if (Lawyer.lawyer != null) {
                 var possibleTargets = new List<PlayerControl>();
                 if (!Lawyer.isProsecutor) { // Lawyer
-                    foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                    foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                         if (!p.Data.IsDead && !p.Data.Disconnected && p != Lovers.lover1 && p != Lovers.lover2 && (p.Data.Role.IsImpostor || p == Jackal.jackal || (Lawyer.targetCanBeJester && p == Jester.jester)))
                             possibleTargets.Add(p);
                     }
                 } else { // Prosecutor
-                    foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+                    foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                         if (!p.Data.IsDead && !p.Data.Disconnected && p != Lovers.lover1 && p != Lovers.lover2 && p != Mini.mini && !p.Data.Role.IsImpostor && !Helpers.isNeutral(p) && p != Swapper.swapper)
                             possibleTargets.Add(p);
                     }
                 }
                 
                 if (possibleTargets.Count == 0) {
-                    MessageWriter w = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter w = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(w);
                     RPCProcedure.lawyerPromotesToPursuer();
                 } else {
                     var target = possibleTargets[TheOtherRoles.rnd.Next(0, possibleTargets.Count)];
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerSetTarget, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerSetTarget, Hazel.SendOption.Reliable, -1);
                     writer.Write(target.PlayerId);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.lawyerSetTarget(target.PlayerId);
@@ -435,6 +438,7 @@ namespace TheOtherRoles.Patches {
                 RoleId.Vip,
                 RoleId.Invert,
                 RoleId.Chameleon,
+                RoleId.Armored,
                 RoleId.Shifter
             });
 
@@ -509,7 +513,7 @@ namespace TheOtherRoles.Patches {
                 byte playerId = playerList[index].PlayerId;
                 playerList.RemoveAt(index);
 
-                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetGuesserGm, Hazel.SendOption.Reliable, -1);
+                MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetGuesserGm, Hazel.SendOption.Reliable, -1);
                 writer.Write(playerId);
                 AmongUsClient.Instance.FinishRpcImmediately(writer);
                 RPCProcedure.setGuesserGm(playerId);
@@ -537,7 +541,7 @@ namespace TheOtherRoles.Patches {
             byte playerId = playerList[index].PlayerId;
             playerList.RemoveAt(index);
 
-            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.SetModifier, Hazel.SendOption.Reliable, -1);
+            MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SetModifier, Hazel.SendOption.Reliable, -1);
             writer.Write(modifierId);
             writer.Write(playerId);
             writer.Write(flag);
@@ -621,8 +625,12 @@ namespace TheOtherRoles.Patches {
                     selection = CustomOptionHolder.modifierChameleon.getSelection();
                     if (multiplyQuantity) selection *= CustomOptionHolder.modifierChameleonQuantity.getQuantity();
                     break;
+                case RoleId.Armored:
+                    selection = CustomOptionHolder.modifierArmored.getSelection();
+                    break;
                 case RoleId.Shifter:
-                    selection = CustomOptionHolder.modifierShifter.getSelection(); break;
+                    selection = CustomOptionHolder.modifierShifter.getSelection();
+                    break;
             }
                  
             return selection;
@@ -634,7 +642,7 @@ namespace TheOtherRoles.Patches {
             while (playerRoleMap.Any())
             {
                 byte amount = (byte)Math.Min(playerRoleMap.Count, 20);
-                var writer = AmongUsClient.Instance!.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.WorkaroundSetRoles, SendOption.Reliable, -1);
+                var writer = AmongUsClient.Instance!.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.WorkaroundSetRoles, SendOption.Reliable, -1);
                 writer.Write(amount);
                 for (int i = 0; i < amount; i++)
                 {
index 1924aeeb6efd5728feadd5f77a2b679b09462316..f51f10ca0eaf43e6bcf973fd6d1a1bcbd32eacc5 100644 (file)
@@ -23,7 +23,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPrefix]
         [HarmonyPatch(typeof(ZiplineBehaviour), nameof(ZiplineBehaviour.Use), new Type[] {typeof(PlayerControl), typeof(bool)})]
         public static void prefix3(ZiplineBehaviour __instance, PlayerControl player, bool fromTop) {
-            AntiTeleport.position = Players.CachedPlayer.LocalPlayer.transform.position;
+            AntiTeleport.position = PlayerControl.LocalPlayer.transform.position;
         }
 
         [HarmonyPostfix]
@@ -36,11 +36,11 @@ namespace TheOtherRoles.Patches {
                 if (hand != null) {
                     if (Camouflager.camouflageTimer <= 0 && !Helpers.MushroomSabotageActive()) {
                         if (player == Morphling.morphling && Morphling.morphTimer > 0) {
-                            hand.SetPlayerColor(Morphling.morphTarget.CurrentOutfit, PlayerMaterial.MaskType.None);
+                            hand.SetPlayerColor(Morphling.morphTarget.CurrentOutfit, PlayerMaterial.MaskType.None, 1f);
                             // Also set hat color, cause the line destroys it...
                             player.RawSetHat(Morphling.morphTarget.Data.DefaultOutfit.HatId, Morphling.morphTarget.Data.DefaultOutfit.ColorId);
                         } else {
-                            hand.SetPlayerColor(player.CurrentOutfit, PlayerMaterial.MaskType.None);
+                            hand.SetPlayerColor(player.CurrentOutfit, PlayerMaterial.MaskType.None, 1f);
                         }
                     } else {
                         PlayerMaterial.SetColors(6, hand.handRenderer);
@@ -53,7 +53,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPrefix]
         [HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.ClimbLadder))]
         public static void prefix() {
-            AntiTeleport.position = Players.CachedPlayer.LocalPlayer.transform.position;
+            AntiTeleport.position = PlayerControl.LocalPlayer.transform.position;
         }
 
         [HarmonyPostfix]
@@ -71,7 +71,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPrefix]
         [HarmonyPatch(typeof(MovingPlatformBehaviour), nameof(MovingPlatformBehaviour.UsePlatform))]
         public static void prefix2() {
-            AntiTeleport.position = Players.CachedPlayer.LocalPlayer.transform.position;
+            AntiTeleport.position = PlayerControl.LocalPlayer.transform.position;
         }
     }
 }
index 34cf40574f2de28f24394a9bae4b6f8c966e7721..9079436897595c3ddad0ff5d8e936ea636a3a77d 100644 (file)
@@ -5,7 +5,7 @@ using static TheOtherRoles.TheOtherRoles;
 using TheOtherRoles.Objects;
 using System.Collections.Generic;
 using System.Linq;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
 using AmongUs.GameOptions;
@@ -16,8 +16,8 @@ namespace TheOtherRoles.Patches {
     {
         private static Dictionary<byte, (string name, Color color)> TagColorDict = new();
         static void resetNameTagsAndColors() {
-            var localPlayer = CachedPlayer.LocalPlayer.PlayerControl;
-            var myData = CachedPlayer.LocalPlayer.Data;
+            var localPlayer = PlayerControl.LocalPlayer;
+            var myData = PlayerControl.LocalPlayer.Data;
             var amImpostor = myData.Role.IsImpostor;
             var morphTimerNotUp = Morphling.morphTimer > 0f;
             var morphTargetNotNull = Morphling.morphTarget != null;
@@ -70,7 +70,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void setNameColors() {
-            var localPlayer = CachedPlayer.LocalPlayer.PlayerControl;
+            var localPlayer = PlayerControl.LocalPlayer;
             var localRole = RoleInfo.getRoleInfoForPlayer(localPlayer, false).FirstOrDefault();
             setPlayerNameColor(localPlayer, localRole.color);
 
@@ -171,8 +171,8 @@ namespace TheOtherRoles.Patches {
 
         static void setNameTags() {
             // Mafia
-            if (CachedPlayer.LocalPlayer != null && CachedPlayer.LocalPlayer.Data.Role.IsImpostor) {
-                foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            if (PlayerControl.LocalPlayer != null && PlayerControl.LocalPlayer.Data.Role.IsImpostor) {
+                foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                     if (Godfather.godfather != null && Godfather.godfather == player)
                             player.cosmetics.nameText.text = player.Data.PlayerName + " (G)";
                     else if (Mafioso.mafioso != null && Mafioso.mafioso == player)
@@ -190,7 +190,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Lovers
-            if (Lovers.lover1 != null && Lovers.lover2 != null && (Lovers.lover1 == CachedPlayer.LocalPlayer.PlayerControl || Lovers.lover2 == CachedPlayer.LocalPlayer.PlayerControl)) {
+            if (Lovers.lover1 != null && Lovers.lover2 != null && (Lovers.lover1 == PlayerControl.LocalPlayer || Lovers.lover2 == PlayerControl.LocalPlayer)) {
                 string suffix = Helpers.cs(Lovers.color, " ♥");
                 Lovers.lover1.cosmetics.nameText.text += suffix;
                 Lovers.lover2.cosmetics.nameText.text += suffix;
@@ -202,7 +202,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Lawyer or Prosecutor
-            if ((Lawyer.lawyer != null && Lawyer.target != null && Lawyer.lawyer == CachedPlayer.LocalPlayer.PlayerControl)) {
+            if ((Lawyer.lawyer != null && Lawyer.target != null && Lawyer.lawyer == PlayerControl.LocalPlayer)) {
                 Color color = Lawyer.color;
                 PlayerControl target = Lawyer.target;
                 string suffix = Helpers.cs(color, " §");
@@ -215,7 +215,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Former Thief
-            if (Thief.formerThief != null && (Thief.formerThief == CachedPlayer.LocalPlayer.PlayerControl || CachedPlayer.LocalPlayer.PlayerControl.Data.IsDead)) {
+            if (Thief.formerThief != null && (Thief.formerThief == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer.Data.IsDead)) {
                 string suffix = Helpers.cs(Thief.color, " $");
                 Thief.formerThief.cosmetics.nameText.text += suffix;
                 if (MeetingHud.Instance != null)
@@ -225,7 +225,7 @@ namespace TheOtherRoles.Patches {
             }
 
             // Display lighter / darker color for all alive players
-            if (CachedPlayer.LocalPlayer != null && MeetingHud.Instance != null && TORMapOptions.showLighterDarker) {
+            if (PlayerControl.LocalPlayer != null && MeetingHud.Instance != null && TORMapOptions.showLighterDarker) {
                 foreach (PlayerVoteArea player in MeetingHud.Instance.playerStates) {
                     var target = Helpers.playerById(player.TargetPlayerId);
                     if (target != null)  player.NameText.text += $" ({(Helpers.isLighterColor(target) ? "L" : "D")})";
@@ -285,36 +285,36 @@ namespace TheOtherRoles.Patches {
         }
 
         static void updateImpostorKillButton(HudManager __instance) {
-            if (!CachedPlayer.LocalPlayer.Data.Role.IsImpostor) return;
+            if (!PlayerControl.LocalPlayer.Data.Role.IsImpostor) return;
             if (MeetingHud.Instance) {
                 __instance.KillButton.Hide();
                 return;
             }
             bool enabled = true;
-            if (Vampire.vampire != null && Vampire.vampire == CachedPlayer.LocalPlayer.PlayerControl)
+            if (Vampire.vampire != null && Vampire.vampire == PlayerControl.LocalPlayer)
                 enabled = false;
-            else if (Mafioso.mafioso != null && Mafioso.mafioso == CachedPlayer.LocalPlayer.PlayerControl && Godfather.godfather != null && !Godfather.godfather.Data.IsDead)
+            else if (Mafioso.mafioso != null && Mafioso.mafioso == PlayerControl.LocalPlayer && Godfather.godfather != null && !Godfather.godfather.Data.IsDead)
                 enabled = false;
-            else if (Janitor.janitor != null && Janitor.janitor == CachedPlayer.LocalPlayer.PlayerControl)
+            else if (Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer)
                 enabled = false;
             
             if (enabled) __instance.KillButton.Show();
             else __instance.KillButton.Hide();
 
-            if (Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] > 0) __instance.KillButton.Hide();
+            if (Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[PlayerControl.LocalPlayer.PlayerId] > 0) __instance.KillButton.Hide();
         }
 
         static void updateReportButton(HudManager __instance) {
             if (GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return;
-            if (Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] > 0 || MeetingHud.Instance) __instance.ReportButton.Hide();
+            if (Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[PlayerControl.LocalPlayer.PlayerId] > 0 || MeetingHud.Instance) __instance.ReportButton.Hide();
             else if (!__instance.ReportButton.isActiveAndEnabled) __instance.ReportButton.Show();
         }
          
         static void updateVentButton(HudManager __instance)
         {
             if (GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return;
-            if (Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[CachedPlayer.LocalPlayer.PlayerId] > 0 || MeetingHud.Instance) __instance.ImpostorVentButton.Hide();
-            else if (CachedPlayer.LocalPlayer.PlayerControl.roleCanUseVents() && !__instance.ImpostorVentButton.isActiveAndEnabled) __instance.ImpostorVentButton.Show();
+            if (Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId) && Deputy.handcuffedKnows[PlayerControl.LocalPlayer.PlayerId] > 0 || MeetingHud.Instance) __instance.ImpostorVentButton.Hide();
+            else if (PlayerControl.LocalPlayer.roleCanUseVents() && !__instance.ImpostorVentButton.isActiveAndEnabled) __instance.ImpostorVentButton.Show();
 
         }
 
@@ -328,7 +328,7 @@ namespace TheOtherRoles.Patches {
         }
 
         static void updateMapButton(HudManager __instance) {
-            if (Trapper.trapper == null || !(CachedPlayer.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) || __instance == null || __instance.MapButton.HeldButtonSprite == null) return;
+            if (Trapper.trapper == null || !(PlayerControl.LocalPlayer.PlayerId == Trapper.trapper.PlayerId) || __instance == null || __instance.MapButton.HeldButtonSprite == null) return;
             __instance.MapButton.HeldButtonSprite.color = Trapper.playersOnMap.Any() ? Trapper.color : Color.white;
         }
 
@@ -361,7 +361,7 @@ namespace TheOtherRoles.Patches {
             if (!MeetingHud.Instance) __instance.AbilityButton?.Update();
 
             // Fix dead player's pets being visible by just always updating whether the pet should be visible at all.
-            foreach (PlayerControl target in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl target in PlayerControl.AllPlayerControls) {
                 var pet = target.GetPet();
                 if (pet != null) {
                     pet.Visible = (PlayerControl.LocalPlayer.Data.IsDead && target.Data.IsDead || !target.Data.IsDead) && !target.inVent;
index 0da7c82fb8ca8d404b5fe4beb5698caf06948fc8..1d054212ba10b0ecf25dd25501adacba21026812 100644 (file)
@@ -7,7 +7,7 @@ using static TheOtherRoles.TheOtherRoles;
 using static TheOtherRoles.GameHistory;
 using static TheOtherRoles.TORMapOptions;
 using System.Collections.Generic;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.Objects;
 using TheOtherRoles.CustomGameModes;
@@ -41,7 +41,7 @@ namespace TheOtherRoles.Patches {
                 }                
                 switch (__instance.Id) {
                     case 9:  // Cannot enter vent 9 (Engine Room Exit Only Vent)!
-                        if (CachedPlayer.LocalPlayer.PlayerControl.inVent) break;
+                        if (PlayerControl.LocalPlayer.inVent) break;
                         __result = float.MaxValue;
                         return canUse = couldUse = false;                    
                     case 14: // Lower Central
@@ -60,7 +60,7 @@ namespace TheOtherRoles.Patches {
 
             var usableDistance = __instance.UsableDistance;
             if (__instance.name.StartsWith("JackInTheBoxVent_")) {
-                if(Trickster.trickster != CachedPlayer.LocalPlayer.PlayerControl) {
+                if(Trickster.trickster != PlayerControl.LocalPlayer) {
                     // Only the Trickster can use the Jack-In-The-Boxes!
                     canUse = false;
                     couldUse = false;
@@ -90,7 +90,7 @@ namespace TheOtherRoles.Patches {
     class VentButtonDoClickPatch {
         static  bool Prefix(VentButton __instance) {
             // Manually modifying the VentButton to use Vent.Use again in order to trigger the Vent.Use prefix patch
-                   if (__instance.currentTarget != null && !Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId)) __instance.currentTarget.Use();
+                   if (__instance.currentTarget != null && !Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId)) __instance.currentTarget.Use();
             return false;
         }
     }
@@ -100,36 +100,36 @@ namespace TheOtherRoles.Patches {
         public static bool Prefix(Vent __instance) {
             if (GameOptionsManager.Instance.currentGameOptions.GameMode == GameModes.HideNSeek) return true;
             // Deputy handcuff disables the vents
-            if (Deputy.handcuffedPlayers.Contains(CachedPlayer.LocalPlayer.PlayerId)) {
+            if (Deputy.handcuffedPlayers.Contains(PlayerControl.LocalPlayer.PlayerId)) {
                 Deputy.setHandcuffedKnows();
                 return false;
             }
-            if (Trapper.playersOnMap.Contains(CachedPlayer.LocalPlayer.PlayerControl)) return false;
+            if (Trapper.playersOnMap.Contains(PlayerControl.LocalPlayer)) return false;
 
             bool canUse;
             bool couldUse;
-            __instance.CanUse(CachedPlayer.LocalPlayer.Data, out canUse, out couldUse);
-            bool canMoveInVents = CachedPlayer.LocalPlayer.PlayerControl != Spy.spy && !Trapper.playersOnMap.Contains(CachedPlayer.LocalPlayer.PlayerControl);
+            __instance.CanUse(PlayerControl.LocalPlayer.Data, out canUse, out couldUse);
+            bool canMoveInVents = PlayerControl.LocalPlayer != Spy.spy && !Trapper.playersOnMap.Contains(PlayerControl.LocalPlayer);
             if (!canUse) return false; // No need to execute the native method as using is disallowed anyways
 
-            bool isEnter = !CachedPlayer.LocalPlayer.PlayerControl.inVent;
+            bool isEnter = !PlayerControl.LocalPlayer.inVent;
             
             if (__instance.name.StartsWith("JackInTheBoxVent_")) {
                 __instance.SetButtons(isEnter && canMoveInVents);
-                MessageWriter writer = AmongUsClient.Instance.StartRpc(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.UseUncheckedVent, Hazel.SendOption.Reliable);
+                MessageWriter writer = AmongUsClient.Instance.StartRpc(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.UseUncheckedVent, Hazel.SendOption.Reliable);
                 writer.WritePacked(__instance.Id);
-                writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                writer.Write(PlayerControl.LocalPlayer.PlayerId);
                 writer.Write(isEnter ? byte.MaxValue : (byte)0);
                 writer.EndMessage();
-                RPCProcedure.useUncheckedVent(__instance.Id, CachedPlayer.LocalPlayer.PlayerId, isEnter ? byte.MaxValue : (byte)0);
+                RPCProcedure.useUncheckedVent(__instance.Id, PlayerControl.LocalPlayer.PlayerId, isEnter ? byte.MaxValue : (byte)0);
                 SoundEffectsManager.play("tricksterUseBoxVent");
                 return false;
             }
 
             if(isEnter) {
-                CachedPlayer.LocalPlayer.PlayerPhysics.RpcEnterVent(__instance.Id);
+                PlayerControl.LocalPlayer.MyPhysics.RpcEnterVent(__instance.Id);
             } else {
-                CachedPlayer.LocalPlayer.PlayerPhysics.RpcExitVent(__instance.Id);
+                PlayerControl.LocalPlayer.MyPhysics.RpcExitVent(__instance.Id);
             }
             __instance.SetButtons(isEnter && canMoveInVents);
             return false;
@@ -139,7 +139,7 @@ namespace TheOtherRoles.Patches {
     [HarmonyPatch(typeof(Vent), nameof(Vent.TryMoveToVent))]
     public static class MoveToVentPatch {
         public static bool Prefix(Vent otherVent) {
-            return !Trapper.playersOnMap.Contains(CachedPlayer.LocalPlayer.PlayerControl);
+            return !Trapper.playersOnMap.Contains(PlayerControl.LocalPlayer);
         }
     }
 
@@ -157,7 +157,7 @@ namespace TheOtherRoles.Patches {
         static Sprite defaultVentSprite = null;
         static void Postfix(VentButton __instance) {
             // Trickster render special vent button
-            if (Trickster.trickster != null && Trickster.trickster == CachedPlayer.LocalPlayer.PlayerControl) {
+            if (Trickster.trickster != null && Trickster.trickster == PlayerControl.LocalPlayer) {
                 if (defaultVentSprite == null) defaultVentSprite = __instance.graphic.sprite;
                 bool isSpecialVent = __instance.currentTarget != null && __instance.currentTarget.gameObject != null && __instance.currentTarget.gameObject.name.StartsWith("JackInTheBoxVent_");
                 __instance.graphic.sprite = isSpecialVent ?  Trickster.getTricksterVentButtonSprite() : defaultVentSprite;
@@ -173,27 +173,27 @@ namespace TheOtherRoles.Patches {
                 KillAnimationCoPerformKillPatch.hideNextAnimation = true;  // dont jump out of bounds!
                 return false;
             }
-            if (__instance.isActiveAndEnabled && __instance.currentTarget && !__instance.isCoolingDown && !CachedPlayer.LocalPlayer.Data.IsDead && CachedPlayer.LocalPlayer.PlayerControl.CanMove) {
+            if (__instance.isActiveAndEnabled && __instance.currentTarget && !__instance.isCoolingDown && !PlayerControl.LocalPlayer.Data.IsDead && PlayerControl.LocalPlayer.CanMove) {
                 // Deputy handcuff update.
-                if (Deputy.handcuffedPlayers.Contains(CachedPlayer.LocalPlayer.PlayerId)) {
+                if (Deputy.handcuffedPlayers.Contains(PlayerControl.LocalPlayer.PlayerId)) {
                     Deputy.setHandcuffedKnows();
                     return false;
                 }
                 
                 // Use an unchecked kill command, to allow shorter kill cooldowns etc. without getting kicked
-                MurderAttemptResult res = Helpers.checkMurderAttemptAndKill(CachedPlayer.LocalPlayer.PlayerControl, __instance.currentTarget);
+                MurderAttemptResult res = Helpers.checkMurderAttemptAndKill(PlayerControl.LocalPlayer, __instance.currentTarget);
                 // Handle blank kill
                 if (res == MurderAttemptResult.BlankKill) {
-                    CachedPlayer.LocalPlayer.PlayerControl.killTimer = GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown;
-                    if (CachedPlayer.LocalPlayer.PlayerControl == Cleaner.cleaner)
+                    PlayerControl.LocalPlayer.killTimer = GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown;
+                    if (PlayerControl.LocalPlayer == Cleaner.cleaner)
                         Cleaner.cleaner.killTimer = HudManagerStartPatch.cleanerCleanButton.Timer = HudManagerStartPatch.cleanerCleanButton.MaxTimer;
-                    else if (CachedPlayer.LocalPlayer.PlayerControl == Warlock.warlock)
+                    else if (PlayerControl.LocalPlayer == Warlock.warlock)
                         Warlock.warlock.killTimer = HudManagerStartPatch.warlockCurseButton.Timer = HudManagerStartPatch.warlockCurseButton.MaxTimer;
-                    else if (CachedPlayer.LocalPlayer.PlayerControl == Mini.mini && Mini.mini.Data.Role.IsImpostor)
+                    else if (PlayerControl.LocalPlayer == Mini.mini && Mini.mini.Data.Role.IsImpostor)
                         Mini.mini.SetKillTimer(GameOptionsManager.Instance.currentNormalGameOptions.KillCooldown * (Mini.isGrownUp() ? 0.66f : 2f));
-                    else if (CachedPlayer.LocalPlayer.PlayerControl == Witch.witch)
+                    else if (PlayerControl.LocalPlayer == Witch.witch)
                         Witch.witch.killTimer = HudManagerStartPatch.witchSpellButton.Timer = HudManagerStartPatch.witchSpellButton.MaxTimer;
-                    else if (CachedPlayer.LocalPlayer.PlayerControl == Ninja.ninja)
+                    else if (PlayerControl.LocalPlayer == Ninja.ninja)
                         Ninja.ninja.killTimer = HudManagerStartPatch.ninjaButton.Timer = HudManagerStartPatch.ninjaButton.MaxTimer;
                 }
                 __instance.SetTarget(null);
@@ -206,8 +206,8 @@ namespace TheOtherRoles.Patches {
     class SabotageButtonRefreshPatch {
         static void Postfix() {
             // Mafia disable sabotage button for Janitor and sometimes for Mafioso
-            bool blockSabotageJanitor = (Janitor.janitor != null && Janitor.janitor == CachedPlayer.LocalPlayer.PlayerControl);
-            bool blockSabotageMafioso = (Mafioso.mafioso != null && Mafioso.mafioso == CachedPlayer.LocalPlayer.PlayerControl && Godfather.godfather != null && !Godfather.godfather.Data.IsDead);
+            bool blockSabotageJanitor = (Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer);
+            bool blockSabotageMafioso = (Mafioso.mafioso != null && Mafioso.mafioso == PlayerControl.LocalPlayer && Godfather.godfather != null && !Godfather.godfather.Data.IsDead);
             if (blockSabotageJanitor || blockSabotageMafioso) {
                 FastDestroyableSingleton<HudManager>.Instance.SabotageButton.SetDisabled();
             }
@@ -217,8 +217,8 @@ namespace TheOtherRoles.Patches {
     [HarmonyPatch(typeof(ReportButton), nameof(ReportButton.DoClick))]
     class ReportButtonDoClickPatch {
         public static bool Prefix(ReportButton __instance) {
-            if (__instance.isActiveAndEnabled && Deputy.handcuffedPlayers.Contains(CachedPlayer.LocalPlayer.PlayerId) && __instance.graphic.color == Palette.EnabledColor) Deputy.setHandcuffedKnows();
-            return !Deputy.handcuffedKnows.ContainsKey(CachedPlayer.LocalPlayer.PlayerId);
+            if (__instance.isActiveAndEnabled && Deputy.handcuffedPlayers.Contains(PlayerControl.LocalPlayer.PlayerId) && __instance.graphic.color == Palette.EnabledColor) Deputy.setHandcuffedKnows();
+            return !Deputy.handcuffedKnows.ContainsKey(PlayerControl.LocalPlayer.PlayerId);
         }
     }
 
@@ -229,17 +229,17 @@ namespace TheOtherRoles.Patches {
             var statusText = "";
 
             // Deactivate emergency button for Swapper
-            if (Swapper.swapper != null && Swapper.swapper == CachedPlayer.LocalPlayer.PlayerControl && !Swapper.canCallEmergency) {
+            if (Swapper.swapper != null && Swapper.swapper == PlayerControl.LocalPlayer && !Swapper.canCallEmergency) {
                 roleCanCallEmergency = false;
                 statusText = "The Swapper can't start an emergency meeting";
             }
             // Potentially deactivate emergency button for Jester
-            if (Jester.jester != null && Jester.jester == CachedPlayer.LocalPlayer.PlayerControl && !Jester.canCallEmergency) {
+            if (Jester.jester != null && Jester.jester == PlayerControl.LocalPlayer && !Jester.canCallEmergency) {
                 roleCanCallEmergency = false;
                 statusText = "The Jester can't start an emergency meeting";
             }
             // Potentially deactivate emergency button for Lawyer/Prosecutor
-            if (Lawyer.lawyer != null && Lawyer.lawyer == CachedPlayer.LocalPlayer.PlayerControl && !Lawyer.canCallEmergency) {
+            if (Lawyer.lawyer != null && Lawyer.lawyer == PlayerControl.LocalPlayer && !Lawyer.canCallEmergency) {
                 roleCanCallEmergency = false;
                 statusText = "The Lawyer can't start an emergency meeting";
                 if (Lawyer.isProsecutor) statusText = "The Prosecutor can't start an emergency meeting";
@@ -256,9 +256,9 @@ namespace TheOtherRoles.Patches {
 
             // Handle max number of meetings
             if (__instance.state == 1) {
-                int localRemaining = CachedPlayer.LocalPlayer.PlayerControl.RemainingEmergencies;
+                int localRemaining = PlayerControl.LocalPlayer.RemainingEmergencies;
                 int teamRemaining = Mathf.Max(0, maxNumberOfMeetings - meetingsCount);
-                int remaining = Mathf.Min(localRemaining, (Mayor.mayor != null && Mayor.mayor == CachedPlayer.LocalPlayer.PlayerControl) ? 1 : teamRemaining);
+                int remaining = Mathf.Min(localRemaining, (Mayor.mayor != null && Mayor.mayor == PlayerControl.LocalPlayer) ? 1 : teamRemaining);
                 __instance.NumberText.text = $"{localRemaining.ToString()} and the ship has {teamRemaining.ToString()}";
                 __instance.ButtonActive = remaining > 0;
                 __instance.ClosedLid.gameObject.SetActive(!__instance.ButtonActive);
@@ -273,7 +273,7 @@ namespace TheOtherRoles.Patches {
     public static class ConsoleCanUsePatch {
         public static bool Prefix(ref float __result, Console __instance, [HarmonyArgument(0)] NetworkedPlayerInfo pc, [HarmonyArgument(1)] out bool canUse, [HarmonyArgument(2)] out bool couldUse) {
             canUse = couldUse = false;
-            if (Swapper.swapper != null && Swapper.swapper == CachedPlayer.LocalPlayer.PlayerControl)
+            if (Swapper.swapper != null && Swapper.swapper == PlayerControl.LocalPlayer)
                 return !__instance.TaskTypes.Any(x => x == TaskTypes.FixLights || x == TaskTypes.FixComms);
             if (__instance.AllowImpostor) return true;
             if (!Helpers.hasFakeTasks(pc.Object)) return true;
@@ -286,7 +286,7 @@ namespace TheOtherRoles.Patches {
     class CommsMinigameBeginPatch {
         static void Postfix(TuneRadioMinigame __instance) {
             // Block Swapper from fixing comms. Still looking for a better way to do this, but deleting the task doesn't seem like a viable option since then the camera, admin table, ... work while comms are out
-            if (Swapper.swapper != null && Swapper.swapper == CachedPlayer.LocalPlayer.PlayerControl) {
+            if (Swapper.swapper != null && Swapper.swapper == PlayerControl.LocalPlayer) {
                 __instance.Close();
             }
         }
@@ -296,7 +296,7 @@ namespace TheOtherRoles.Patches {
     class LightsMinigameBeginPatch {
         static void Postfix(SwitchMinigame __instance) {
             // Block Swapper from fixing lights. One could also just delete the PlayerTask, but I wanted to do it the same way as with coms for now.
-            if (Swapper.swapper != null && Swapper.swapper == CachedPlayer.LocalPlayer.PlayerControl) {
+            if (Swapper.swapper != null && Swapper.swapper == PlayerControl.LocalPlayer) {
                 __instance.Close();
             }
         }
@@ -309,7 +309,7 @@ namespace TheOtherRoles.Patches {
         [HarmonyPatch(typeof(VitalsMinigame), nameof(VitalsMinigame.Begin))]
         class VitalsMinigameStartPatch {
             static void Postfix(VitalsMinigame __instance) {
-                if (Hacker.hacker != null && CachedPlayer.LocalPlayer.PlayerControl == Hacker.hacker) {
+                if (Hacker.hacker != null && PlayerControl.LocalPlayer == Hacker.hacker) {
                     hackerTexts = new List<TMPro.TextMeshPro>();
                     foreach (VitalsPanel panel in __instance.vitals) {
                         TMPro.TextMeshPro text = UnityEngine.Object.Instantiate(__instance.SabText, panel.transform);
@@ -337,7 +337,7 @@ namespace TheOtherRoles.Patches {
             static void Postfix(VitalsMinigame __instance) {
                 // Hacker show time since death
                 
-                if (Hacker.hacker != null && Hacker.hacker == CachedPlayer.LocalPlayer.PlayerControl && Hacker.hackerTimer > 0) {
+                if (Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && Hacker.hackerTimer > 0) {
                     for (int k = 0; k < __instance.vitals.Length; k++) {
                         VitalsPanel vitalsPanel = __instance.vitals[k];
                         NetworkedPlayerInfo player = vitalsPanel.PlayerInfo;
@@ -376,7 +376,7 @@ namespace TheOtherRoles.Patches {
                 __instance.timer = 0f;
                 players = new Dictionary<SystemTypes, List<Color>>();
                 bool commsActive = false;
-                    foreach (PlayerTask task in CachedPlayer.LocalPlayer.PlayerControl.myTasks.GetFastEnumerator())
+                    foreach (PlayerTask task in PlayerControl.LocalPlayer.myTasks.GetFastEnumerator())
                         if (task.TaskType == TaskTypes.FixComms) commsActive = true;       
 
 
@@ -461,7 +461,7 @@ namespace TheOtherRoles.Patches {
             private static Material newMat;
             static void Postfix(CounterArea __instance) {
                 // Hacker display saved colors on the admin panel
-                bool showHackerInfo = Hacker.hacker != null && Hacker.hacker == CachedPlayer.LocalPlayer.PlayerControl && Hacker.hackerTimer > 0;
+                bool showHackerInfo = Hacker.hacker != null && Hacker.hacker == PlayerControl.LocalPlayer && Hacker.hackerTimer > 0;
                 if (players.ContainsKey(__instance.RoomType)) {
                     List<Color> colors = players[__instance.RoomType];
                     int i = -1;
@@ -545,7 +545,7 @@ namespace TheOtherRoles.Patches {
                     timer = 0f;
                 }
 
-                if ((__instance.isStatic || update) && !PlayerTask.PlayerHasTaskOfType<IHudOverrideTask>(CachedPlayer.LocalPlayer.PlayerControl)) {
+                if ((__instance.isStatic || update) && !PlayerTask.PlayerHasTaskOfType<IHudOverrideTask>(PlayerControl.LocalPlayer)) {
                     __instance.isStatic = false;
                     for (int i = 0; i < __instance.ViewPorts.Length; i++) {
                         __instance.ViewPorts[i].sharedMaterial = __instance.DefaultMaterial;
@@ -555,7 +555,7 @@ namespace TheOtherRoles.Patches {
                         else
                             __instance.ViewPorts[i].sharedMaterial = __instance.StaticMaterial;
                     }
-                } else if (!__instance.isStatic && PlayerTask.PlayerHasTaskOfType<HudOverrideTask>(CachedPlayer.LocalPlayer.PlayerControl)) {
+                } else if (!__instance.isStatic && PlayerTask.PlayerHasTaskOfType<HudOverrideTask>(PlayerControl.LocalPlayer)) {
                     __instance.isStatic = true;
                     for (int j = 0; j < __instance.ViewPorts.Length; j++) {
                         __instance.ViewPorts[j].sharedMaterial = __instance.StaticMaterial;
@@ -648,12 +648,12 @@ namespace TheOtherRoles.Patches {
                 }
             }
 
-            isLightsOut = CachedPlayer.LocalPlayer.PlayerControl.myTasks.ToArray().Any(x => x.name.Contains("FixLightsTask")) || Trickster.lightsOutTimer > 0;
-            bool ignoreNightVision = CustomOptionHolder.camsNoNightVisionIfImpVision.getBool() && Helpers.hasImpVision(GameData.Instance.GetPlayerById(CachedPlayer.LocalPlayer.PlayerId)) || CachedPlayer.LocalPlayer.Data.IsDead;
+            isLightsOut = PlayerControl.LocalPlayer.myTasks.ToArray().Any(x => x.name.Contains("FixLightsTask")) || Trickster.lightsOutTimer > 0;
+            bool ignoreNightVision = CustomOptionHolder.camsNoNightVisionIfImpVision.getBool() && Helpers.hasImpVision(GameData.Instance.GetPlayerById(PlayerControl.LocalPlayer.PlayerId)) || PlayerControl.LocalPlayer.Data.IsDead;
             bool nightVisionEnabled = CustomOptionHolder.camsNightVision.getBool();
 
             if (isLightsOut && !nightVisionIsActive && nightVisionEnabled && !ignoreNightVision) {  // only update when something changed!
-                foreach (PlayerControl pc in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl pc in PlayerControl.AllPlayerControls) {
                     if (pc == Ninja.ninja && Ninja.invisibleTimer > 0f) {
                         continue;
                     }
@@ -682,7 +682,7 @@ namespace TheOtherRoles.Patches {
 
             if (nightVisionIsActive) {
                 nightVisionIsActive = false;
-                foreach (PlayerControl pc in CachedPlayer.AllPlayers) {
+                foreach (PlayerControl pc in PlayerControl.AllPlayerControls) {
                     if (Camouflager.camouflageTimer > 0) {
                         pc.setLook("", 6, "", "", "", "", false);
                     } else if (pc == Morphling.morphling && Morphling.morphTimer > 0) {
@@ -727,7 +727,7 @@ namespace TheOtherRoles.Patches {
     class MedScanMinigameFixedUpdatePatch {
         static void Prefix(MedScanMinigame __instance) {
             if (TORMapOptions.allowParallelMedBayScans) {
-                __instance.medscan.CurrentUser = CachedPlayer.LocalPlayer.PlayerId;
+                __instance.medscan.CurrentUser = PlayerControl.LocalPlayer.PlayerId;
                 __instance.medscan.UsersList.Clear();
             }
         }
index 1c9da7bf2d0fbed9f975a6ac97b41e60434f42ce..cecd478be73a27406a56d4426c7b6caac32447cc 100644 (file)
@@ -10,7 +10,7 @@ using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
 using System;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
 using AmongUs.Data;
@@ -77,6 +77,7 @@ namespace TheOtherRoles
         Vip,
         Invert,
         Chameleon,
+        Armored,
         Shifter
     }
 
@@ -152,6 +153,7 @@ namespace TheOtherRoles
         ShareRoom,
         YoyoMarkLocation,
         YoyoBlink,
+        BreakArmor,
 
         // Gamemode
         SetGuesserGm,
@@ -207,7 +209,7 @@ namespace TheOtherRoles
 
         public static void forceEnd() {
             if (AmongUsClient.Instance.GameState != InnerNet.InnerNetClient.GameStates.Started) return;
-            foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
             {
                 if (!player.Data.Role.IsImpostor)
                 {
@@ -251,7 +253,7 @@ namespace TheOtherRoles
         }
 
         public static void setRole(byte roleId, byte playerId) {
-            foreach (PlayerControl player in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls) {
                 if (player.PlayerId == playerId) {
                     switch ((RoleId)roleId) {
                     case RoleId.Jester:
@@ -433,6 +435,9 @@ namespace TheOtherRoles
                 case RoleId.Chameleon:
                     Chameleon.chameleon.Add(player);
                     break;
+                case RoleId.Armored:
+                    Armored.armored = player;
+                    break;
                 case RoleId.Shifter:
                     Shifter.shifter = player;
                     break;
@@ -533,7 +538,7 @@ namespace TheOtherRoles
         public static void timeMasterRewindTime() {
             TimeMaster.shieldActive = false; // Shield is no longer active when rewinding
             SoundEffectsManager.stop("timemasterShield");  // Shield sound stopped when rewinding
-            if(TimeMaster.timeMaster != null && TimeMaster.timeMaster == CachedPlayer.LocalPlayer.PlayerControl) {
+            if(TimeMaster.timeMaster != null && TimeMaster.timeMaster == PlayerControl.LocalPlayer) {
                 resetTimeMasterButton();
             }
             FastDestroyableSingleton<HudManager>.Instance.FullScreen.color = new Color(0f, 0.5f, 0.8f, 0.3f);
@@ -543,7 +548,7 @@ namespace TheOtherRoles
                 if (p == 1f) FastDestroyableSingleton<HudManager>.Instance.FullScreen.enabled = false;
             })));
 
-            if (TimeMaster.timeMaster == null || CachedPlayer.LocalPlayer.PlayerControl == TimeMaster.timeMaster) return; // Time Master himself does not rewind
+            if (TimeMaster.timeMaster == null || PlayerControl.LocalPlayer == TimeMaster.timeMaster) return; // Time Master himself does not rewind
 
             TimeMaster.isRewinding = true;
 
@@ -551,7 +556,7 @@ namespace TheOtherRoles
                 MapBehaviour.Instance.Close();
             if (Minigame.Instance)
                 Minigame.Instance.ForceClose();
-            CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
+            PlayerControl.LocalPlayer.moveable = false;
         }
 
         public static void timeMasterShield() {
@@ -570,9 +575,9 @@ namespace TheOtherRoles
         public static void shieldedMurderAttempt() {
             if (Medic.shielded == null || Medic.medic == null) return;
             
-            bool isShieldedAndShow = Medic.shielded == CachedPlayer.LocalPlayer.PlayerControl && Medic.showAttemptToShielded;
+            bool isShieldedAndShow = Medic.shielded == PlayerControl.LocalPlayer && Medic.showAttemptToShielded;
             isShieldedAndShow = isShieldedAndShow && (Medic.meetingAfterShielding || !Medic.showShieldAfterMeeting);  // Dont show attempt, if shield is not shown yet
-            bool isMedicAndShow = Medic.medic == CachedPlayer.LocalPlayer.PlayerControl && Medic.showAttemptToMedic;
+            bool isMedicAndShow = Medic.medic == PlayerControl.LocalPlayer && Medic.showAttemptToMedic;
 
             if (isShieldedAndShow || isMedicAndShow || Helpers.shouldShowGhostInfo()) Helpers.showFlash(Palette.ImpostorRed, duration: 0.5f, "Failed Murder Attempt on Shielded Player");
         }
@@ -590,7 +595,7 @@ namespace TheOtherRoles
                 oldShifter.Exiled();
                 GameHistory.overrideDeathReasonAndKiller(oldShifter, DeadPlayer.CustomDeathReason.Shift, player);
                 if (oldShifter == Lawyer.target && AmongUsClient.Instance.AmHost && Lawyer.lawyer != null) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LawyerPromotesToPursuer, Hazel.SendOption.Reliable, -1);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                     RPCProcedure.lawyerPromotesToPursuer();
                 }
@@ -600,7 +605,7 @@ namespace TheOtherRoles
             Shifter.shiftRole(oldShifter, player);
 
             // Set cooldowns to max for both players
-            if (CachedPlayer.LocalPlayer.PlayerControl == oldShifter || CachedPlayer.LocalPlayer.PlayerControl == player)
+            if (PlayerControl.LocalPlayer == oldShifter || PlayerControl.LocalPlayer == player)
                 CustomButton.ResetAllCooldowns();
         }
 
@@ -626,7 +631,7 @@ namespace TheOtherRoles
 
             Camouflager.camouflageTimer = Camouflager.duration;
             if (Helpers.MushroomSabotageActive()) return; // Dont overwrite the fungle "camo"
-            foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                 player.setLook("", 6, "", "", "", "");
 
         }
@@ -638,7 +643,7 @@ namespace TheOtherRoles
             }
 
             if (Vampire.vampire == null) return;
-            foreach (PlayerControl player in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls) {
                 if (player.PlayerId == targetId && !player.Data.IsDead) {
                         Vampire.bitten = player;
                 }
@@ -654,7 +659,7 @@ namespace TheOtherRoles
 
         public static void trackerUsedTracker(byte targetId) {
             Tracker.usedTracker = true;
-            foreach (PlayerControl player in CachedPlayer.AllPlayers)
+            foreach (PlayerControl player in PlayerControl.AllPlayerControls)
                 if (player.PlayerId == targetId)
                     Tracker.tracked = player;
         }
@@ -694,11 +699,11 @@ namespace TheOtherRoles
                 }
                 erasePlayerRoles(player.PlayerId, true);
                 Sidekick.sidekick = player;
-                if (player.PlayerId == CachedPlayer.LocalPlayer.PlayerId) CachedPlayer.LocalPlayer.PlayerControl.moveable = true;
+                if (player.PlayerId == PlayerControl.LocalPlayer.PlayerId) PlayerControl.LocalPlayer.moveable = true;
                 if (wasSpy || wasImpostor) Sidekick.wasTeamRed = true;
                 Sidekick.wasSpy = wasSpy;
                 Sidekick.wasImpostor = wasImpostor;
-                if (player == CachedPlayer.LocalPlayer.PlayerControl) SoundEffectsManager.play("jackalSidekick");
+                if (player == PlayerControl.LocalPlayer) SoundEffectsManager.play("jackalSidekick");
                 if (HandleGuesser.isGuesserGm && CustomOptionHolder.guesserGamemodeSidekickIsAlwaysGuesser.getBool() && !HandleGuesser.isGuesser(targetId))
                     setGuesserGm(targetId);
             }
@@ -788,6 +793,7 @@ namespace TheOtherRoles
                 if (Vip.vip.Any(x => x.PlayerId == player.PlayerId)) Vip.vip.RemoveAll(x => x.PlayerId == player.PlayerId);
                 if (Invert.invert.Any(x => x.PlayerId == player.PlayerId)) Invert.invert.RemoveAll(x => x.PlayerId == player.PlayerId);
                 if (Chameleon.chameleon.Any(x => x.PlayerId == player.PlayerId)) Chameleon.chameleon.RemoveAll(x => x.PlayerId == player.PlayerId);
+                if (player == Armored.armored) Armored.clearAndReload();
             }
         }
 
@@ -823,7 +829,7 @@ namespace TheOtherRoles
             position.x = BitConverter.ToSingle(buff, 0 * sizeof(float));
             position.y = BitConverter.ToSingle(buff, 1 * sizeof(float));
             new NinjaTrace(position, Ninja.traceTime);
-            if (CachedPlayer.LocalPlayer.PlayerControl != Ninja.ninja)
+            if (PlayerControl.LocalPlayer != Ninja.ninja)
                 Ninja.ninjaMarked = null;
         }
 
@@ -844,7 +850,7 @@ namespace TheOtherRoles
 
             target.setLook("", 6, "", "", "", "");
             Color color = Color.clear;
-            bool canSee = CachedPlayer.LocalPlayer.Data.Role.IsImpostor || CachedPlayer.LocalPlayer.Data.IsDead;
+            bool canSee = PlayerControl.LocalPlayer.Data.Role.IsImpostor || PlayerControl.LocalPlayer.Data.IsDead;
             if (canSee) color.a = 0.1f;
             target.cosmetics.currentBodySprite.BodySprite.color = color;
             target.cosmetics.colorBlindText.gameObject.SetActive(false);
@@ -874,7 +880,7 @@ namespace TheOtherRoles
         public static void lightsOut() {
             Trickster.lightsOutTimer = Trickster.lightsOutDuration;
             // If the local player is impostor indicate lights out
-            if(Helpers.hasImpVision(GameData.Instance.GetPlayerById(CachedPlayer.LocalPlayer.PlayerId))) {
+            if(Helpers.hasImpVision(GameData.Instance.GetPlayerById(PlayerControl.LocalPlayer.PlayerId))) {
                 new CustomMessage("Lights are out", Trickster.lightsOutDuration);
             }
         }
@@ -906,7 +912,7 @@ namespace TheOtherRoles
             }
 
 
-            if (CachedPlayer.LocalPlayer.PlayerControl == SecurityGuard.securityGuard) {
+            if (PlayerControl.LocalPlayer == SecurityGuard.securityGuard) {
                 camera.gameObject.SetActive(true);
                 camera.gameObject.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, 0.5f);
             } else {
@@ -920,7 +926,7 @@ namespace TheOtherRoles
             if (vent == null) return;
 
             SecurityGuard.remainingScrews -= SecurityGuard.ventPrice;
-            if (CachedPlayer.LocalPlayer.PlayerControl == SecurityGuard.securityGuard) {
+            if (PlayerControl.LocalPlayer == SecurityGuard.securityGuard) {
                 PowerTools.SpriteAnim animator = vent.GetComponent<PowerTools.SpriteAnim>(); 
                 
                 vent.EnterVentAnim = vent.ExitVentAnim = null;
@@ -944,7 +950,7 @@ namespace TheOtherRoles
 
         public static void arsonistWin() {
             Arsonist.triggerArsonistWin = true;
-            foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                 if (p != Arsonist.arsonist && !p.Data.IsDead) {
                     p.Exiled();
                     overrideDeathReasonAndKiller(p, DeadPlayer.CustomDeathReason.Arson, Arsonist.arsonist);
@@ -963,7 +969,7 @@ namespace TheOtherRoles
 
             Pursuer.pursuer = player;
 
-            if (player.PlayerId == CachedPlayer.LocalPlayer.PlayerId && client != null) {
+            if (player.PlayerId == PlayerControl.LocalPlayer.PlayerId && client != null) {
                     Transform playerInfoTransform = client.cosmetics.nameText.transform.parent.FindChild("Info");
                     TMPro.TextMeshPro playerInfo = playerInfoTransform != null ? playerInfoTransform.GetComponent<TMPro.TextMeshPro>() : null;
                     if (playerInfo != null) playerInfo.text = "";
@@ -988,7 +994,7 @@ namespace TheOtherRoles
             bool lawyerDiedAdditionally = false;
             if (Lawyer.lawyer != null && !Lawyer.isProsecutor && Lawyer.lawyer.PlayerId == killerId && Lawyer.target != null && Lawyer.target.PlayerId == dyingTargetId) {
                 // Lawyer guessed client.
-                if (CachedPlayer.LocalPlayer.PlayerControl == Lawyer.lawyer) {
+                if (PlayerControl.LocalPlayer == Lawyer.lawyer) {
                     FastDestroyableSingleton<HudManager>.Instance.KillOverlay.ShowKillAnimation(Lawyer.lawyer.Data, Lawyer.lawyer.Data);
                     if (MeetingHudPatch.guesserUI != null) MeetingHudPatch.guesserUIExitButton.OnClick.Invoke();
                 }
@@ -1023,10 +1029,10 @@ namespace TheOtherRoles
                     MeetingHud.Instance.CheckForEndVoting();
             }
             if (FastDestroyableSingleton<HudManager>.Instance != null && guesser != null)
-                if (CachedPlayer.LocalPlayer.PlayerControl == dyingTarget) {
+                if (PlayerControl.LocalPlayer == dyingTarget) {
                     FastDestroyableSingleton<HudManager>.Instance.KillOverlay.ShowKillAnimation(guesser.Data, dyingTarget.Data);
                     if (MeetingHudPatch.guesserUI != null) MeetingHudPatch.guesserUIExitButton.OnClick.Invoke();
-                } else if (dyingLoverPartner != null && CachedPlayer.LocalPlayer.PlayerControl == dyingLoverPartner) {
+                } else if (dyingLoverPartner != null && PlayerControl.LocalPlayer == dyingLoverPartner) {
                     FastDestroyableSingleton<HudManager>.Instance.KillOverlay.ShowKillAnimation(dyingLoverPartner.Data, dyingLoverPartner.Data);
                     if (MeetingHudPatch.guesserUI != null) MeetingHudPatch.guesserUIExitButton.OnClick.Invoke();
                 }
@@ -1047,7 +1053,7 @@ namespace TheOtherRoles
 
 
             PlayerControl guessedTarget = Helpers.playerById(guessedTargetId);
-            if (CachedPlayer.LocalPlayer.Data.IsDead && guessedTarget != null && guesser != null) {
+            if (PlayerControl.LocalPlayer.Data.IsDead && guessedTarget != null && guesser != null) {
                 RoleInfo roleInfo = RoleInfo.allRoleInfos.FirstOrDefault(x => (byte)x.roleId == guessedRoleId);
                 string msg = $"{guesser.Data.PlayerName} guessed the role {roleInfo?.name ?? ""} for {guessedTarget.Data.PlayerName}!";
                 if (AmongUsClient.Instance.AmClient && FastDestroyableSingleton<HudManager>.Instance)
@@ -1165,7 +1171,7 @@ namespace TheOtherRoles
         public static void huntedRewindTime(byte playerId) {
             Hunted.timeshieldActive.Remove(playerId); // Shield is no longer active when rewinding
             SoundEffectsManager.stop("timemasterShield");  // Shield sound stopped when rewinding
-            if (playerId == CachedPlayer.LocalPlayer.PlayerControl.PlayerId) {
+            if (playerId == PlayerControl.LocalPlayer.PlayerId) {
                 resetHuntedRewindButton();
             }
             FastDestroyableSingleton<HudManager>.Instance.FullScreen.color = new Color(0f, 0.5f, 0.8f, 0.3f);
@@ -1175,7 +1181,7 @@ namespace TheOtherRoles
                 if (p == 1f) FastDestroyableSingleton<HudManager>.Instance.FullScreen.enabled = false;
             })));
 
-            if (!CachedPlayer.LocalPlayer.Data.Role.IsImpostor) return; // only rewind hunter
+            if (!PlayerControl.LocalPlayer.Data.Role.IsImpostor) return; // only rewind hunter
 
             TimeMaster.isRewinding = true;
 
@@ -1183,7 +1189,7 @@ namespace TheOtherRoles
                 MapBehaviour.Instance.Close();
             if (Minigame.Instance)
                 Minigame.Instance.ForceClose();
-            CachedPlayer.LocalPlayer.PlayerControl.moveable = false;
+            PlayerControl.LocalPlayer.moveable = false;
         }
 
         public static void propHuntStartTimer(bool blackout = false) {
@@ -1340,6 +1346,14 @@ namespace TheOtherRoles
             if (Chameleon.chameleon.Any(x => x.PlayerId == Yoyo.yoyo.PlayerId)) // Make the Yoyo visible if chameleon!
                 Chameleon.lastMoved[Yoyo.yoyo.PlayerId] = Time.time;            
         }
+
+        public static void breakArmor() {
+            if (Armored.armored == null || Armored.isBrokenArmor) return;
+            Armored.isBrokenArmor = true;
+            if (PlayerControl.LocalPlayer.Data.IsDead) {
+                Armored.armored.ShowFailedMurder();
+            }
+        }
     }
 
     [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))]
@@ -1596,6 +1610,9 @@ namespace TheOtherRoles
                 case (byte)CustomRPC.YoyoBlink:
                     RPCProcedure.yoyoBlink(reader.ReadByte() == byte.MaxValue, reader.ReadBytesAndSize());
                     break;
+                case (byte)CustomRPC.BreakArmor:
+                    RPCProcedure.breakArmor();
+                    break;
 
                 // Game mode
                 case (byte)CustomRPC.SetGuesserGm:
index 68a0d2d3b3a77ecb3bc9e2e52109c4a6b3e21c2a..38ec86359f4a7cd3a2bc00db31aeb960bfe45191 100644 (file)
Binary files a/TheOtherRoles/Resources/AnimatedVentSealed.png and b/TheOtherRoles/Resources/AnimatedVentSealed.png differ
index 5be952aeecf37d68e53e443b2f7e9b7a1adf2cc9..4d70329f20f15b18969fb543a36e35060bfed85d 100644 (file)
Binary files a/TheOtherRoles/Resources/Arrow.png and b/TheOtherRoles/Resources/Arrow.png differ
index 73d63decd86cc70f6929dd6d07ea14856d153fb2..9a5bc8b28c0bbd5f591bfcadb43b3b09ab8a69cb 100644 (file)
Binary files a/TheOtherRoles/Resources/Banner.png and b/TheOtherRoles/Resources/Banner.png differ
index 29ce90b962f79334f1771910b7a9de5ee234d67f..584a0d0ac8eebc72b6dd4749ca6644ca786ef992 100644 (file)
Binary files a/TheOtherRoles/Resources/Banner2.png and b/TheOtherRoles/Resources/Banner2.png differ
index ba81a86b614a26dfdaddbfd61283ac1c1c6f7b62..0961d06125b107978b8f3967e18f06a0616c2002 100644 (file)
Binary files a/TheOtherRoles/Resources/Blood1.png and b/TheOtherRoles/Resources/Blood1.png differ
index 5f32a41df722650168274609d87b9ff894a6e5ce..62a142883daaa18e7d7da754b7448f8a862a9d20 100644 (file)
Binary files a/TheOtherRoles/Resources/Blood2.png and b/TheOtherRoles/Resources/Blood2.png differ
index 5b0013b99122313d44ddc345c842d8411ccf4916..f7424ba4da126b17f473fb02c9e24d8e79476a75 100644 (file)
Binary files a/TheOtherRoles/Resources/Blood3.png and b/TheOtherRoles/Resources/Blood3.png differ
index 5d9fcb6712790d57d2f1629222a250c6d5fbd98e..4fb68e16d0345287239696e519b4947b0b72499e 100644 (file)
Binary files a/TheOtherRoles/Resources/Bomb.png and b/TheOtherRoles/Resources/Bomb.png differ
index 1d6dbeee87ed968bfbee47824b12b0bd8a29d099..a59d5af2b718f5dcf4cd4985bb3050a30b2e7d4b 100644 (file)
Binary files a/TheOtherRoles/Resources/BombBackground.png and b/TheOtherRoles/Resources/BombBackground.png differ
index f7df1ded1d2897e5f35955333fad5cff73012bfb..45ae593183db8d206856217d02bc6c6dadea33c0 100644 (file)
Binary files a/TheOtherRoles/Resources/Bomb_Button_Defuse.png and b/TheOtherRoles/Resources/Bomb_Button_Defuse.png differ
index 53847e3c4232571e794f6abd309b9e5743fe8355..081bf7c029a40ae1d8844d54a0bda8b33e729599 100644 (file)
Binary files a/TheOtherRoles/Resources/Bomb_Button_Plant.png and b/TheOtherRoles/Resources/Bomb_Button_Plant.png differ
index 91fec8ea56a63b327fb4d6f96282cc3ac6f247d2..6e1f713e27272f2c029b40c544b1cca644bb5255 100644 (file)
Binary files a/TheOtherRoles/Resources/CamoButton.png and b/TheOtherRoles/Resources/CamoButton.png differ
index 952fd9c53769b53cd42517ba490f6767a54c5c89..ecdcf44198294541b968a28dd2ff7aec353e6c07 100644 (file)
Binary files a/TheOtherRoles/Resources/CentralLowerBlocked.png and b/TheOtherRoles/Resources/CentralLowerBlocked.png differ
index 438a6eddc806d175e874cc3a2a1de4e241581a3b..5e15a48255666e15806889dd85470658f0cd6c92 100644 (file)
Binary files a/TheOtherRoles/Resources/CentralUpperBlocked.png and b/TheOtherRoles/Resources/CentralUpperBlocked.png differ
index 69a8c5c2e501269e23783989cd07615ba93d2d76..42392f26dd1b6a1bdab5f3a781d1266ace0c255c 100644 (file)
Binary files a/TheOtherRoles/Resources/CleanButton.png and b/TheOtherRoles/Resources/CleanButton.png differ
index ffe2bb2c9795c594bbcd2f0b96dbf9a0e9a7ea7f..f04685c69f77db5ab3311e9183d6e787f2d51b6e 100644 (file)
Binary files a/TheOtherRoles/Resources/CloseVentButton.png and b/TheOtherRoles/Resources/CloseVentButton.png differ
index 1db34bbf70cef738ff92b5ff32d2eebdeaa7f8ce..fff4a4b1577e5911d7ec3072d4e9c9ebef4871bd 100644 (file)
Binary files a/TheOtherRoles/Resources/Copy.png and b/TheOtherRoles/Resources/Copy.png differ
index f19ecd7889da51d5b11de328d84c62f03ab5444d..b1908d489792680c57503a0bdce0cafc90353cfa 100644 (file)
Binary files a/TheOtherRoles/Resources/CopyActive.png and b/TheOtherRoles/Resources/CopyActive.png differ
index 4d769648a2072f8842dbdbe8c799c285ea04e419..215611fc9ee194415f2ea59937b1b18c37ed02f5 100644 (file)
Binary files a/TheOtherRoles/Resources/CopyButton.png and b/TheOtherRoles/Resources/CopyButton.png differ
index c8f47cce48e9404ef115793e5d92db858d0bc9ea..341509b8b2acd72b8ce5815c400cec83fb972e64 100644 (file)
Binary files a/TheOtherRoles/Resources/CopyPasteBG.png and b/TheOtherRoles/Resources/CopyPasteBG.png differ
index dd8f59f4732664a9fa76d824e20008f49d0fe26b..98b820f2789b9341abbd0c33248840ea1e8469cf 100644 (file)
Binary files a/TheOtherRoles/Resources/CreditsButton.png and b/TheOtherRoles/Resources/CreditsButton.png differ
index a593620784bcedc1e3570f843a7f1c41dc7bc060..23b9fbd9cac887d55d974ea1bbf6615ce744bb7f 100644 (file)
Binary files a/TheOtherRoles/Resources/CurrentSettingsButton.png and b/TheOtherRoles/Resources/CurrentSettingsButton.png differ
index 0b2933079f0ccf7af2bc534ed7710a7c5ed585a3..b071c4fc936a8a6fea3e47508c26b2caa9482921 100644 (file)
Binary files a/TheOtherRoles/Resources/CurseButton.png and b/TheOtherRoles/Resources/CurseButton.png differ
index 140b7b9ddac9662372c42bbfbc48c80619946739..3c1bcf233d3a9fe92cd51a51a6e70de410776b52 100644 (file)
Binary files a/TheOtherRoles/Resources/CurseKillButton.png and b/TheOtherRoles/Resources/CurseKillButton.png differ
index c915e0578c3145d66204fb3cd11a2072aba28f40..25f70638299770a8c14a4b8d46cbb45666d0820e 100644 (file)
Binary files a/TheOtherRoles/Resources/DeputizeButton.png and b/TheOtherRoles/Resources/DeputizeButton.png differ
index b12991de687fcdc9881f514ab871bc62315aa802..3bda9bfdfe6f0070632cb06a700a502246b91fe3 100644 (file)
Binary files a/TheOtherRoles/Resources/DeputyHandcuffButton.png and b/TheOtherRoles/Resources/DeputyHandcuffButton.png differ
index 38e00baa20afa41caeeda774029d69110c764596..5f9fc33304b20927c45db8ca7a46676c08bb5eb3 100644 (file)
Binary files a/TheOtherRoles/Resources/DeputyHandcuffed.png and b/TheOtherRoles/Resources/DeputyHandcuffed.png differ
index dbc4b8da769db0838c2e1acf8e5204d2a56d2571..23bfae0d3ec6bf33b257579877cd5b3e36063c0e 100644 (file)
Binary files a/TheOtherRoles/Resources/DisguiseButton.png and b/TheOtherRoles/Resources/DisguiseButton.png differ
index c5531a37c359875581cb9e8f1913bafe697a7f58..ec80e379d950b1235924573dd0f62268f653d789 100644 (file)
Binary files a/TheOtherRoles/Resources/DouseButton.png and b/TheOtherRoles/Resources/DouseButton.png differ
index 57d3b881b9124d402537c9b709c3992f44fd0041..dd64f4e8b6a0e253839e637189aa2729f3fb8e39 100644 (file)
Binary files a/TheOtherRoles/Resources/EmergencyButton.png and b/TheOtherRoles/Resources/EmergencyButton.png differ
index 7cf31dd8c971b4b0f9cefaefc60418fcda12f389..ea0d890f850c9ba357fbbc2fd5c55eefae7109af 100644 (file)
Binary files a/TheOtherRoles/Resources/EraserButton.png and b/TheOtherRoles/Resources/EraserButton.png differ
index b47630255ecd4dd1ace0c9dc6c407cb4c6a3370e..d80fdfa9deb53f9063e4683cc4f2365906647594 100644 (file)
Binary files a/TheOtherRoles/Resources/FindButton.png and b/TheOtherRoles/Resources/FindButton.png differ
index 2bcd1ac0793a0eacfb1085d31799f20cb5f7dcef..f743f916bd80b2b81acebbd724ac67fd162bdeff 100644 (file)
Binary files a/TheOtherRoles/Resources/Footprint.png and b/TheOtherRoles/Resources/Footprint.png differ
index 16b157c5379b4ff32aa6e50c34bfa205832121c1..6f117ba8f8f2214baa4040f443753c19467c5011 100644 (file)
Binary files a/TheOtherRoles/Resources/FungleVentSealed.png and b/TheOtherRoles/Resources/FungleVentSealed.png differ
index c078e9a113255815682ac6f35526968a70af4188..3d2ca2c439d6bcaa9c2f18dad30395ea52435006 100644 (file)
Binary files a/TheOtherRoles/Resources/Garlic.png and b/TheOtherRoles/Resources/Garlic.png differ
index 0a3c8d358818abbcdd69c551114e4e47b64744bb..54a02e9a8dfce99b4c5fdac8cd225e3a64f59263 100644 (file)
Binary files a/TheOtherRoles/Resources/GarlicBackground.png and b/TheOtherRoles/Resources/GarlicBackground.png differ
index fcca3b4a20eaf2f5db1dda6db7ed7a9891e40870..3cb9816d7962216a9f42a6e544110b347f11c51b 100644 (file)
Binary files a/TheOtherRoles/Resources/GarlicButton.png and b/TheOtherRoles/Resources/GarlicButton.png differ
index 934acf3eace468db55958d5c6a58b789355a915f..3bdf675dee6d0cd26aa2fb4128cc2afb94f6835a 100644 (file)
Binary files a/TheOtherRoles/Resources/HackerButton.png and b/TheOtherRoles/Resources/HackerButton.png differ
index 9e8708a8836771984846355c90291cbcb08c181f..aa47a148a2aa81daca93e46e6c97573fbbc8cc63 100644 (file)
Binary files a/TheOtherRoles/Resources/HideNSeekArrowButton.png and b/TheOtherRoles/Resources/HideNSeekArrowButton.png differ
index dc6340f784796e0371a7686ef8fa2583ce622a61..d5aee83dcf07d99d2c01257a82b0f5778fde1cb5 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat10.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat10.png differ
index 132eb1a757c21b1e742390b0646b000ce1404e49..be553234a0d94272b5b2b9e3aea0509efe751aa8 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat10_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat10_back.png differ
index 399215023b8c3924caf35a16b762e1082071627d..f2162fce6e4682b9ce3567472619a269fc8c4f03 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive.png differ
index f790f25e83f4cf6a7099b3832166521235116b87..a7eb4bfd4b96a4a60e115ce55e98c619f6b59659 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat11_adaptive_back.png differ
index d3b3802bffe403ffe0c3ffda86e2c0a02b9fb526..8b2ead295da7d0e2857d617787f4b57fad282f7c 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat12.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat12.png differ
index 9adfa8da0b43b22faad07d3f489ae47cb6ff2ab2..4cafb04985acc1c38071e8051eab03ff0ca6d26f 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat12_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat12_back.png differ
index e89ae9d0712cdf88244fedeb07795b90da11e8c1..834ad66e25e8a4042a906398c13bc8f0d29d1ad4 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat13.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat13.png differ
index 348601102d82f0abdea6b9a8d71a6c5072784fd5..1f9913c47154ff4d4a749c3ffb5e38c6e0bd829a 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat13_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat13_back.png differ
index 7c679b7c88e200a16a8975ed57e4e5fbc09239d8..5dc5c039680485e37a65920b41ff5d4952c76df8 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat14.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat14.png differ
index 7726bd04f2f159f5684423d6b28179ee233dba05..f8ac32bc0a4f12ea3477bc4bdb50b6ebcb58a35e 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat14_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat14_back.png differ
index 1986ba3a0c88715e4f437cb09499a65a25994470..686cf2b59ff815b9296ed225307200184f398227 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat15.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat15.png differ
index 87057cf7371d2213c0005c7c8e310c3e9be56e48..03361831891517208076336dc7fe9416c0f24ef3 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat15_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat15_back.png differ
index ef69fa96d19eb1e9cdb35a2e814765bc751644dc..a2c63f0c81c058aa4769b58f4be618bf59c92ff0 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive.png differ
index 0963ce675e18b9bb3aeeec0cde72a48f269f7458..feaebab56d1fe992db5e549009233849134e1ab6 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat16_adaptive_back.png differ
index afd162d2e510e02fba0a48335479ae33f4562e95..264ae8fb20b0cb52cf414875b87c24e9d150e8a2 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive.png differ
index 0f24b322527cd1b5b82fa00616f880a2a964cac6..2ccf0bfea69211d8e7effa57a24400defac29f78 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat17_adaptive_back.png differ
index dee0ddbe50b51f50e5c5c535a89d1ebdd5b516a4..88016bc6415f867498bd5d70da6081baf494134f 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive.png differ
index cbb2790d4e303d447216d45c9f77b75f2c24169f..228bcbfacb98691ea01acd18673bde5ef4a69e54 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat18_adaptive_back.png differ
index 84367e3e72ddf927dc582003700487b4659cf9ab..b56f2727d18c216d423d0191c305423bb450ab34 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat19.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat19.png differ
index 41208f07d74ceed5aa55dc999f18870a038f0b2f..ac666e18abf542bc2c89fd14883bee96daea8fac 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat19_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat19_back.png differ
index e564106c7fe54ef67b2999d8fe1fce410826d2bd..e41d663676dbd15e2de404e359bb1fda6a058df4 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat1_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat1_adaptive.png differ
index ef2904bf130cb682645abbf4c55d1c6671ce72a7..569c734c63c315d445e072f6eefda6145d87be09 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat2.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat2.png differ
index 620a69e2da34b6fd536c792306f4f5e47bc2078d..dcc49454ceac571c48169b402e6efb600fe9f638 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive.png differ
index 1dc80553ada0b6f8382a54d120670d7d7ef73ee3..1e6dbaaf58966baeb6d67bc30e4ef85274634383 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat20_adaptive_back.png differ
index 609a79553b7a72ea8203ec047b8500c0d15bbfcf..0e8fa0b4dcf4d504fd6455c665965b8a141ed294 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat21.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat21.png differ
index f94ae76fa7df1397f0a3d6495d8e70653a1f70e6..4c5ac7093757a927dc3735fda96ed5ed8bad2d9f 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat22.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat22.png differ
index d0082d9231e91e1f14c62ccf99751ec39da45b68..afc818ae07058e28f08a0ec0c546e65c23db44f1 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat23_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat23_adaptive.png differ
index b6d76a545a592f33e639109c291863215b345cec..63766a4f63bbb460d9f74c52c70c50d39d146a58 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat24_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat24_adaptive.png differ
index ab36cb158aa95b2b7379ebd4fdcb69694e7f5e3e..84e1b789f3a0778eebde5f7c23b5e32b4d4273ec 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat25_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat25_adaptive.png differ
index d17e86964e0b9938b093f5133eb1479cc5f3c11b..1b420a7f8e89fdad34610c668a698f09bb7dd361 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat26.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat26.png differ
index e4ebc38e48f97694595cdaafe1c634f1c944497b..d970a79802050bc4a01478182fbed199c1c0168a 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat26_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat26_back.png differ
index ed39d6dc80e45749b14c07e07c6d70fbff666cdb..3284e4713380bc4f1a0be7f2029397606c7c2156 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat27.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat27.png differ
index d41c533643915c38e85b368abb51f9ba5966bf59..f3d7787ff89a1281856649c746e23cda15426cea 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat27_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat27_back.png differ
index a50fa9df6f7ecfcc2e560f0f3d6e4890d69a3c95..9fc8a1d3da27be52b265afcf27b9cde28925e5c5 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat28.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat28.png differ
index d5de4ce44804cdf7072ffa84652281a6dd295bce..747913239a5258c7afd25816cfb92a83a116f703 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat28_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat28_back.png differ
index 7f59019f79a55f64abce2fdf184b0bf77894fca4..32a7573352c7d576514d75e0932f7568e6c08de3 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat29_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat29_adaptive.png differ
index 329a85823551286784b2497e0e53dd9f37214643..f016ad83b1a679ae10bdb063e2a18af68e7816da 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat30_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat30_adaptive.png differ
index 5904cea1e2115db0c9c7282c9b30d894af59806b..1f8b092d9a5d09f09660b4fa385c5f42c4a1b5a7 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat31_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat31_adaptive.png differ
index 958596c7b9a78f9d68befab05e8a8fa10c3206be..a926352ec54a9a3ffe644dc2f94f18d64142dad6 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive.png differ
index 1859a1759d516ef18c6b152e261dd677391c853b..6a6eefa06643dda52138d9634156faca49ffded0 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat32_adaptive_back.png differ
index 4b0b09b60394268183dbaf0cba075437bb674d74..bf41fc502ae8a2c84da99cb67af679b87a495039 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive.png differ
index b49e0f143e67421cc0c28d36e6f8b6f7b72e5be5..931b86db46f75e5c16921c316c133e95b306d141 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat33_adaptive_back.png differ
index 1671a11677b42e984224a79d03ae84ff0d88edbb..29bf470d6625f6bc3c21cbb7dfc8089b648895d5 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat34.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat34.png differ
index 672791720e4e4cb6115e1390010fda90284025b1..d7bdcfb787dc563980a739fe97d069f28fda20de 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat34_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat34_back.png differ
index fa2939314d3d7ca6a1e3c764fd0b094b06e3d03f..ba95433c2a4e7b60973120566d1e494f3b4ea1ad 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive.png differ
index 701e8b657695669a88252a2b1aa3b54c3fb83214..cee25bc1bea48add98034d458bff6741b1fb950c 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat35_adaptive_back.png differ
index d55a633defc86f98976ea004ded479ec05ccb876..61e442eb1a7ae704c21068d8eed39b89f98b7cd9 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat36_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat36_adaptive.png differ
index be2eef05e104e4b10e4ab3ec1c67bdd2114c9b15..619255d1e3198c43ae2ccfe98706aa08a13240e0 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive.png differ
index 00724177cac8d101bf1e4e8577ab5d78aec118e5..e098a16bddf83965e54786da0e70369574772908 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat37_adaptive_back.png differ
index af966e3926b1c6cee561f8576ca900e87940fe6e..a4a28b66c53f6b353da5decefe4c593da4f99693 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat38_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat38_adaptive.png differ
index a42e49fb432f95b64965250fcd4a4232a538930f..8abb0dc4f453d59ca7a903ff31c09356aa3de5c3 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat39.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat39.png differ
index e7bc515d31e38722fccbd4c312475225a4d76d20..a960c16403d7b068463bcc170e5aebe59d121a55 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat39_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat39_back.png differ
index 88e6e7c95672c8c2e0a2c18ea6fbd4c56cde7bf1..ce71c9ebc13a0da5601d234143a1eaeff0c45509 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive.png differ
index 8a9d65a1af054be3a0a585859a2e921635e5f9ba..d92ab4c6fe59d24377c15532e7ae95655ec90bc1 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat3_adaptive_back.png differ
index 9eafb106251619eaead608181e397c2d3cfe9fea..5072d9b21ebf901dde2243b26342d304d878a429 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat4.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat4.png differ
index a0c56536787cab38113a611b44d4569ff1a0a592..5a0d7876fa4536c2c9fb598e48bd4d088a490392 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive.png differ
index ff12b084d8b509e7c542fe49fbfc27c113efa0fb..7cbc1c5931fc006a14bb6f58ef80cfa1733e953d 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat40_adaptive_back.png differ
index 0d3366b8d52a3a1a77dbe0d79b3d98dc4e1e147b..123d2763a18b51fa25d492bebc378f5d7b49abe1 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat41_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat41_adaptive.png differ
index 801a3161e470c3593f5d3da49ee48c8a19e5b854..38ff0f388f12b842dbba26fc4db9598b558b6372 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive.png differ
index 87d66db76ca4200e053f75669480bbc142ff74de..4f247083b66a39e70562e2aa948fb3e1b2ff8ab4 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat42_adaptive_back.png differ
index bf32e42595aae7ce8464b37025257ede0a57e0a8..c94077c65e5ae9461d893a64a9bf2655dd56590d 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat43_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat43_adaptive.png differ
index bc82ae54c23e02498c7860827f0663492cf8f4eb..01171680c3eba505d4c12700267cb30ad0064c73 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat44_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat44_adaptive.png differ
index 34a9c048630b8e06736f008e034dd9d69002b471..e45cade7abd6b9a713bf7fccdb6eea3c473af584 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive.png differ
index d2f65c892e96efc9e524b9724582ba018261bbd5..1f9baddce534c98e1c2508f0159873cf06d16389 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive_flip.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat45_adaptive_flip.png differ
index 0af5438c87b80f5767c651fede6b5e515d1a26b7..0e4d8e8d79717ea7a3ceac4de7577dd785a964bc 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat46.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat46.png differ
index 87057cf7371d2213c0005c7c8e310c3e9be56e48..03361831891517208076336dc7fe9416c0f24ef3 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat46_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat46_back.png differ
index a0e09e938956b0ca26aca844d5ff34ca53c6b53a..1516369c121b8135218cddf0b9852e5f481a3e50 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat47_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat47_adaptive.png differ
index 68937cdd159944638fd57b7a20a17bfe95b42eee..5d2cf0c2a8f2bdb150e05354c52593a11d6fac67 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive.png differ
index 3eee17cec3d6d2db82ea214e66da24f36cc4199e..0d2896cd0436ca9e16a34745485875731726e0a7 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat48_adaptive_back.png differ
index 1600833f0348d68bc65d4ca120666d9c8af3925d..fe0a72b911456fe876ddcf4f1ccbeb6c4a16fd05 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat49_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat49_adaptive.png differ
index 5508732cc9355cb67c07d0f957304f15353c016a..48e8a61fcc75fd081c097b98427de8d5f8350157 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat50_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat50_adaptive.png differ
index 3101883c8844ffb19138b82da0b5fbb879d8101e..883ff69ac7199aac44297844090d3411b039069f 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat51_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat51_adaptive.png differ
index 029db37622b23df444461c51a6f0016eca0a5c77..7031dce695c785c41b82591ce91b1783c54dbf60 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive.png differ
index 129f3985e602863b89d33097c5fe65aa22669221..b758cc875daac87b034b3d1f10db4afa3786cfae 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat52_adaptive_back.png differ
index 3df429ea26b0813b4fbeff688198179612f3f5d2..b212f2205ff931c69c68a9e4ef30ecfc563f10bb 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat53_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat53_adaptive.png differ
index 1e4d260d10b4904f60da03fd3cdd586f40c441b6..b0701e2fd30014fd5d9705c4e3d7f1e123c44c20 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat54_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat54_adaptive.png differ
index 9923213f31bff0c242061dfe03ad3127c22257a4..2a4e7d8e9f6674ad982770ef498b341e706ab13e 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat55_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat55_adaptive.png differ
index 25b0d0611e5e251f6b4c75be9efe0389b0299dc9..f8ab2f99cba5253d112eab4cb9b1300f4df978da 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56.png differ
index d6655e586318373f37f255b50330f2b7a08353f7..dd167308a5d0fb99dd4419d8367af339b5f1c596 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_back.png differ
index 999d645609dd46b7c0dcda6dd7f25717d78b64f7..2bd0b8186a88250633bca2e9d79093df288bd8ff 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_climb.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_climb.png differ
index a9dc0ed9c8608a30a5ed0c6c560ed4cae243b981..999acf8846d0cde28abdd892311e8e949ab23fd6 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_flip.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat56_flip.png differ
index d68ff55dc7601d43837eba9551850552da8721b4..aa834f48a07d5bcbdf66442a70d1459381df6697 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_adaptive.png differ
index 35461d5c80c5cd8bd4b62e47d995eb96f531b580..414433b94d3d715297890ca047543b14e0e4813b 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_bounce_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_bounce_back.png differ
index bc0a437d44e8a8c5e2bcd35f98766007caa0537f..2a3f27304e4c6dc0bdb19389aada404491412145 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_climb_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat57_climb_adaptive.png differ
index e83fe1bf6e58d9ba09543e26f784c4717cd5a5f5..b367280bb9e966366532ef2659ee17bcd7a320c4 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat5_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat5_adaptive.png differ
index e683187e6d642c5b6911c101c071844188b85df9..5bfb8e6a5fee2157261cfa4dc6cdb8bf25a908cd 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive.png differ
index 14d923220e639aeb6622a40c669d5d4a2c0dfee2..dbd9a54541bc1427aa36289ae58afd92a7cbdf62 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat6_adaptive_back.png differ
index a18a0e41c13d11062de780f9ad1c9ddb49a3b98f..3468138a6b50763cdbad0c81baa342c6d5021f14 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat7.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat7.png differ
index 8282da8baf8cb7497af99816498c8a15fdef0ac6..4ec4bbad9d61c4b8f77437d6964d567135ff29da 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat7_back.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat7_back.png differ
index f4cbe6c2f2c4bd55e3e23f788d5ef0981e833343..54855b4d0dffc931dcaf993bb5f9b1cece90c96a 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_adaptive.png differ
index 7b6de65de1ed3e069cde305c9a6017f2daf31678..e07ae9bfe6fde5c56f5e4a82bbd2e47bda0dd789 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_back_adaptive.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat8_back_adaptive.png differ
index e9d32157b909e16dfd7801c86c132fdf07b26ad8..cef3837dfb60782c74c06965516fa8a0aee96cbf 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseHats/HorseSpecialHat9.png and b/TheOtherRoles/Resources/HorseHats/HorseSpecialHat9.png differ
index dac3a5db6cb6630a516dcaacc60ec4216960ecc0..34129f2137b2d20e2f6e1a9503487b7f7bfd4b19 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseModeButtonOff.png and b/TheOtherRoles/Resources/HorseModeButtonOff.png differ
index ddd7ccbaa32d3551a3ea9d433ce2800e8a584b87..90b1def481adcd10c0e3c5de44313eb766dd4135 100644 (file)
Binary files a/TheOtherRoles/Resources/HorseModeButtonOn.png and b/TheOtherRoles/Resources/HorseModeButtonOn.png differ
index a30a380a1a9f7e16d954498fcc7e1ddfa657cd8b..829bcab308e01a27b0d2ab4fd1d81e4439510635 100644 (file)
Binary files a/TheOtherRoles/Resources/IgniteButton.png and b/TheOtherRoles/Resources/IgniteButton.png differ
diff --git a/TheOtherRoles/Resources/IntroAnimation/intro b/TheOtherRoles/Resources/IntroAnimation/intro
new file mode 100644 (file)
index 0000000..4687c56
Binary files /dev/null and b/TheOtherRoles/Resources/IntroAnimation/intro differ
index 8147372ff31a89cd37a7dccf83a80ecda81f7dc3..a229852920449c7121d68aa71e272c50cc3d0377 100644 (file)
Binary files a/TheOtherRoles/Resources/InvisButton.png and b/TheOtherRoles/Resources/InvisButton.png differ
index bfd53b10cc7d8c6f7406b698a328ebbf51892bb1..33dec22c2933db7e5dd8ab9ede15969a29a3b8cd 100644 (file)
Binary files a/TheOtherRoles/Resources/LighterButton.png and b/TheOtherRoles/Resources/LighterButton.png differ
index 9fce067d9fef398477cb9dd409ff73565b74741d..8f98073748cc1e986bee9aa1fb3cb6a1eaa655e1 100644 (file)
Binary files a/TheOtherRoles/Resources/LightsOutButton.png and b/TheOtherRoles/Resources/LightsOutButton.png differ
index 13e64a422474db535aa58b4c335bd98c2d6dcdc8..446296d041abfda4afc559039d55139aa1021fe0 100644 (file)
Binary files a/TheOtherRoles/Resources/MediumButton.png and b/TheOtherRoles/Resources/MediumButton.png differ
index cd1bba63df0d7a6f89d43558436ca411998754af..7e808c76af3047b6ec5acb34ce8be0876d53b296 100644 (file)
Binary files a/TheOtherRoles/Resources/MinusButton.png and b/TheOtherRoles/Resources/MinusButton.png differ
index 8453665e5e86c6baba8070038fff4d06703d3e57..868e5f2e2c85f2260deff01424669e33e23e4b3e 100644 (file)
Binary files a/TheOtherRoles/Resources/Minus_Button.png and b/TheOtherRoles/Resources/Minus_Button.png differ
index 2cd4b5a09b5ffa4dc6f2f5f95c4b4dd9ab4d43e4..41f5dfa7786ec2144a2d723f133de58c79476ed6 100644 (file)
Binary files a/TheOtherRoles/Resources/Minus_ButtonActive.png and b/TheOtherRoles/Resources/Minus_ButtonActive.png differ
index 4e5cfda305066148550366acfd0c8de8691a4b99..fc759d28499b62d659953974b5016ad8eefea66a 100644 (file)
Binary files a/TheOtherRoles/Resources/ModStamp.png and b/TheOtherRoles/Resources/ModStamp.png differ
index e68441d5341d3336dadfefb225bd5eb1d29de7a3..7680ee87c19094b9a640d1ab90ebefaa7a77b329 100644 (file)
Binary files a/TheOtherRoles/Resources/MorphButton.png and b/TheOtherRoles/Resources/MorphButton.png differ
index 20b631a92be0e6b7af3f01cfaf566cd55f2094e4..07492aae3752086481c2de3e28cf064ae42888cc 100644 (file)
Binary files a/TheOtherRoles/Resources/NightVisionOverlay.png and b/TheOtherRoles/Resources/NightVisionOverlay.png differ
index 674ad477f09efa589c1490823940cd23c552cadd..78036468eae0f561ce50f50c7042d5a4701d2f92 100644 (file)
Binary files a/TheOtherRoles/Resources/NinjaAssassinateButton.png and b/TheOtherRoles/Resources/NinjaAssassinateButton.png differ
index 7e7baa65cf9fbf74c49998d31d4573eb5e57fc1b..2b6f26571bc8baecb7fe24559259a088a6be469a 100644 (file)
Binary files a/TheOtherRoles/Resources/NinjaMarkButton.png and b/TheOtherRoles/Resources/NinjaMarkButton.png differ
index cdb293765fcad9bd3b243e2a14e93e86da1bcfc9..2fa49b3e257913630c4463bd2539dce40eaaced1 100644 (file)
Binary files a/TheOtherRoles/Resources/NinjaTraceW.png and b/TheOtherRoles/Resources/NinjaTraceW.png differ
index 8bae0fc2789c101f0d19212ba6959d3b55173e05..25d67bb919173fccad57a3dfcf83733d4deea957 100644 (file)
Binary files a/TheOtherRoles/Resources/Paste.png and b/TheOtherRoles/Resources/Paste.png differ
index b80d73bf80b46baf6dcceb2d2c59a0e1687b1e7c..254fa5ff0c00a64509c4acd1d6af17f3c2c710e2 100644 (file)
Binary files a/TheOtherRoles/Resources/PasteActive.png and b/TheOtherRoles/Resources/PasteActive.png differ
index 1e07e090d8685d0a0892ed45e97ae24b0d0d6b24..493f815ccf06afe8d0efbb1c1dafdd6bea04ea2d 100644 (file)
Binary files a/TheOtherRoles/Resources/PasteButton.png and b/TheOtherRoles/Resources/PasteButton.png differ
index 32be1b1df348e4a7feff8540a8a2b4b6d7a98840..6f5a5c72b5e1aca70967fd59b6971f4469f426f1 100644 (file)
Binary files a/TheOtherRoles/Resources/PathfindButton.png and b/TheOtherRoles/Resources/PathfindButton.png differ
index 2e37148030cf5061fb293ef8993384127d4ff082..b474f0e63b59a3df8b66722115d10b7400d787f7 100644 (file)
Binary files a/TheOtherRoles/Resources/PlaceCameraButton.png and b/TheOtherRoles/Resources/PlaceCameraButton.png differ
index 8b7e358cad6e1ccf6e8e1eefcede5d47f04c0c36..bddf917e4c338ccae044e03e1c9ad83dce566d84 100644 (file)
Binary files a/TheOtherRoles/Resources/PlaceJackInTheBoxButton.png and b/TheOtherRoles/Resources/PlaceJackInTheBoxButton.png differ
index 97e717d06dd7e3ff19b523b85e0033b54634908b..3d8046c9f12759efc148fee4706ab1e3a1475f63 100644 (file)
Binary files a/TheOtherRoles/Resources/PlacePortalButton.png and b/TheOtherRoles/Resources/PlacePortalButton.png differ
index e0ae50c20e0ef90556b8b532d33e27428fdac35d..436e6d2cbaa064e660aa3eec637b016f7d8145dc 100644 (file)
Binary files a/TheOtherRoles/Resources/PlusButton.png and b/TheOtherRoles/Resources/PlusButton.png differ
index 35335d5370f2768ac1f02008f61c86dd10b7221c..d642c2c1080b154ab3075f575c1e04a43e273708 100644 (file)
Binary files a/TheOtherRoles/Resources/Plus_Button.png and b/TheOtherRoles/Resources/Plus_Button.png differ
index ac30e9ba602cc34f3d65f3520063403b9ca1967c..87904e463f2f45665219ed8781dd49d55d719854 100644 (file)
Binary files a/TheOtherRoles/Resources/Plus_ButtonActive.png and b/TheOtherRoles/Resources/Plus_ButtonActive.png differ
index 0d9f694073d27bd2ec2d6a85052f7675df2027b1..dd304d48274ad293ae19a67b018f0c52260ac0e4 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/plattform.png and b/TheOtherRoles/Resources/PortalAnimation/plattform.png differ
index 8cf6656fbb6d47449eec2d4fa7fdcdb5cea249ff..e6b457ba83f19acb587ee9b07ce38d70b1d6fe1d 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_000.png and b/TheOtherRoles/Resources/PortalAnimation/portal_000.png differ
index 0efb94db32eb15cd7c95434ed1ec2b42ac5b9b82..1a2b4c9843753334ecaeb4ce16fb51f79c6be51c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_001.png and b/TheOtherRoles/Resources/PortalAnimation/portal_001.png differ
index 37463fa422a8f230ddf64cb82c091030dfc64810..3a71c0d09e61fad50232ba07a2c90e582dbc6b2c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_002.png and b/TheOtherRoles/Resources/PortalAnimation/portal_002.png differ
index c3b3de56394eaef3d71ce762f2c5539f9fd67ae3..847f3e24cfb3965249cf84ba88dc1cf92a78f32d 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_003.png and b/TheOtherRoles/Resources/PortalAnimation/portal_003.png differ
index 8fb9f0b2afeecb800b1e1aa27c60619163e509a5..1539ca1f327ac90977c0a6772fac764c40740a19 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_004.png and b/TheOtherRoles/Resources/PortalAnimation/portal_004.png differ
index 986aa934e7fbbae11001940e6d7505a3b9243d53..33378101743da43b266966094ea3aaa83105d0be 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_005.png and b/TheOtherRoles/Resources/PortalAnimation/portal_005.png differ
index d24a511cf17a7d5da7e56a81adaa6eee661c4156..3c30f02e99e3136bb55e93ba3b1086b90faf27d3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_006.png and b/TheOtherRoles/Resources/PortalAnimation/portal_006.png differ
index d7cd939b7c30b418c36d48b76e83a24bda7340f7..7b46cd24951d6ab1dd6a504078c7af317c174904 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_007.png and b/TheOtherRoles/Resources/PortalAnimation/portal_007.png differ
index 74d9a0e5e29cde5dbb4063b7910d5d6bd8fc2270..6835dcba484f9265b7695068df1eb439519d93eb 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_008.png and b/TheOtherRoles/Resources/PortalAnimation/portal_008.png differ
index ee8003ba333bc9ec2671713b3294604d4e0ad67f..61516ab067c6f528743ca415b1489f2da8b64f25 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_009.png and b/TheOtherRoles/Resources/PortalAnimation/portal_009.png differ
index 899e2af3456f43b79969d8603d270a742e14c354..8ff87bb83a83ce89c17ad2ac0804b8c7c3be346b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_010.png and b/TheOtherRoles/Resources/PortalAnimation/portal_010.png differ
index 197675056801121b99656a6bef8271489dafa8dc..7ab307e88cc629ca7ff6da318222b8a01a4471a0 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_011.png and b/TheOtherRoles/Resources/PortalAnimation/portal_011.png differ
index 945ab0cb2a8fdc8a37ad1e7fa03b803123c6d11f..e6f73f57f45c127f45b15b102ddfb07b4ab8c26d 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_012.png and b/TheOtherRoles/Resources/PortalAnimation/portal_012.png differ
index fc730cce74b48a6eeac311021d95abf7f21c879c..19d16d83fabfa278c8773662af028e77869616a7 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_013.png and b/TheOtherRoles/Resources/PortalAnimation/portal_013.png differ
index 54579b01abaab47c998a67d20ee47179e3b5ba7f..4120721117f52c5701f974309d9bc1c2a1b974f6 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_014.png and b/TheOtherRoles/Resources/PortalAnimation/portal_014.png differ
index 6b5e48221be2f1812fdea6fbed8ca826313c354c..b33268f6fa6a37d16c8d716ea4966506d4308f95 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_015.png and b/TheOtherRoles/Resources/PortalAnimation/portal_015.png differ
index 8f8f1343db9c76bf49d00c2f5f741b4dc18239bd..a41b5aa403199f0d382394e40ec1ae4c58eb5466 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_016.png and b/TheOtherRoles/Resources/PortalAnimation/portal_016.png differ
index 4fdd037dc9e0f8611bed63e9368e6a27f8c22bc6..27553ebe354bfd27dd05c3f0755a07cb6a2184b1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_017.png and b/TheOtherRoles/Resources/PortalAnimation/portal_017.png differ
index 20463fd8f22cee9079e7f6a2897f5b8e7d025de4..9ad039a70c7d7605f942ad76719252e1922d8957 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_018.png and b/TheOtherRoles/Resources/PortalAnimation/portal_018.png differ
index fa7030aa7e3f8d87c964e5a8c03b26bcb379b9eb..5ca9e632450c6e7fa18cab19ac23d6c5b605913c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_019.png and b/TheOtherRoles/Resources/PortalAnimation/portal_019.png differ
index 63a4935ecc11baeef670bf62f225ddede82fe6e1..895b9e8ea33a437ce7269bf97c7536d4e37eced2 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_020.png and b/TheOtherRoles/Resources/PortalAnimation/portal_020.png differ
index 11cc00447eb607d72b91dde11d7c8876aa30f4c4..178e965dcc04ac747c95f063dcdac84989c6bb67 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_021.png and b/TheOtherRoles/Resources/PortalAnimation/portal_021.png differ
index 635e2816ca810ecb7db79d6a97f2d5584a368856..774d1f724e09884fcebc793dfc60124f922f58ae 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_022.png and b/TheOtherRoles/Resources/PortalAnimation/portal_022.png differ
index a27c3197f3733341ca2c29be481b8a55809b860c..62b31b24bb1f8b46fd455e077e3d2800c1cf0861 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_023.png and b/TheOtherRoles/Resources/PortalAnimation/portal_023.png differ
index 39898140fbcdb80e1110af30f09ffb7eda2dca15..f16b58839bfd2960addd2db68c7f44f3fa51ccde 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_024.png and b/TheOtherRoles/Resources/PortalAnimation/portal_024.png differ
index b31078183424d11cb69e44d44033233eb897af11..f7ead12e89ade402ffb7f37d9a096f5fcd5ea216 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_025.png and b/TheOtherRoles/Resources/PortalAnimation/portal_025.png differ
index 345b56e6a2313e3a56e6f345cf230e3f667580c1..62c249398fa269aad3d5ddb7383efc905035bb12 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_026.png and b/TheOtherRoles/Resources/PortalAnimation/portal_026.png differ
index 4addf77a06b9b5dffdbc33a7825b758179bddc93..49b75b106440a8fb434131e2ced0abbc0834b8ce 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_027.png and b/TheOtherRoles/Resources/PortalAnimation/portal_027.png differ
index 58861cd7e2bb056f3e442b1bfc9736f304e27694..bee10247ce3f26675a2faf10c7b80619dcc31245 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_028.png and b/TheOtherRoles/Resources/PortalAnimation/portal_028.png differ
index ef64dbdb434c09274ff2e3a6dd6658f0287ac7d4..4887cae511bfaaf12e21470fbb4d39d3a6b4c185 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_029.png and b/TheOtherRoles/Resources/PortalAnimation/portal_029.png differ
index e8dc199ea1c08ef660ac4e49ea14546f9b9f0248..7420fb39bd0b58661103612995aaad9b49824eff 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_030.png and b/TheOtherRoles/Resources/PortalAnimation/portal_030.png differ
index 416f15d1e65af9bf1b42915de2be2c9570dbb441..f94decaaace3115cf9145838892525a2a7836230 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_031.png and b/TheOtherRoles/Resources/PortalAnimation/portal_031.png differ
index dcc1ef766826e6d7acbd5994fb276573031335b2..a246b078263ce48f10693ee3fc88aefb89526ecb 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_032.png and b/TheOtherRoles/Resources/PortalAnimation/portal_032.png differ
index 8e52ddf27fbbd710b692eac8b57122bc138df22b..e429d60523a314785f8b5ef73f05b049cf0a80b3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_033.png and b/TheOtherRoles/Resources/PortalAnimation/portal_033.png differ
index 9bfaecde783daea63863be2f06ad8b71142985e7..cbdcb0501dc31ea8e6136984b9e179dad79bb3c4 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_034.png and b/TheOtherRoles/Resources/PortalAnimation/portal_034.png differ
index 67c984565a42724c480634d378edc90a86d386dc..a80ae3708e8f59676842fbbfd9b3805597b278bf 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_035.png and b/TheOtherRoles/Resources/PortalAnimation/portal_035.png differ
index f016c7de0c1d8ec2dcd61647c20d54c5a9c83ca8..6eb9b56d15d352fe2bd64c0d0a8d8d4f38dba2bf 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_036.png and b/TheOtherRoles/Resources/PortalAnimation/portal_036.png differ
index 1ff2467859d56dee0d02ad686422a303c63d9a19..9c276a4012415c4bea36d35ec5c9fd40c0db969d 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_037.png and b/TheOtherRoles/Resources/PortalAnimation/portal_037.png differ
index 778b93a270c75c3cc84bbe77a336175f92736ee9..2d49e45a0f0eba4c6bbfd906d665f5c3bb5063bd 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_038.png and b/TheOtherRoles/Resources/PortalAnimation/portal_038.png differ
index 647291f462f942a20649e942f2af76a181ae7f7f..ef04cc98a36f40dd1fc260a4ac1254efb488bada 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_039.png and b/TheOtherRoles/Resources/PortalAnimation/portal_039.png differ
index 840ac15c1214e2dc1c0d8aa385af375fc9f7594e..1d68d51f8b1df320867889ff11e697b91e7a1e7e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_040.png and b/TheOtherRoles/Resources/PortalAnimation/portal_040.png differ
index 9d12df10d136cf333e42c153b3eea13ac8a76498..308cf9e0d209468e5fb346fa302582e01ef5e3d6 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_041.png and b/TheOtherRoles/Resources/PortalAnimation/portal_041.png differ
index b8d5d0d72912cac131f5d586367b6766b55befec..89bbf7b65a795f5d95adbd52914faff5cc08e313 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_042.png and b/TheOtherRoles/Resources/PortalAnimation/portal_042.png differ
index 3854d84cf03728bc680e408560eac11c3c6946b2..7e5ff09fc0e1cbbbc7c7e74c865fe8d6d3af2feb 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_043.png and b/TheOtherRoles/Resources/PortalAnimation/portal_043.png differ
index caeaf95f3fe4620470e8a6167976bd59301be5d8..0ceeb0b2420639e61df59bddb4f76b8b803871aa 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_044.png and b/TheOtherRoles/Resources/PortalAnimation/portal_044.png differ
index 25d5ed8027dcc6c99c194c526dc2e08cd7783e80..56985137ee67ede6de6d6809ac10803391ac7534 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_045.png and b/TheOtherRoles/Resources/PortalAnimation/portal_045.png differ
index fea38741b33262b5ee0ee0932f144e89eba0f799..76d5ab3fa421b76d219c39925867da2a56ddadad 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_046.png and b/TheOtherRoles/Resources/PortalAnimation/portal_046.png differ
index 8a6ad8e42f4a26ba6ef31ba4ef5e226d15bab93b..872fcbab201a03f9f7bc8a8fdb662d9cb786da8a 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_047.png and b/TheOtherRoles/Resources/PortalAnimation/portal_047.png differ
index 9e47b8bf594c5b86c769afedfc567bc39030ad53..1e552dd033f69cd35dfe846d2b12e0efcd362dbd 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_048.png and b/TheOtherRoles/Resources/PortalAnimation/portal_048.png differ
index 6f84846ce7eb7e6696d9e74a7e55d9d782c4c09a..c166bcf866b8d6a37c14f9107bce9d82edddb07b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_049.png and b/TheOtherRoles/Resources/PortalAnimation/portal_049.png differ
index c8fd793921e66004f8c82e93d6cb462782ece370..3d8c71b6f86cc43eb9b9e518e68578cfb45ffddc 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_050.png and b/TheOtherRoles/Resources/PortalAnimation/portal_050.png differ
index d250d236088962c41a6a582035b6c98d005b1535..1f49ae489e339303d51a8db8ebeb7b93dc97ada3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_051.png and b/TheOtherRoles/Resources/PortalAnimation/portal_051.png differ
index e8554a5e2a0ee88e93af4994bb84b58de7986bc2..9113ee8db0778c7d203e1d6a20d2edd8f2921540 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_052.png and b/TheOtherRoles/Resources/PortalAnimation/portal_052.png differ
index 0082d9bc2a91b3762850934881259c55aabcc773..a05f3515547a6b601bc38d861500622b8d89a1fa 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_053.png and b/TheOtherRoles/Resources/PortalAnimation/portal_053.png differ
index e013a2f90ed9122099db04d8acefbf992d81e7b4..63934a19bd62a88f03535cb91e842be514219016 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_054.png and b/TheOtherRoles/Resources/PortalAnimation/portal_054.png differ
index 585f333c953bb62a037c60b1f34cbea471c8703d..4f82b3979f466d7bd0f9a1be0e12884ef564e117 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_055.png and b/TheOtherRoles/Resources/PortalAnimation/portal_055.png differ
index f83fdb3db23eb77eaf4367e86b58527d28f40ba7..3024a54e8c1d9955f186be7ddd82c3e898037b1a 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_056.png and b/TheOtherRoles/Resources/PortalAnimation/portal_056.png differ
index ac4de1b3d2c6bd4c9be127db5827db1bf879713a..ca3c78f43f3eec7449962cc35f420db0d5b8c141 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_057.png and b/TheOtherRoles/Resources/PortalAnimation/portal_057.png differ
index 2cb913df6e3b341a6df88058eb5810582c59371c..b66a5137dde0e5e3d6b8fd273ccd31380c9c50a9 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_058.png and b/TheOtherRoles/Resources/PortalAnimation/portal_058.png differ
index 527c212f5a0e240f91633a3464bec1413518b751..1c1ace860b6edc6905d2466bd02fdd9064e5d2a5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_059.png and b/TheOtherRoles/Resources/PortalAnimation/portal_059.png differ
index 00ceba28c632e248bda1bba284a01a85645028ad..d74e4079b8fd1284f49a7260aae41f8c44a4ead3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_060.png and b/TheOtherRoles/Resources/PortalAnimation/portal_060.png differ
index 52ee9e898abbb84217efdc3e59251a509d3c3645..9a8713675d1e1fc0e0cb9fc6e96ffe3f7cf2fab5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_061.png and b/TheOtherRoles/Resources/PortalAnimation/portal_061.png differ
index 6e0f50cdcb2d1d30a4a044af6ab75ccdf134ceb8..a930d5dd45bb2ab8ad4a2adc4cb8f9721dff8b80 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_062.png and b/TheOtherRoles/Resources/PortalAnimation/portal_062.png differ
index 24a022fd3308662ec6e29e070fa3e88051afb55b..f40d2a04ae4861e4f0fdb95e1f87818178e3683c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_063.png and b/TheOtherRoles/Resources/PortalAnimation/portal_063.png differ
index cd60605c34191efb1118655d15f79f1d978adad8..84f1101d80e0c63e4da93e31c738342cf3e69b1b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_064.png and b/TheOtherRoles/Resources/PortalAnimation/portal_064.png differ
index e4e43acae4317fc0c01eb32edb225c1b40828060..d9ef72fb405b20e098574655260af19fcedf5fcf 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_065.png and b/TheOtherRoles/Resources/PortalAnimation/portal_065.png differ
index 396fe4b1ad6fab24c0f8c79a968f9163e283ba6b..9c1a48ee849263e3236f33cb423351f857319fa6 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_066.png and b/TheOtherRoles/Resources/PortalAnimation/portal_066.png differ
index 80a1b0526b1107c962a9fb83c060461479b4a912..1c2302401489820df2eedad26f04028ed9c2866b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_067.png and b/TheOtherRoles/Resources/PortalAnimation/portal_067.png differ
index 57f61eb84970c2c149962c3654a6fbb9c8de5bc7..ef61c62ad015c7c485439346bc486557dcfe0e49 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_068.png and b/TheOtherRoles/Resources/PortalAnimation/portal_068.png differ
index d9bc0497256ce6405fc642d709fe24c198cb6e46..de128ef69a8b74d70520a6f1452a36d8bd56b2bc 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_069.png and b/TheOtherRoles/Resources/PortalAnimation/portal_069.png differ
index ae0db03145e8b1278c68343dc86923f2fdebae09..8beda962decc553b8bf539b28937d2110959c6e4 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_070.png and b/TheOtherRoles/Resources/PortalAnimation/portal_070.png differ
index 7fbff2f7314fbe3877ee2b2acc3fa8fd10a35c5d..3089aa72ca6238b145553a489f90de858163e7c1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_071.png and b/TheOtherRoles/Resources/PortalAnimation/portal_071.png differ
index e9ae84c63e6016d8feac58c65c087dc7727a6f74..c0c5fcd4f367bd8545abd076b5e6c02914e31e3c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_072.png and b/TheOtherRoles/Resources/PortalAnimation/portal_072.png differ
index f51846001734c6de8d3d6d5acf186015124ba2f6..90182c0d6a4979c4eaf1f4ada91c896b04a832ee 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_073.png and b/TheOtherRoles/Resources/PortalAnimation/portal_073.png differ
index 216c5d5df8224126650a39af50c4104b3914e532..efda60eed0cf165ba47b34f4cbcbe595ce32eca3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_074.png and b/TheOtherRoles/Resources/PortalAnimation/portal_074.png differ
index 9bd7188e0490a9699d3b7244739812127c892694..8e8bd0692ad9d4897452ced58358365ccb531170 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_075.png and b/TheOtherRoles/Resources/PortalAnimation/portal_075.png differ
index 6fb9074d5e12229b477641366d899fca5b48f58c..7635cf18f885a85a908f805e1d07e6e644dc1a7b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_076.png and b/TheOtherRoles/Resources/PortalAnimation/portal_076.png differ
index 5f47e9ba3cb2eeb0ad67d6d13fa28123beabd185..63c253de719dd33041b813e0c2fef008d2d3627e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_077.png and b/TheOtherRoles/Resources/PortalAnimation/portal_077.png differ
index 4a05e35f737cb7d37e7aa764fe2269a761c48c74..cf46257ef574d6cd6d0bb5a9040e4f3221a8342d 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_078.png and b/TheOtherRoles/Resources/PortalAnimation/portal_078.png differ
index 9641cbb2fedb0719e089cf7bbe74151ade799a1a..e3aac0b1a8aef0b887dcc9665bac7c9d14c8deeb 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_079.png and b/TheOtherRoles/Resources/PortalAnimation/portal_079.png differ
index 1ddd0c09612b3e18fd2dc21ebb55b06cae6384c9..92972657a99f1c2668acd5ab6eb5f9d4f88618b1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_080.png and b/TheOtherRoles/Resources/PortalAnimation/portal_080.png differ
index 3d438743f24b9fceedda147ebe1407b0e157769f..ad46a79edbeeef3230ba36d7dcfdd8187615fb07 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_081.png and b/TheOtherRoles/Resources/PortalAnimation/portal_081.png differ
index d9235a71db7bd7709a302061e19c4e7c506221e5..a1440c3eee6bed94aba74ca5cf4d73d977a0428b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_082.png and b/TheOtherRoles/Resources/PortalAnimation/portal_082.png differ
index 252096eee72e738679f2ef1c84f5a67a4b12f67f..a23dc436f73d977172f8e7b90da98a7b3ef2c5b6 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_083.png and b/TheOtherRoles/Resources/PortalAnimation/portal_083.png differ
index 90709efaa1d0e8a47c5a85380f01d4acbcb31a1c..f24ee932b365fc00cc26193700a8afd81e5f60d7 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_084.png and b/TheOtherRoles/Resources/PortalAnimation/portal_084.png differ
index 0b677251100fb146a18e25e527a813fa17ed3895..49abfc7fd1b00cffc717183048a3e14aab4d52c2 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_085.png and b/TheOtherRoles/Resources/PortalAnimation/portal_085.png differ
index aa107918734ea55b8932c2c551ef9ef6b222813a..6ca148e881419f5447a759584f3455dc0580730c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_086.png and b/TheOtherRoles/Resources/PortalAnimation/portal_086.png differ
index 16d749abfc558eaba0f67b3c45d9fd4ea9b29d1f..812d2fb3fbe82423b1e54634ae11137a8968f4a1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_087.png and b/TheOtherRoles/Resources/PortalAnimation/portal_087.png differ
index a6cf27e2e4368843e0cfff8ee87f71b836cb6e67..4c39123cbf223b33fca3f9c44fba57c020a4ce78 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_088.png and b/TheOtherRoles/Resources/PortalAnimation/portal_088.png differ
index 8c62efb32c595bb81215a648648484c474e4db6c..38b841aafefce848ad655abb09aa5cdf009b3450 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_089.png and b/TheOtherRoles/Resources/PortalAnimation/portal_089.png differ
index 6a43d2b20ece004f07eb86f1397ad408e36c6166..35e815099dc00d7b07ba67223745def112011a4c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_090.png and b/TheOtherRoles/Resources/PortalAnimation/portal_090.png differ
index b66670e330a481418d1ee5d31e787690b0bf90ef..08449b59e09b56e7bafdf75aeba63eb775a62f23 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_091.png and b/TheOtherRoles/Resources/PortalAnimation/portal_091.png differ
index b66670e330a481418d1ee5d31e787690b0bf90ef..08449b59e09b56e7bafdf75aeba63eb775a62f23 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_092.png and b/TheOtherRoles/Resources/PortalAnimation/portal_092.png differ
index 56b05b5da8b14b32674227b1651d161be9218bf2..d1f006e55703df353e38450ea3e40445b98c0396 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_093.png and b/TheOtherRoles/Resources/PortalAnimation/portal_093.png differ
index 56b05b5da8b14b32674227b1651d161be9218bf2..d1f006e55703df353e38450ea3e40445b98c0396 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_094.png and b/TheOtherRoles/Resources/PortalAnimation/portal_094.png differ
index 56b05b5da8b14b32674227b1651d161be9218bf2..d1f006e55703df353e38450ea3e40445b98c0396 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_095.png and b/TheOtherRoles/Resources/PortalAnimation/portal_095.png differ
index 56b05b5da8b14b32674227b1651d161be9218bf2..d1f006e55703df353e38450ea3e40445b98c0396 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_096.png and b/TheOtherRoles/Resources/PortalAnimation/portal_096.png differ
index 1cdfcf7417fde5cbbaaf6d7c353ba1b406ac37d6..dfbb516fecc78facffa1bc3be0811dfaa6aed300 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_097.png and b/TheOtherRoles/Resources/PortalAnimation/portal_097.png differ
index e6259a927f580f851ea9aab73e0308ddc57f8eca..5b5eed24cfe3f38e727f2fc6797abd4783198af2 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_098.png and b/TheOtherRoles/Resources/PortalAnimation/portal_098.png differ
index ad9fc0f4933658df3ec86507e18e9e46daf9ff08..57b98cdfb6a799d26eb89beab2bf357f375639e7 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_099.png and b/TheOtherRoles/Resources/PortalAnimation/portal_099.png differ
index 28b905f4f624d250a9a8ed319b8dc7fcfa586203..14278fbeb58ba3b0cc27ae39d6c89916177b96a5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_100.png and b/TheOtherRoles/Resources/PortalAnimation/portal_100.png differ
index a187c22c75563da77d05e39e258b46ec3a416cec..728cb12749431a8871f22af716f32da16fbc96b3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_101.png and b/TheOtherRoles/Resources/PortalAnimation/portal_101.png differ
index 7466613230491bd3211582d1953e8b631bb90d66..a39f05131f722218cb7d09ce393103026a8dbc51 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_102.png and b/TheOtherRoles/Resources/PortalAnimation/portal_102.png differ
index d4f147ab0eae387124c3f3426c1296a339fb3614..b292d1f6c58c463ba6492deb014177a0214c41b5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_103.png and b/TheOtherRoles/Resources/PortalAnimation/portal_103.png differ
index 791e61dedaed764cc63e0b14b02c70c174a9a8d1..a08cc17cd39514568d37de17a49a28d3c270746e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_104.png and b/TheOtherRoles/Resources/PortalAnimation/portal_104.png differ
index ffa4a4ccead6c3d79f30d23e695c389a90012e50..9bd36e9329de2c8cd422f5a1ad6f7b9f43d2b887 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_105.png and b/TheOtherRoles/Resources/PortalAnimation/portal_105.png differ
index 42a02c9df4075a7c26276894ad5f39cdbbbc55b7..c95ed5d4df58c17f9f5069eb4c153f88f13fccb8 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_106.png and b/TheOtherRoles/Resources/PortalAnimation/portal_106.png differ
index 88a145c8deb434f4dae11578412d8b764c60c711..689cfd731cbbee9a38530556e2733d83c8fd8900 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_107.png and b/TheOtherRoles/Resources/PortalAnimation/portal_107.png differ
index c55a87efb2a6e0b99dd50dfc739e1c10dfa0913a..ea58e4ebc95870d76ea3b629977732b10dfd1157 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_108.png and b/TheOtherRoles/Resources/PortalAnimation/portal_108.png differ
index 06e31ae8ba26f23b13c8f68a4bd7015646e7f935..ff52fc8879710d60ab3d93a1bd718340a487a6e0 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_109.png and b/TheOtherRoles/Resources/PortalAnimation/portal_109.png differ
index f69432c787c9e1088aa5c0723138917677c50457..3f7a78efeda175468fc4fd11f396b9f031659eb1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_110.png and b/TheOtherRoles/Resources/PortalAnimation/portal_110.png differ
index 65a952d474cf10ed109d01a44644440c745fb4d6..6b238094be8d17b8ae29af5fee5a601e5aa1ad9b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_111.png and b/TheOtherRoles/Resources/PortalAnimation/portal_111.png differ
index ffee63e16ef5025d9bdfc275d32120446fa6e016..703344d59e6001e031cba9ce6a5c59945d4ef3ba 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_112.png and b/TheOtherRoles/Resources/PortalAnimation/portal_112.png differ
index 4ac67334b8d03395c26ec68c983598d1a7b48840..06c42c6770b3e94c88b43b7e9b59cd13d7bae8d1 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_113.png and b/TheOtherRoles/Resources/PortalAnimation/portal_113.png differ
index c7d33e71511b02ad61d4b5d397ea11da62db5acc..029d62caa3503b4d5c6366a6d50581bd24abaa7b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_114.png and b/TheOtherRoles/Resources/PortalAnimation/portal_114.png differ
index 4fcdb27960b2bd18ab6cdfa250023b0cba15d604..60f63e4fdbfecc7efbb8c938ce727929d6a431d5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_115.png and b/TheOtherRoles/Resources/PortalAnimation/portal_115.png differ
index c63e80429a4f6172b9bede8b55be3b715d09501f..7b713a08c6bc4cf636b89f7d5ccd633fbef04ca3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_116.png and b/TheOtherRoles/Resources/PortalAnimation/portal_116.png differ
index dad5251db4a4300b9290d2315fe6008d8997cb9e..e014dc6a96a2759ebc57b998057e6b60d2480492 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_117.png and b/TheOtherRoles/Resources/PortalAnimation/portal_117.png differ
index aa529ebe8767d3a6d240442e6133a1a28edfb1cc..f168121b4de33fa3fb43203af45416095b1c0ccd 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_118.png and b/TheOtherRoles/Resources/PortalAnimation/portal_118.png differ
index 01910a027d2eb811e49b600bedd98f9966aa828d..769457e0ddb4132fc5b5f7ced5cf877f4e9c310e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_119.png and b/TheOtherRoles/Resources/PortalAnimation/portal_119.png differ
index 5b29a6354e71a72463723cd64a571046f6196688..247840a047640954668c5b678ee2fd86c7bf28d0 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_120.png and b/TheOtherRoles/Resources/PortalAnimation/portal_120.png differ
index 4fd3a6f6cb52d77259a26cae96a9a89c040f1e32..f4bfa644ef2834a633713a97e64059d39102a90b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_121.png and b/TheOtherRoles/Resources/PortalAnimation/portal_121.png differ
index 348acdb6f68f603f7b93b55051a5f7a2fa252167..22359879e0972d1e401ffa333e08b51c6e075e08 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_122.png and b/TheOtherRoles/Resources/PortalAnimation/portal_122.png differ
index e4552e64b6c2decd93c509349056637a270d83ef..9fc21eb2ea1ff10e88973a85175973d1b9d70342 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_123.png and b/TheOtherRoles/Resources/PortalAnimation/portal_123.png differ
index 9fbc68b04380d6c8efd80f8adb9c3a2d4c53360b..dd8ebaea1c3e17fa38ad7accf9a124494f39e66a 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_124.png and b/TheOtherRoles/Resources/PortalAnimation/portal_124.png differ
index e62047996366fe82c54c6d0fa3ded202345c337e..8e16ebed0a262bf16fcd30909bdb189159ea23ee 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_125.png and b/TheOtherRoles/Resources/PortalAnimation/portal_125.png differ
index f12f69165e6459949c2b6610525bb098ee707195..6320b8031ee82f892dc06c0c64003ad5b18509ff 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_126.png and b/TheOtherRoles/Resources/PortalAnimation/portal_126.png differ
index 0a18f09c0eceb255fd34b717bdc4715691fc3258..584c187f753348cf63bdcb411c2daf5b258f8d84 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_127.png and b/TheOtherRoles/Resources/PortalAnimation/portal_127.png differ
index 9911486d662fed5fa4578fb6f9755e00dd09b521..2d82481dfb6f85e79f1cf84912a71d2a828e1236 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_128.png and b/TheOtherRoles/Resources/PortalAnimation/portal_128.png differ
index 96186743d96ed3c00dde043b0e0491a9bc7be68b..788c7611b926983e9689cd7c3a120678cafb0892 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_129.png and b/TheOtherRoles/Resources/PortalAnimation/portal_129.png differ
index dc3affaac83a9327f8e4c40d033b7937686d52f2..40c96981dd6f67c87e0dc8a132ec7c0721bdb913 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_130.png and b/TheOtherRoles/Resources/PortalAnimation/portal_130.png differ
index 88949c5fa26b9e69742519ee618cce2dc0e69673..17cd4d297bb56330aedae93e0a4ea4e4e7781ac9 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_131.png and b/TheOtherRoles/Resources/PortalAnimation/portal_131.png differ
index d903e71884e051d7c8ccc3e5db8921682d60c1b8..5c99227ae12a23a840281134074a35911630aaf0 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_132.png and b/TheOtherRoles/Resources/PortalAnimation/portal_132.png differ
index 7f6742486174926b2cd097a01dc669f5e98f2eb7..568c2137e97fe83d57a7d4a3f6169076a92aaafc 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_133.png and b/TheOtherRoles/Resources/PortalAnimation/portal_133.png differ
index f7dc5919bd40b65470a16b09af06926724bfab6f..d3b20b1c41d28777c4d6edd93c4d2fc0d48d436c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_134.png and b/TheOtherRoles/Resources/PortalAnimation/portal_134.png differ
index bcde204f8022f097ea2066398297049568b5bc41..8a612fcdc6d2c84f2511ee38584f8edbd8517e51 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_135.png and b/TheOtherRoles/Resources/PortalAnimation/portal_135.png differ
index df667b453ea17275b83c756f1208683ef58ba4ca..a6f3a6340ab2a6adb78c961005dbee2ce7c45048 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_136.png and b/TheOtherRoles/Resources/PortalAnimation/portal_136.png differ
index bd2ebd0cf025311a2b589d6bf04a5a282e436445..fe4dadabb074efc717217092a1340b170c36e5bd 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_137.png and b/TheOtherRoles/Resources/PortalAnimation/portal_137.png differ
index e78d3b82c82450c856fc3258cb0933e41c13c701..9415526b9679dab078228c64d1ed6c8dbfe28c36 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_138.png and b/TheOtherRoles/Resources/PortalAnimation/portal_138.png differ
index 3262a7ba8d94b68eb47ca255a427048911efdcb0..762e06e9d03e6db120bcd371d0061675153ba025 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_139.png and b/TheOtherRoles/Resources/PortalAnimation/portal_139.png differ
index 675b4062a40cade36521d971dc2e4bfaa80417a7..8296f2250e93822e24a201e62c328d360fc801a3 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_140.png and b/TheOtherRoles/Resources/PortalAnimation/portal_140.png differ
index 9ed1c6787b31336d40c1427e6a7f714e2b261d6f..546d9b9551485d56f4eb2443cdf31b7c0d324e4e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_141.png and b/TheOtherRoles/Resources/PortalAnimation/portal_141.png differ
index 671435b796738bbf4313b1d569d9ba3745a93e6a..52c8cb34e12512cde5647c5173a80e08dd222cfd 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_142.png and b/TheOtherRoles/Resources/PortalAnimation/portal_142.png differ
index 1757fe9b4fd753150bf8c7a456676115c95d4549..9f1cbea7329aa9c2b33ffc66a6ad6abbd042e663 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_143.png and b/TheOtherRoles/Resources/PortalAnimation/portal_143.png differ
index e23470c33bbf2e35f7d6783d98db8cf16a25f048..433c9e3631ca73e7c802e4ad4a65d5d5749ee8a9 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_144.png and b/TheOtherRoles/Resources/PortalAnimation/portal_144.png differ
index 85bc5657fb72cc0e917584fefdb07d5351316b8b..5d0cc612514bd3dbb53cc81742ca9ac37f13987b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_145.png and b/TheOtherRoles/Resources/PortalAnimation/portal_145.png differ
index 7cc94608f7f988a7d78d8a0b16b0ec0ed25a6331..e3c88666fbe082128bda4245367d5669b5db59a7 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_146.png and b/TheOtherRoles/Resources/PortalAnimation/portal_146.png differ
index 09fce0fedd73c8bfa83d0519cd7dff4ed8452160..6b6a2342c0f5ca8f7d682476d2511ae4efaed030 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_147.png and b/TheOtherRoles/Resources/PortalAnimation/portal_147.png differ
index 095983d865550988c4a111f6cfc044f543804d44..aa039ce28541bce452df8e87db46b76a0a69fc06 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_148.png and b/TheOtherRoles/Resources/PortalAnimation/portal_148.png differ
index 33d225561d867384ff4afc7ca260b10a7fff2519..184c17755e67a39d60ada12a328e46732bb1aa4b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_149.png and b/TheOtherRoles/Resources/PortalAnimation/portal_149.png differ
index 65cee63993ac1e7ac3c3fd1ec03c53bf1a07cf4a..8b3de5f555d35e93ab99d76e23f07976aeac4a6a 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_150.png and b/TheOtherRoles/Resources/PortalAnimation/portal_150.png differ
index 17c915738c8d0a89dbbe39e3ae33d070820fbc72..d3c8077d9fa51743c696ecbc143462c242443497 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_151.png and b/TheOtherRoles/Resources/PortalAnimation/portal_151.png differ
index 07194aa3dfc2954c0d5d33766b73695fe9ed3131..0b3103860b3d5348617becb7deaf9e3a0f351f2e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_152.png and b/TheOtherRoles/Resources/PortalAnimation/portal_152.png differ
index a7bfdcc604637f1ce06f7a27523f386803761461..3bf80f636878362a9ec6a01412cfcab9f2e44e6c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_153.png and b/TheOtherRoles/Resources/PortalAnimation/portal_153.png differ
index 7eff3177c9475dece9407821b0b23dae29344a7a..11f5f94cc004f14c508ae33eb9dd1552d80e4235 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_154.png and b/TheOtherRoles/Resources/PortalAnimation/portal_154.png differ
index 8358cd7c463b39d7647ca367f29ca7708956935e..f37887dea14fb4c30926277246170f8221ba4d87 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_155.png and b/TheOtherRoles/Resources/PortalAnimation/portal_155.png differ
index 8916023195683c033c148dec4f8eed4a3cfaf0c6..c6a3543d32a1f854db112ff536bdbaefea45db18 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_156.png and b/TheOtherRoles/Resources/PortalAnimation/portal_156.png differ
index c78738c3c6fe788f008a879d97706350dc10da5e..b707c8e0d5ccfd6abd97f669d4eeff43c432887b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_157.png and b/TheOtherRoles/Resources/PortalAnimation/portal_157.png differ
index 6cbbe6b7a331e174a88bab94465f924dfc8518b9..491c454695c0f4d5f318508ff66abc9a148bc4df 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_158.png and b/TheOtherRoles/Resources/PortalAnimation/portal_158.png differ
index 775570f40fa130ed450e3cedaa4202059b4dcc88..48f68f56ac0cb3422c6ebc8b0a4ecdc0e4b14b42 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_159.png and b/TheOtherRoles/Resources/PortalAnimation/portal_159.png differ
index 6159def29df1539e7b2d667fe2d04e65d903de7d..4e5d67e3d7a034f919e694a234ff47c74fd000b4 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_160.png and b/TheOtherRoles/Resources/PortalAnimation/portal_160.png differ
index dba0597fc5f1145d4b4573a429d62bd3aa7c2c05..ecd2c64fa34a53c26e7968cab4ff94445de71285 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_161.png and b/TheOtherRoles/Resources/PortalAnimation/portal_161.png differ
index 66bdf19d7591bff160792809c99dde41d98309c1..4ea5f91dd97a921cb6ff437c79e9e5daae7bb31b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_162.png and b/TheOtherRoles/Resources/PortalAnimation/portal_162.png differ
index 661b62be9bfac3fa6ad13bcd5d06b912f4f5e36f..3a366b2ba713a31b97933e9151f0db851633caae 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_163.png and b/TheOtherRoles/Resources/PortalAnimation/portal_163.png differ
index 20008192efd5c2d67e2aa7d529b71e19f59b4544..f2c17cd0a6240badd4e8da38c83299c54bf1f97c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_164.png and b/TheOtherRoles/Resources/PortalAnimation/portal_164.png differ
index 26627b89f49fc4a33a0e39ba16860178b2dd49e6..abb6dec8fdd268c199e8020ec141a795499057b5 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_165.png and b/TheOtherRoles/Resources/PortalAnimation/portal_165.png differ
index 918f118d91f6924009052b43fc18b73dd25e52a4..a9ab55bed2436acbddf6b648cdfe0888e4db2be6 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_166.png and b/TheOtherRoles/Resources/PortalAnimation/portal_166.png differ
index d99d8ccea08bcdbd07d51cc51a9523cd1e1c9978..474fa067e18d3872f5ce0b1ddabf8fbaf9cdf1d8 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_167.png and b/TheOtherRoles/Resources/PortalAnimation/portal_167.png differ
index 3e45b01757c7780c575106e600f57649969fe9e1..297033a81f8fe543c07c68a2bd00f11999c66fa4 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_168.png and b/TheOtherRoles/Resources/PortalAnimation/portal_168.png differ
index 2051a03768ca5ac8add987e9c298e581d30dde71..ece945d96ba9a80ea384da41730ba28c90f18158 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_169.png and b/TheOtherRoles/Resources/PortalAnimation/portal_169.png differ
index 28ac52b6b9d76bf5512befbd7ef94d4117523fd0..411af8c271c02368dc3a84d00e6fca7623f18066 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_170.png and b/TheOtherRoles/Resources/PortalAnimation/portal_170.png differ
index 4172d26c7f3cf08c6a6ce4cf35eecd417109cfba..792c2ccd0494c5a1595934da5800bb095e886ae2 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_171.png and b/TheOtherRoles/Resources/PortalAnimation/portal_171.png differ
index 8ce88d46aefa7ed019a6b65dc65a2ac40e09764a..57fc96f8a27cc1bdb62a9244627e506cbf9403fe 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_172.png and b/TheOtherRoles/Resources/PortalAnimation/portal_172.png differ
index 1804cde9fd7a995de3d9af1e8762137acce3f43e..ae2d2ec740d6268234d9fd01683f5ca4d15590df 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_173.png and b/TheOtherRoles/Resources/PortalAnimation/portal_173.png differ
index 979fc2c03b6ee00bc7585a90a8a4822552d5be77..fb52e0aa6fbdd70f903d6a61f5f82967aceba33b 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_174.png and b/TheOtherRoles/Resources/PortalAnimation/portal_174.png differ
index cc8f13b270e8f755e74e752166f149257b96e3b9..3ee1417cf391f4478f51f69557328d9fe0b3bee9 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_175.png and b/TheOtherRoles/Resources/PortalAnimation/portal_175.png differ
index 09fdb0c46111ff2c41e6d030f8baa77bab1000fd..49303e8a4c035bdc2a9085fe7b039852f4b6c956 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_176.png and b/TheOtherRoles/Resources/PortalAnimation/portal_176.png differ
index 97bc08419402c1c17df211d49b598b7713c054d2..eae8bf7ef9672db804d9f10bb7417b979c6a563c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_177.png and b/TheOtherRoles/Resources/PortalAnimation/portal_177.png differ
index 2c5325bf581702108a38076972a830fca1a3dc4a..d93f093d0320f0548d1bf49eb436e1b1f934956e 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_178.png and b/TheOtherRoles/Resources/PortalAnimation/portal_178.png differ
index c69066e5d9f0fb475f6b488bf70b16320f7b1b94..bdbe109f0416a52253c6bb172c201637aa7ec81c 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_179.png and b/TheOtherRoles/Resources/PortalAnimation/portal_179.png differ
index 02d44d9e43ee6a461b75e1c8c534b2af871dfdf2..24aab98f6bcc35a1a30def77f8f3a640ad36df20 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_180.png and b/TheOtherRoles/Resources/PortalAnimation/portal_180.png differ
index c56ce86f9621f9daf791e5c574be19157674bc49..46e043741bccf8f3b8df08d3dbda744d8f11a8ed 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_181.png and b/TheOtherRoles/Resources/PortalAnimation/portal_181.png differ
index 88bf869a6d7c2b21d7751a99837136d59d56bfcc..e206c9012c2b5da1dadbbb59c53e739dd69a5e03 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_182.png and b/TheOtherRoles/Resources/PortalAnimation/portal_182.png differ
index 539ac9c78134442e46b0b4dc0f8de35483aaa880..9dba0f5d8254ce3d88397b72742d7c7be66cb350 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_183.png and b/TheOtherRoles/Resources/PortalAnimation/portal_183.png differ
index 46f34fe332bda11668d5c9b9825a672c61ce20a2..b1ebd18c0bd8ef41045bec7bb4252e2f33a754e9 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_184.png and b/TheOtherRoles/Resources/PortalAnimation/portal_184.png differ
index 45586afcc5e07427366ceb21e23713ff4660f061..f34de69217b071f9dd0f4ea0df64a58af89a68d2 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_185.png and b/TheOtherRoles/Resources/PortalAnimation/portal_185.png differ
index 4560622557c5bfe28a7620b4ce3ffa9c37078185..5a525ea975e0e6f02e4b9434520ee9f53e40b5bf 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_186.png and b/TheOtherRoles/Resources/PortalAnimation/portal_186.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_187.png and b/TheOtherRoles/Resources/PortalAnimation/portal_187.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_188.png and b/TheOtherRoles/Resources/PortalAnimation/portal_188.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_189.png and b/TheOtherRoles/Resources/PortalAnimation/portal_189.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_190.png and b/TheOtherRoles/Resources/PortalAnimation/portal_190.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_191.png and b/TheOtherRoles/Resources/PortalAnimation/portal_191.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_192.png and b/TheOtherRoles/Resources/PortalAnimation/portal_192.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_193.png and b/TheOtherRoles/Resources/PortalAnimation/portal_193.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_194.png and b/TheOtherRoles/Resources/PortalAnimation/portal_194.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_195.png and b/TheOtherRoles/Resources/PortalAnimation/portal_195.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_196.png and b/TheOtherRoles/Resources/PortalAnimation/portal_196.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_197.png and b/TheOtherRoles/Resources/PortalAnimation/portal_197.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_198.png and b/TheOtherRoles/Resources/PortalAnimation/portal_198.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_199.png and b/TheOtherRoles/Resources/PortalAnimation/portal_199.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_200.png and b/TheOtherRoles/Resources/PortalAnimation/portal_200.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_201.png and b/TheOtherRoles/Resources/PortalAnimation/portal_201.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_202.png and b/TheOtherRoles/Resources/PortalAnimation/portal_202.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_203.png and b/TheOtherRoles/Resources/PortalAnimation/portal_203.png differ
index 3a65da134fd3521b3b8fd229ef64e99c8738aa36..7b71b2aeb7397104e55027ff6841091c60194700 100644 (file)
Binary files a/TheOtherRoles/Resources/PortalAnimation/portal_204.png and b/TheOtherRoles/Resources/PortalAnimation/portal_204.png differ
index 5cd9da86e5d15bdf7e7d4ad223d0cdfe4cda6fe0..29fdf8ec9135f8c553833a6da04f1b4761236d31 100644 (file)
Binary files a/TheOtherRoles/Resources/PursuerButton.png and b/TheOtherRoles/Resources/PursuerButton.png differ
index f3be91277d57c059960d93c9a2e8d1066f3fdd82..bfa30d5e8747c79a878a951c9178ad1a5d1b4fa2 100644 (file)
Binary files a/TheOtherRoles/Resources/RepairButton.png and b/TheOtherRoles/Resources/RepairButton.png differ
index 544351e7e7043ea5f5aec817f78a783c7e290b0d..02105f184d94f4d28f6f8ef6edf6da047bdd7928 100644 (file)
Binary files a/TheOtherRoles/Resources/Reveal.png and b/TheOtherRoles/Resources/Reveal.png differ
index 9d58a5cd80323ceaab60c60f0618947764442fc4..afc1e6548c5778022fba2d2b80da3ba8db179622 100644 (file)
Binary files a/TheOtherRoles/Resources/RewindButton.png and b/TheOtherRoles/Resources/RewindButton.png differ
index 0f51d67e75a72b002b8e2d77eeb6d4ea3173b1ba..a04b0df0475817e4367adcec72b6bf31d444614a 100644 (file)
Binary files a/TheOtherRoles/Resources/SampleButton.png and b/TheOtherRoles/Resources/SampleButton.png differ
index 544351e7e7043ea5f5aec817f78a783c7e290b0d..02105f184d94f4d28f6f8ef6edf6da047bdd7928 100644 (file)
Binary files a/TheOtherRoles/Resources/SeerButton.png and b/TheOtherRoles/Resources/SeerButton.png differ
index 9119e37e7583cd4a861406f70ee4563fb85eded4..2a19bef2b0371d70286574640433559dd2c756af 100644 (file)
Binary files a/TheOtherRoles/Resources/Settings_Button.png and b/TheOtherRoles/Resources/Settings_Button.png differ
index 813c937c11708ea37eb1d8ed0db7aa15fd430917..cf0188b452989704f54513c9d4db0d8d8cc61814 100644 (file)
Binary files a/TheOtherRoles/Resources/Settings_ButtonActive.png and b/TheOtherRoles/Resources/Settings_ButtonActive.png differ
index 6315ab8e8b79917c739b2c8e6d9b79f66ed59e08..d2dec6940b0f5f87aa3a75bf13e21fc5f1d07bc9 100644 (file)
Binary files a/TheOtherRoles/Resources/ShieldButton.png and b/TheOtherRoles/Resources/ShieldButton.png differ
index 47d83d0c1d95ba9416a51afd4b61e7c2c11a8940..95f8f1d7cb47d87ebd28080d5a7f3bf137f10297 100644 (file)
Binary files a/TheOtherRoles/Resources/ShiftButton.png and b/TheOtherRoles/Resources/ShiftButton.png differ
index 296ce9d12fee3b77bc1a76d0a13dde77018b8f8a..cb2df9f755763b21f2d8c14ff374daf15198a4f8 100644 (file)
Binary files a/TheOtherRoles/Resources/SidekickButton.png and b/TheOtherRoles/Resources/SidekickButton.png differ
index ca0f93a9d9537292604005a6cc49f5855fbdc1e6..0c7d30482d16b6da0b75e90e71213584053bb48d 100644 (file)
Binary files a/TheOtherRoles/Resources/Silhouette.png and b/TheOtherRoles/Resources/Silhouette.png differ
index 8a1808ca10061a0e8225b53ec06b0a24047adb0b..31f73d9dc49f69c653b641a1752ef549a72a5522 100644 (file)
Binary files a/TheOtherRoles/Resources/Soul.png and b/TheOtherRoles/Resources/Soul.png differ
diff --git a/TheOtherRoles/Resources/SoundEffects/toraudio b/TheOtherRoles/Resources/SoundEffects/toraudio
new file mode 100644 (file)
index 0000000..b3fb5d0
Binary files /dev/null and b/TheOtherRoles/Resources/SoundEffects/toraudio differ
index 004f4ffdf6879f5181204ab4c3d361bdb09fa5d0..e90dcdbf45faf25dbcfb70406dd2900ff8d94c82 100644 (file)
Binary files a/TheOtherRoles/Resources/SpeedboostButton.png and b/TheOtherRoles/Resources/SpeedboostButton.png differ
index dc878f8557226fd78d179a4ca5270a9ac64b314a..fef9072af4ff9135b5900930bffa38a9d431d1ff 100644 (file)
Binary files a/TheOtherRoles/Resources/SpellButton.png and b/TheOtherRoles/Resources/SpellButton.png differ
index 30c54829ef1223925952ed9063e20ba48211b181..60c03843e98284ef566131b079ca3c94998cad38 100644 (file)
Binary files a/TheOtherRoles/Resources/SpellButtonMeeting.png and b/TheOtherRoles/Resources/SpellButtonMeeting.png differ
index 8b2abaddeeefe350e6a9707438b9b2906d3ac2c7..08084a2bfc7aab24ad387fce0878671400033801 100644 (file)
Binary files a/TheOtherRoles/Resources/StaticVentSealed.png and b/TheOtherRoles/Resources/StaticVentSealed.png differ
index d284137bfa7e5a26db44f4613a814bea0f616aae..6aaf141c817f1c1f262418cf2e4976eec9a238d3 100644 (file)
Binary files a/TheOtherRoles/Resources/StopClean.png and b/TheOtherRoles/Resources/StopClean.png differ
index 32ff6663fccda5e5a78355c46dbe03c3b2542360..e7aeb4bb164c7ea0e82225e308345f063d25e652 100644 (file)
Binary files a/TheOtherRoles/Resources/SwapperCheck.png and b/TheOtherRoles/Resources/SwapperCheck.png differ
index db404fa530ff01d57d6ad24ba661fec9e0bb82e1..2a9004745de32b36742a6c7a13d492160181aee6 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIcon.png and b/TheOtherRoles/Resources/TabIcon.png differ
index 10eb786a47977632e0d31eab7ef56b6845224b4c..aff89939321d10458a38c9862f4eb045f2d43c18 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconClassicMode.png and b/TheOtherRoles/Resources/TabIconClassicMode.png differ
index a459ba7a45481856ae58a6360b84977f11061f91..91905b9fc7a2f1208b538696e7fd615c92d689bb 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconCrewmate.png and b/TheOtherRoles/Resources/TabIconCrewmate.png differ
index 85027e239b5812dfa1013635add37e55bde28bc0..27d3f887c297a4124efbe204faa20a25cc0eb8e8 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconGuesserMode.png and b/TheOtherRoles/Resources/TabIconGuesserMode.png differ
index ac04d2199ed35cb88cfc5a1c6305f66202de0392..a9604960aa71736ff12c5c14b4580a635c952044 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconGuesserSettings.png and b/TheOtherRoles/Resources/TabIconGuesserSettings.png differ
index 69658e4d9ba50901bec71ef462cacad4c0dcf2fb..6f05d06f2bddf453d510d70a0d45ab97c6507fa9 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconHideNSeekMode.png and b/TheOtherRoles/Resources/TabIconHideNSeekMode.png differ
index da0cf991ed1a6d5aac4a7fd10b3181af4012be55..562957953edf0aabcb31829af66867f687959959 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconHideNSeekRoles.png and b/TheOtherRoles/Resources/TabIconHideNSeekRoles.png differ
index e6edb1224985b6af916c70adc3805b028e4f0bb5..913b4fd7f933fe33c997218370ac7c2e6b58412c 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconHideNSeekSettings.png and b/TheOtherRoles/Resources/TabIconHideNSeekSettings.png differ
index 073c1966e8f55a4efe5a7e429a6f5e51b3704984..32ed13aedaf965edbd6e6f3a1a23e7da16b90b72 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconImpostor.png and b/TheOtherRoles/Resources/TabIconImpostor.png differ
index a564d301bb814b8dff2052fa38793049bdaca955..1119bfc0fa1da0a4905ab23df27f013c89daa512 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconModifier.png and b/TheOtherRoles/Resources/TabIconModifier.png differ
index f747816c58cb8de1ba2d957ce2643b6f9c0d6a0f..b95f74feae97e72ffbe345d884aac70cccf5b1b6 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconNeutral.png and b/TheOtherRoles/Resources/TabIconNeutral.png differ
index 357b496417dae8605e218f8ad290ec278bdbb66c..9a08b3c1e8bdfd5d36d0aadf2335774a03c2463a 100644 (file)
Binary files a/TheOtherRoles/Resources/TabIconPropHuntSettings.png and b/TheOtherRoles/Resources/TabIconPropHuntSettings.png differ
index 760ca787644c48cb85394d69a2297acaed31c52f..625aa139f25aef88b525be3f2b037adcbcb23613 100644 (file)
Binary files a/TheOtherRoles/Resources/TargetIcon.png and b/TheOtherRoles/Resources/TargetIcon.png differ
index 1a3f896a44e1c7104c66127a7b243e5ca52daff3..05a2d2b0ec27f83a8d26dad57ed0791ee781f319 100644 (file)
Binary files a/TheOtherRoles/Resources/TimeShieldButton.png and b/TheOtherRoles/Resources/TimeShieldButton.png differ
index 2cd82d528df942c79e713dadcf54b62ccdadd09a..1f38153ff26d1b7e624d40dd61fc290b3cbc2d91 100644 (file)
Binary files a/TheOtherRoles/Resources/TrackerButton.png and b/TheOtherRoles/Resources/TrackerButton.png differ
index e2130c826783f4163f28999263d299f48a8a6413..e6a626783862df405d0a6867baea3553a718b275 100644 (file)
Binary files a/TheOtherRoles/Resources/Trapper_Place_Button.png and b/TheOtherRoles/Resources/Trapper_Place_Button.png differ
index 2487d09fc2790021f0a66f23ffc57c5384f8b605..3cca072e767f0b852d0838ef24f51fecb1b8151f 100644 (file)
Binary files a/TheOtherRoles/Resources/Trapper_Trap_Ingame.png and b/TheOtherRoles/Resources/Trapper_Trap_Ingame.png differ
index 5610019fff81a63bb34fc0d1c17406f30de2b485..a5edd0b80107402dfcbc6f47ac4829b5e60482ad 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0001.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0001.png differ
index bbaf640daf20a8ae5e7cd3c8f10636e03ddb97aa..5bee0cb6d24648c88f6b2ff869f7cc9031de8bfd 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0002.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0002.png differ
index 7da0c9ddb31197e35c9f6a9dec725b069f3d71bb..4de1f51eef7dd9ef77d60b79dbd3f1d54856078c 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0003.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0003.png differ
index d867c1bc9deabbdf9ae4d4bb8979184ad69f752b..951d90f5552135003e372d2fb983598a2dc02095 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0004.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0004.png differ
index 7120112a73cb85692b3ad63cc4dd0adfccc34591..677312e75cf5a61d3a4e42c998733a223ae54459 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0005.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0005.png differ
index 407ba40ad74238f54be14807990f05595ce64d8e..e6f11614fd0c1198ac88e6afa6be418e1d6180bb 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0006.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0006.png differ
index 869eaa8858e65505d0573a82aafa407f3ea50823..d6a7cd65971a1c8636f762851b88cbeaae777bfc 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0007.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0007.png differ
index 02ec17ab45c31c2f03d4fe13810644572316317f..fa23e14991b182579c6afd730edc1d7467867d83 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0008.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0008.png differ
index 32bcba536ce4e60c56885495829e695067599b4c..2f0565b26da7902422857852b0485bddf44cec47 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0009.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0009.png differ
index 775ffc96512d96596e6c7f7b56d9ff9e75446db2..2526774c730ea0e2cc3a5d9e6c909c489575ec07 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0010.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0010.png differ
index dfd103df7511538e5fcf0d4fc6cd072067100850..c01ddcb86b24aa7254a8d484b19c314035e0e8ea 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0011.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0011.png differ
index b03904353a48df0b6e07b8b5d9fe34673a70c4ba..1da83a16a81d45776a98054ea44c81f16c6a6c4d 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0012.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0012.png differ
index 1f882c117992c793fc5f99120400a56e091fd5f5..0be898e541a45993e080c1225cfb25cf2d99ff53 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0013.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0013.png differ
index 06091854a39f79370e744288a951ea17aa7a28d6..4401440546dac66005982fd30789996a43492a2a 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0014.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0014.png differ
index 6851b820d230a37f73c7569961916bdd56e2681e..a0b16ea756f192d08a20004bba89dac1cfc91a40 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0015.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0015.png differ
index f35e5f0c33594d13796beeee8b7e34e517903be0..668b522301d1f33f170b04fd8c17eb0f17785fd3 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0016.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0016.png differ
index 7d967b3a76307120c0043214994a7fef6086422a..ef5bd0757b48befc02e1d6f8d0fcb1b495de5caa 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0017.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0017.png differ
index 61785a8468e7e77a87761cccbc9973049130d5d5..e9bf43df979ba1451e4fbe88a92bf12e6c1c00ec 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0018.png and b/TheOtherRoles/Resources/TricksterAnimation/trickster_box_0018.png differ
index f23870a74cdbc00d5ef7d7c383c59ef41f4446b7..d32f68cc7db418205d84a8538a6d4dd98ed84ba4 100644 (file)
Binary files a/TheOtherRoles/Resources/TricksterVentButton.png and b/TheOtherRoles/Resources/TricksterVentButton.png differ
index 028930ef292cd0b2ec8c9a37708a76e02028eb0b..729ce5120ddc99a77061169e5ed3fd0c2045457d 100644 (file)
Binary files a/TheOtherRoles/Resources/UnStuck.png and b/TheOtherRoles/Resources/UnStuck.png differ
index 8ec3316b8effde39b70e0c651a631c7496e3079b..ba7ef96454ae18d7a89f21d64f39506509593882 100644 (file)
Binary files a/TheOtherRoles/Resources/UsePortalButton.png and b/TheOtherRoles/Resources/UsePortalButton.png differ
index f2a2822ea67471f12222f9688f3270b7fabfaafb..a0ff1156040c10e9d6433f54f184f3e77b283fc6 100644 (file)
Binary files a/TheOtherRoles/Resources/VampireButton.png and b/TheOtherRoles/Resources/VampireButton.png differ
index 29fa8f4218c4aac7da30079b577f4f9373838d08..46af2bfa4365d21dcbd0538a71025a11cf080fe1 100644 (file)
Binary files a/TheOtherRoles/Resources/Vent.png and b/TheOtherRoles/Resources/Vent.png differ
index 42e8e2dfa4e4a03a74e9cf716ae99552860a1f35..eb6003cc3b0cfdbe37cd0a1315a30fb199219ff6 100644 (file)
Binary files a/TheOtherRoles/Resources/VultureButton.png and b/TheOtherRoles/Resources/VultureButton.png differ
index cb8de34860f0fae3cceb30c09fb5c49f0454c476..5279e2374a7910b1f64dc22175e703afc3d3a4de 100644 (file)
Binary files a/TheOtherRoles/Resources/YoyoBlinkButtonSprite.png and b/TheOtherRoles/Resources/YoyoBlinkButtonSprite.png differ
index a8c40c921d55061120ee729571fc6e6ce7bbcbbe..7de3f445c44d56f68c1523b886d55cca44f47226 100644 (file)
Binary files a/TheOtherRoles/Resources/YoyoMarkButtonSprite.png and b/TheOtherRoles/Resources/YoyoMarkButtonSprite.png differ
index 3ff904adc515d52e46245fcfdb55cbf196468de4..b5f5c03419b4e1986dac8f03dc9b018eadeef65b 100644 (file)
Binary files a/TheOtherRoles/Resources/bannerTheHorseRoles.png and b/TheOtherRoles/Resources/bannerTheHorseRoles.png differ
index 9fcccd56bde036d7f6831bfa386b1ace2a5f5a21..9ed2a45cb267f41ca5ddabe84fd17130aada680e 100644 (file)
@@ -1,7 +1,7 @@
 using System.Linq;
 using System;
 using System.Collections.Generic;
-using TheOtherRoles.Players;
+
 using static TheOtherRoles.TheOtherRoles;
 using UnityEngine;
 using TheOtherRoles.Utilities;
@@ -95,6 +95,7 @@ namespace TheOtherRoles
         public static RoleInfo vip = new RoleInfo("VIP", Color.yellow, "You are the VIP", "Everyone is notified when you die", RoleId.Vip, false, true);
         public static RoleInfo invert = new RoleInfo("Invert", Color.yellow, "Your movement is inverted", "Your movement is inverted", RoleId.Invert, false, true);
         public static RoleInfo chameleon = new RoleInfo("Chameleon", Color.yellow, "You're hard to see when not moving", "You're hard to see when not moving", RoleId.Chameleon, false, true);
+        public static RoleInfo armored = new RoleInfo("Armored", Color.yellow, "You are protected from one murder attempt", "You are protected from one murder attempt", RoleId.Armored, false, true);
         public static RoleInfo shifter = new RoleInfo("Shifter", Color.yellow, "Shift your role", "Shift your role", RoleId.Shifter, false, true);
 
 
@@ -155,6 +156,7 @@ namespace TheOtherRoles
             vip,
             invert,
             chameleon,
+            armored,
             shifter
         };
 
@@ -178,6 +180,7 @@ namespace TheOtherRoles
                 if (p == Mini.mini) infos.Add(mini);
                 if (Invert.invert.Any(x => x.PlayerId == p.PlayerId)) infos.Add(invert);
                 if (Chameleon.chameleon.Any(x => x.PlayerId == p.PlayerId)) infos.Add(chameleon);
+                if (p == Armored.armored) infos.Add(armored);
                 if (p == Shifter.shifter) infos.Add(shifter);
             }
 
@@ -243,14 +246,21 @@ namespace TheOtherRoles
         public static String GetRolesString(PlayerControl p, bool useColors, bool showModifier = true, bool suppressGhostInfo = false) {
             string roleName;
             roleName = String.Join(" ", getRoleInfoForPlayer(p, showModifier).Select(x => useColors ? Helpers.cs(x.color, x.name) : x.name).ToArray());
-            if (Lawyer.target != null && p.PlayerId == Lawyer.target.PlayerId && CachedPlayer.LocalPlayer.PlayerControl != Lawyer.target) 
+            if (Lawyer.target != null && p.PlayerId == Lawyer.target.PlayerId && PlayerControl.LocalPlayer != Lawyer.target) 
                 roleName += (useColors ? Helpers.cs(Pursuer.color, " §") : " §");
-            if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(p.PlayerId)) roleName += " (Guesser)";
+            if (HandleGuesser.isGuesserGm && HandleGuesser.isGuesser(p.PlayerId)) {
+                int remainingShots = HandleGuesser.remainingShots(p.PlayerId);
+                var (playerCompleted, playerTotal) = TasksHandler.taskInfo(p.Data);
+                if (!Helpers.isEvil(p) && playerCompleted < HandleGuesser.tasksToUnlock || remainingShots == 0)
+                    roleName += Helpers.cs(Color.gray, " (Guesser)");
+                else
+                    roleName += Helpers.cs(Color.white," (Guesser)");
+            }
 
             if (!suppressGhostInfo && p != null) {
-                if (p == Shifter.shifter && (CachedPlayer.LocalPlayer.PlayerControl == Shifter.shifter || Helpers.shouldShowGhostInfo()) && Shifter.futureShift != null)
+                if (p == Shifter.shifter && (PlayerControl.LocalPlayer == Shifter.shifter || Helpers.shouldShowGhostInfo()) && Shifter.futureShift != null)
                     roleName += Helpers.cs(Color.yellow, " ← " + Shifter.futureShift.Data.PlayerName);
-                if (p == Vulture.vulture && (CachedPlayer.LocalPlayer.PlayerControl == Vulture.vulture || Helpers.shouldShowGhostInfo()))
+                if (p == Vulture.vulture && (PlayerControl.LocalPlayer == Vulture.vulture || Helpers.shouldShowGhostInfo()))
                     roleName = roleName + Helpers.cs(Vulture.color, $" ({Vulture.vultureNumberToWin - Vulture.eatenBodies} left)");
                 if (Helpers.shouldShowGhostInfo()) {
                     if (Eraser.futureErased.Contains(p))
@@ -274,7 +284,7 @@ namespace TheOtherRoles
                     if (Arsonist.dousedPlayers.Contains(p))
                         roleName = Helpers.cs(Arsonist.color, "♨ ") + roleName;
                     if (p == Arsonist.arsonist)
-                        roleName = roleName + Helpers.cs(Arsonist.color, $" ({CachedPlayer.AllPlayers.Count(x => { return x.PlayerControl != Arsonist.arsonist && !x.Data.IsDead && !x.Data.Disconnected && !Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); })} left)");
+                        roleName = roleName + Helpers.cs(Arsonist.color, $" ({PlayerControl.AllPlayerControls.ToArray().Count(x => { return x != Arsonist.arsonist && !x.Data.IsDead && !x.Data.Disconnected && !Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); })} left)");
                     if (p == Jackal.fakeSidekick)
                         roleName = Helpers.cs(Sidekick.color, $" (fake SK)") + roleName;
 
index 006693f4213590e959d44dbf97418799843a0103..8061ccaa84c2dd89a2c513fe76a1161050f47b03 100644 (file)
@@ -5,6 +5,7 @@ using System.Collections.Generic;
 using System.Text;
 using UnityEngine;
 using System.Linq;
+using Reactor.Utilities.Extensions;
 
 namespace TheOtherRoles
 {
@@ -20,19 +21,30 @@ namespace TheOtherRoles
             soundEffects = new Dictionary<string, AudioClip>();
             Assembly assembly = Assembly.GetExecutingAssembly();
             string[] resourceNames = assembly.GetManifestResourceNames();
+
+            /* Old way of loading .raw files. Left here for reference -Gendelo
             foreach (string resourceName in resourceNames)
             {
-                if (resourceName.Contains("TheOtherRoles.Resources.SoundEffects.") && resourceName.Contains(".raw"))
+                if (resourceName.Contains("TheOtherRoles.Resources.SoundEffects.") && (resourceName.Contains(".raw") || resourceName.Contains(".ogg")))
                 {
                     soundEffects.Add(resourceName, Helpers.loadAudioClipFromResources(resourceName));
                 }
+            }*/
+
+            var resourceBundle = assembly.GetManifestResourceStream("TheOtherRoles.Resources.SoundEffects.toraudio");
+            var assetBundle = AssetBundle.LoadFromMemory(resourceBundle.ReadFully());
+            foreach (var f in assetBundle.GetAllAssetNames()) {
+                soundEffects.Add(f, assetBundle.LoadAsset<AudioClip>(f).DontUnload());
             }
+            assetBundle.Unload(false);
+
         }
 
         public static AudioClip get(string path)
         {
             // Convenience: As as SoundEffects are stored in the same folder, allow using just the name as well
-            if (!path.Contains(".")) path = "TheOtherRoles.Resources.SoundEffects." + path + ".raw";
+            //if (!path.Contains(".")) path = "TheOtherRoles.Resources.SoundEffects." + path + ".raw";
+            path = "assets/audio/" + path.ToLower() + ".ogg";
             AudioClip returnValue;
             return soundEffects.TryGetValue(path, out returnValue) ? returnValue : null;
         }
@@ -60,7 +72,7 @@ namespace TheOtherRoles
                         source.Stop();
                     }
                     float distance, volume;
-                    distance = Vector2.Distance(position, Players.CachedPlayer.LocalPlayer.PlayerControl.GetTruePosition());
+                    distance = Vector2.Distance(position, PlayerControl.LocalPlayer.GetTruePosition());
                     if (distance < range)
                         volume = (1f - distance / range);
                     else
index fbfa4913fb8e704900b08881ced2962db2c69803..1fe678294412c6a4aabecfc4ebfbc6b3759f89bc 100644 (file)
@@ -6,7 +6,7 @@ using BepInEx;
 using BepInEx.Unity.IL2CPP;
 using HarmonyLib;
 using TheOtherRoles.Patches;
-using TheOtherRoles.Players;
+
 using UnityEngine;
 using Object = UnityEngine.Object;
 
@@ -155,7 +155,7 @@ namespace TheOtherRoles
 
         public static void ChangeFloor(bool toUpper) {
             if (!Loaded) return;
-            MonoBehaviour _floorHandler = ((Component)GetFloorHandlerMethod.Invoke(null, new object[] { CachedPlayer.LocalPlayer.PlayerControl })).TryCast(FloorHandlerType) as MonoBehaviour;
+            MonoBehaviour _floorHandler = ((Component)GetFloorHandlerMethod.Invoke(null, new object[] { PlayerControl.LocalPlayer })).TryCast(FloorHandlerType) as MonoBehaviour;
             RpcRequestChangeFloorMethod.Invoke(_floorHandler, new object[] { toUpper });
         }
 
@@ -168,7 +168,7 @@ namespace TheOtherRoles
             if (!Loaded) return;
             try {
                 ShipStatus.Instance.RpcRepairSystem((SystemTypes)130, 64);
-                RepairDamageMethod.Invoke(SubmarineOxygenSystemInstanceField.Invoke(null, Array.Empty<object>()), new object[] { CachedPlayer.LocalPlayer.PlayerControl, 64 });
+                RepairDamageMethod.Invoke(SubmarineOxygenSystemInstanceField.Invoke(null, Array.Empty<object>()), new object[] { PlayerControl.LocalPlayer, 64 });
             }
             catch (System.NullReferenceException) {
                 TheOtherRolesPlugin.Logger.LogMessage("null reference in engineer oxygen fix");
index 8ce050a5b501179f228f08b697137da7e77d80a2..1eda7def79f9bfc0b72828b8e23978281773d061 100644 (file)
@@ -9,7 +9,7 @@ namespace TheOtherRoles {
         public static Tuple<int, int> taskInfo(NetworkedPlayerInfo playerInfo) {
             int TotalTasks = 0;
             int CompletedTasks = 0;
-            if (!playerInfo.Disconnected && playerInfo.Tasks != null &&
+            if (playerInfo != null && !playerInfo.Disconnected && playerInfo.Tasks != null &&
                 playerInfo.Object &&
                 playerInfo.Role && playerInfo.Role.TasksCountTowardProgress &&
                 !playerInfo.Object.hasFakeTasks() && !playerInfo.Role.IsImpostor
index 63aa6be5e9c8ccbc6fe45ead44a9608ab91d1775..ee52ab34ed86a5694527617da4a172a24407c3b9 100644 (file)
@@ -4,7 +4,7 @@ using System;
 using System.Collections.Generic;
 using UnityEngine;
 using TheOtherRoles.Objects;
-using TheOtherRoles.Players;
+
 using TheOtherRoles.Utilities;
 using TheOtherRoles.CustomGameModes;
 using static TheOtherRoles.TheOtherRoles;
@@ -74,6 +74,7 @@ namespace TheOtherRoles
             Vip.clearAndReload();
             Invert.clearAndReload();
             Chameleon.clearAndReload();
+            Armored.clearAndReload();
 
             // Gamemodes
             HandleGuesser.clearAndReload();
@@ -318,11 +319,11 @@ namespace TheOtherRoles
             public static void setHandcuffedKnows(bool active = true, byte playerId = Byte.MaxValue)
             {
                 if (playerId == Byte.MaxValue)
-                    playerId = CachedPlayer.LocalPlayer.PlayerId;
+                    playerId = PlayerControl.LocalPlayer.PlayerId;
 
-                if (active && playerId == CachedPlayer.LocalPlayer.PlayerId) {
-                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(CachedPlayer.LocalPlayer.PlayerControl.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
-                    writer.Write(CachedPlayer.LocalPlayer.PlayerId);
+                if (active && playerId == PlayerControl.LocalPlayer.PlayerId) {
+                    MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShareGhostInfo, Hazel.SendOption.Reliable, -1);
+                    writer.Write(PlayerControl.LocalPlayer.PlayerId);
                     writer.Write((byte)RPCProcedure.GhostInfoTypes.HandcuffNoticed);
                     AmongUsClient.Instance.FinishRpcImmediately(writer);
                 }
@@ -332,7 +333,7 @@ namespace TheOtherRoles
                     handcuffedPlayers.RemoveAll(x => x == playerId);
                }
 
-                if (playerId == CachedPlayer.LocalPlayer.PlayerId) {
+                if (playerId == PlayerControl.LocalPlayer.PlayerId) {
                     HudManagerStartPatch.setAllButtonsHandcuffedStatus(active);
                     SoundEffectsManager.play("deputyHandcuff");
                }
@@ -454,10 +455,10 @@ namespace TheOtherRoles
             bool isMorphedMorphling = target == Morphling.morphling && Morphling.morphTarget != null && Morphling.morphTimer > 0f;
             if (Medic.shielded != null && ((target == Medic.shielded && !isMorphedMorphling) || (isMorphedMorphling && Morphling.morphTarget == Medic.shielded))) {
                 hasVisibleShield = Medic.showShielded == 0 || Helpers.shouldShowGhostInfo() // Everyone or Ghost info
-                    || (Medic.showShielded == 1 && (CachedPlayer.LocalPlayer.PlayerControl == Medic.shielded || CachedPlayer.LocalPlayer.PlayerControl == Medic.medic)) // Shielded + Medic
-                    || (Medic.showShielded == 2 && CachedPlayer.LocalPlayer.PlayerControl == Medic.medic); // Medic only
+                    || (Medic.showShielded == 1 && (PlayerControl.LocalPlayer == Medic.shielded || PlayerControl.LocalPlayer == Medic.medic)) // Shielded + Medic
+                    || (Medic.showShielded == 2 && PlayerControl.LocalPlayer == Medic.medic); // Medic only
                 // Make shield invisible till after the next meeting if the option is set (the medic can already see the shield)
-                hasVisibleShield = hasVisibleShield && (Medic.meetingAfterShielding || !Medic.showShieldAfterMeeting || CachedPlayer.LocalPlayer.PlayerControl == Medic.medic || Helpers.shouldShowGhostInfo());
+                hasVisibleShield = hasVisibleShield && (Medic.meetingAfterShielding || !Medic.showShieldAfterMeeting || PlayerControl.LocalPlayer == Medic.medic || Helpers.shouldShowGhostInfo());
             }
             return hasVisibleShield;            
         }
@@ -651,7 +652,7 @@ namespace TheOtherRoles
 
         public static void resetCamouflage() {
             camouflageTimer = 0f;
-            foreach (PlayerControl p in CachedPlayer.AllPlayers) {
+            foreach (PlayerControl p in PlayerControl.AllPlayerControls) {
                 if (p == Ninja.ninja && Ninja.isInvisble)
                     continue;
                 p.setDefaultLook();
@@ -1250,7 +1251,7 @@ namespace TheOtherRoles
         }
 
         public static bool dousedEveryoneAlive() {
-            return CachedPlayer.AllPlayers.All(x => { return x.PlayerControl == Arsonist.arsonist || x.Data.IsDead || x.Data.Disconnected || Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); });
+            return PlayerControl.AllPlayerControls.ToArray().All(x => { return x == Arsonist.arsonist || x.Data.IsDead || x.Data.Disconnected || Arsonist.dousedPlayers.Any(y => y.PlayerId == x.PlayerId); });
         }
 
         public static void clearAndReload() {
@@ -1435,17 +1436,17 @@ namespace TheOtherRoles
             chanceAdditionalInfo = CustomOptionHolder.mediumChanceAdditionalInfo.getSelection() / 10f;
         }
 
-        public static string getInfo(PlayerControl target, PlayerControl killer) {
+        public static string getInfo(PlayerControl target, PlayerControl killer, DeadPlayer.CustomDeathReason deathReason) {
             string msg = "";
 
             List<SpecialMediumInfo> infos = new List<SpecialMediumInfo>();
             // collect fitting death info types.
             // suicides:
             if (killer == target) {
-                if (target == Sheriff.sheriff || target == Sheriff.formerSheriff) infos.Add(SpecialMediumInfo.SheriffSuicide);
+                if ((target == Sheriff.sheriff || target == Sheriff.formerSheriff) && deathReason != DeadPlayer.CustomDeathReason.LoverSuicide) infos.Add(SpecialMediumInfo.SheriffSuicide);
                 if (target == Lovers.lover1 || target == Lovers.lover2) infos.Add(SpecialMediumInfo.PassiveLoverSuicide);
-                if (target == Thief.thief) infos.Add(SpecialMediumInfo.ThiefSuicide);
-                if (target == Warlock.warlock) infos.Add(SpecialMediumInfo.WarlockSuicide);
+                if (target == Thief.thief && deathReason != DeadPlayer.CustomDeathReason.LoverSuicide) infos.Add(SpecialMediumInfo.ThiefSuicide);
+                if (target == Warlock.warlock && deathReason != DeadPlayer.CustomDeathReason.LoverSuicide) infos.Add(SpecialMediumInfo.WarlockSuicide);
             } else {
                 if (target == Lovers.lover1 || target == Lovers.lover2) infos.Add(SpecialMediumInfo.ActiveLoverDies);
                 if (target.Data.Role.IsImpostor && killer.Data.Role.IsImpostor && Thief.formerThief != killer) infos.Add(SpecialMediumInfo.ImpostorTeamkill);
@@ -1891,8 +1892,8 @@ namespace TheOtherRoles
 
         public static void setPosition() {
             if (position == Vector3.zero) return;  // Check if this has been set, otherwise first spawn on submerged will fail
-            if (antiTeleport.FindAll(x => x.PlayerId == CachedPlayer.LocalPlayer.PlayerId).Count > 0) {
-                CachedPlayer.LocalPlayer.NetTransform.RpcSnapTo(position);
+            if (antiTeleport.FindAll(x => x.PlayerId == PlayerControl.LocalPlayer.PlayerId).Count > 0) {
+                PlayerControl.LocalPlayer.NetTransform.RpcSnapTo(position);
                 if (SubmergedCompatibility.IsSubmerged) {
                     SubmergedCompatibility.ChangeFloor(position.y > -7);
                 }
@@ -2034,6 +2035,17 @@ namespace TheOtherRoles
         }
     }
 
+    public static class Armored {
+        public static PlayerControl armored;
+        
+        public static bool isBrokenArmor = false;
+
+        public static void clearAndReload() {
+            armored = null;
+            isBrokenArmor = false;
+        }
+    }
+
     public static class Shifter {
         public static PlayerControl shifter;
 
index 500b874776757079542d5fddf341b2727a7b8eeb..4d0f4abae4cedf65636b076c3132b07b9a69549b 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
     <PropertyGroup>
         <TargetFramework>net6.0</TargetFramework>
-        <Version>4.6.0</Version>
+        <Version>4.7.0</Version>
         <Description>TheOtherRoles</Description>
         <Authors>Eisbison</Authors>
                <LangVersion>latest</LangVersion>
     </ItemGroup>
    
        <ItemGroup>
-               <PackageReference Include="AmongUs.GameLibs.Steam" Version="2024.6.18" />
+               <PackageReference Include="AmongUs.GameLibs.Steam" Version="2024.10.29" />
                <PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.1.0-rc.1" />
-               <PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.692" />
-        <PackageReference Include="Reactor" Version="2.2.0" />
+               <PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.697" />
+        <PackageReference Include="Reactor" Version="2.3.1" />
     </ItemGroup>
    
+       <ItemGroup>
+         <Folder Include="Players\" />
+       </ItemGroup>
+   
     <Target Name="Date" BeforeTargets="BeforeBuild">  <!--Will make the compile time available s.t. we can let betas expire-->
     <WriteLinesToFile File="$(IntermediateOutputPath)gen.cs" Lines="static partial class Builtin { public static long CompileTime = $([System.DateTime]::UtcNow.Ticks) %3B }" Overwrite="true" />
     <ItemGroup>
index a7c7a1ccbdd701e3cf952a0de67a5a59e756b475..ea9a9eed339225e7361d1df6c50c5e473993ba19 100644 (file)
@@ -4,7 +4,7 @@ using System.Text;
 using UnityEngine;
 using TheOtherRoles;
 using TheOtherRoles.Patches;
-using TheOtherRoles.Players;
+
 using static TheOtherRoles.TheOtherRoles;
 using System.Linq;
 using InnerNet;
index 2b81e0852e45aa4de5bb606306bbbd0789ac2199..d9637f1394b957ee20070717130f0c412adc0348 100644 (file)
@@ -12,6 +12,7 @@ namespace TheOtherRoles.Utilities {
         public static bool killsThroughShield = true;
         public static bool evilGuesserCanGuessSpy = true;
         public static bool guesserCantGuessSnitch = false;
+        public static int tasksToUnlock = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeCrewGuesserNumberOfTasks.getFloat());
 
         public static Sprite getTargetSprite() {
             if (targetSprite) return targetSprite;
@@ -43,6 +44,7 @@ namespace TheOtherRoles.Utilities {
                 hasMultipleShotsPerMeeting = CustomOptionHolder.guesserGamemodeHasMultipleShotsPerMeeting.getBool();
                 killsThroughShield = CustomOptionHolder.guesserGamemodeKillsThroughShield.getBool();
                 evilGuesserCanGuessSpy = CustomOptionHolder.guesserGamemodeEvilCanKillSpy.getBool();
+                tasksToUnlock = Mathf.RoundToInt(CustomOptionHolder.guesserGamemodeCrewGuesserNumberOfTasks.getFloat());
             } else {
                 guesserCantGuessSnitch = CustomOptionHolder.guesserCantGuessSnitchIfTaksDone.getBool();
                 hasMultipleShotsPerMeeting = CustomOptionHolder.guesserHasMultipleShotsPerMeeting.getBool();
index e83bd997053a6b08d0024e42fcb0ed8aa19d8443..3f34044c1eb6249575836a10313ee3bd1d2f55b6 100644 (file)
@@ -4,9 +4,9 @@
     "net6.0": {
       "AmongUs.GameLibs.Steam": {
         "type": "Direct",
-        "requested": "[2024.6.18, )",
-        "resolved": "2024.6.18",
-        "contentHash": "xb+HP1xXn4/ES8AgXpk9xeoW568LFYw5NTjY6bHwd6vQjHDf2kT1xHMmQ1me5Vfee/Gp69YIMZDXUAUToG7Elg=="
+        "requested": "[2024.10.29, )",
+        "resolved": "2024.10.29",
+        "contentHash": "znuLMD9DRMTp7RMfIz3hts5KUljioPZ1TiuodgyFrH3mDEcOLZtn1sA08AU9pUzsgQA9hzikrrzP+sJIsPqZ9g=="
       },
       "BepInEx.IL2CPP.MSBuild": {
         "type": "Direct",
       },
       "BepInEx.Unity.IL2CPP": {
         "type": "Direct",
-        "requested": "[6.0.0-be.692, )",
-        "resolved": "6.0.0-be.692",
-        "contentHash": "rYjnJCN2APD/04dZUKhRCbu30jhzseIKd0+pfaWWgfDJNggd8rq+whEzM/ZC0fEkkLgcIkEgbtX2LuSqsCrIgg==",
-        "dependencies": {
-          "BepInEx.Core": "6.0.0-be.692",
-          "BepInEx.Unity.Common": "6.0.0-be.692",
-          "HarmonyX": "2.10.1",
-          "Iced": "1.20.0",
+        "requested": "[6.0.0-be.697, )",
+        "resolved": "6.0.0-be.697",
+        "contentHash": "+ahFT8WkKZ8m9NCdXgQI05M34/mdE1MXmLnLRKhqpjId6mqDQf9ORJ1bCPifdkbgYJjteIvey9EreCfmD9Vndw==",
+        "dependencies": {
+          "BepInEx.Core": "6.0.0-be.697",
+          "BepInEx.Unity.Common": "6.0.0-be.697",
+          "HarmonyX": "2.10.2",
+          "Iced": "1.21.0",
           "Il2CppInterop.Generator": "1.4.6-ci.426",
           "Il2CppInterop.HarmonySupport": "1.4.6-ci.426",
           "Il2CppInterop.Runtime": "1.4.6-ci.426",
       },
       "Reactor": {
         "type": "Direct",
-        "requested": "[2.2.0, )",
-        "resolved": "2.2.0",
-        "contentHash": "foMHya01tmr//3tw+kO7FmY1ojnR0m+ShMU6sxogbnWeO85lmX3QM8aSIsYeAhtJSThf6Ben6iTM4O0KgVcmqw==",
+        "requested": "[2.3.1, )",
+        "resolved": "2.3.1",
+        "contentHash": "CsFs84aM3PA6+74TzHEAUayXOosYBJEJKf1Ebs3CpL10RMLrj+WRAWrpgFoNd9qS+pIzQflW76Q5Pgg/aOQ40w==",
         "dependencies": {
-          "BepInEx.Unity.IL2CPP": "6.0.0-be.670"
+          "BepInEx.Unity.IL2CPP": "6.0.0-be.679"
         }
       },
       "AsmResolver": {
       },
       "AssetRipper.Primitives": {
         "type": "Transitive",
-        "resolved": "3.1.1",
-        "contentHash": "GhFAVMWpG8MyZscQxwYCd1HSS36UhIQeW0Gn9iPYiininZWlo8RTV9tGYv0CNNXw5bODYJtXf4qiqo6sQOVAEg=="
+        "resolved": "3.1.3",
+        "contentHash": "djZbN/+EXmI+Oia9Pm0LyjZVCPLf60TPSL5rGb7mBEYM5F4CN3nPFXvl2yA5LanPZoHS1Yq7PghGUmkP7Pv9RQ=="
       },
       "BepInEx.Core": {
         "type": "Transitive",
-        "resolved": "6.0.0-be.692",
-        "contentHash": "I/JuhVhOXUFRrSxy7MqMHpygKoYNt39XY5V8e7PTLbq+nfCBGYzOhszcPx90Wj5xGPx6IFuABJocWAbFDHUddA==",
+        "resolved": "6.0.0-be.697",
+        "contentHash": "6p/zLtBja8BEA5+FwFwH1lUg8avO725mZKRw0P1JbuXj/XUZL8Qy5n0c7COiq/dJ58nCyW5J/ldeYUHM0c4vRA==",
         "dependencies": {
-          "HarmonyX": "2.10.1",
+          "HarmonyX": "2.10.2",
           "MonoMod.Utils": "22.5.1.1",
           "SemanticVersioning": "2.0.2"
         }
       },
       "BepInEx.Unity.Common": {
         "type": "Transitive",
-        "resolved": "6.0.0-be.692",
-        "contentHash": "QYsp8Sf4kQwmx4qwFLhS7SW+Dp67iBibb0zo5IdMQXGmS0KY2WH7/SZ+fFmG6ce06BT+E58wsxk0rU6NW0qWbg==",
+        "resolved": "6.0.0-be.697",
+        "contentHash": "6eTjN4vBy7veWUwCVWqfvL05fQ4MskpjD4wIsD0FF8g0kF/1lKjsK0Fmyb4N78vSrvm/tV1quhHChCh2SQU0GQ==",
         "dependencies": {
-          "AssetRipper.Primitives": "3.1.1",
+          "AssetRipper.Primitives": "3.1.3",
           "MonoMod.Utils": "22.5.1.1"
         }
       },
       },
       "HarmonyX": {
         "type": "Transitive",
-        "resolved": "2.10.1",
-        "contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
+        "resolved": "2.10.2",
+        "contentHash": "/5WwkxXX8mPsRuigQt957rJGx1f0dDQxk+bvk4yYITKFjXas9Em+O71zEP8X0ym8OFQQ2XH/2SxS4NC7vEC+Xg==",
         "dependencies": {
           "MonoMod.RuntimeDetour": "22.3.23.4",
           "System.Reflection.Emit": "4.7.0"
       },
       "Iced": {
         "type": "Transitive",
-        "resolved": "1.20.0",
-        "contentHash": "cjk+vNDIatLI5vQ22tOCAzsgowZ32Ob1Fy4ljQSfqfzMe5ATKXU+dMPRE6+cIUUFetoyyWkUJArJoxe3QwDXAA=="
+        "resolved": "1.21.0",
+        "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg=="
       },
       "Il2CppInterop.Common": {
         "type": "Transitive",