diff --git a/AmongUsMenu.vcxproj b/AmongUsMenu.vcxproj index a34ea2f9..d2ae7227 100644 --- a/AmongUsMenu.vcxproj +++ b/AmongUsMenu.vcxproj @@ -63,7 +63,7 @@ - + @@ -666,4 +666,4 @@ git rev-parse --abbrev-ref HEAD >> gitparams.h - + \ No newline at end of file diff --git a/AmongUsMenu.vcxproj.filters b/AmongUsMenu.vcxproj.filters index 42b920dc..146339d5 100644 --- a/AmongUsMenu.vcxproj.filters +++ b/AmongUsMenu.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -67,7 +67,7 @@ hooks - + hooks diff --git a/appdata/il2cpp-classes.h b/appdata/il2cpp-classes.h index 3a6909b6..fd07fb74 100644 --- a/appdata/il2cpp-classes.h +++ b/appdata/il2cpp-classes.h @@ -5,7 +5,6 @@ DO_APP_CLASS(GameData, "Assembly-CSharp, GameData"); DO_APP_CLASS(Palette, "Assembly-CSharp, Palette"); DO_APP_CLASS(PlayerControl, "Assembly-CSharp, PlayerControl"); DO_APP_CLASS(ShipStatus, "Assembly-CSharp, ShipStatus"); -DO_APP_CLASS(GameOptionsData, "Assembly-CSharp, GameOptionsData"); DO_APP_CLASS(Camera, "UnityEngine.CoreModule, UnityEngine.Camera"); DO_APP_CLASS(LobbyBehaviour, "Assembly-CSharp, LobbyBehaviour"); //DO_APP_CLASS(SaveManager, "Assembly-CSharp, SaveManager"); diff --git a/appdata/il2cpp-functions.h b/appdata/il2cpp-functions.h index ecc7949d..6e71f5b8 100644 --- a/appdata/il2cpp-functions.h +++ b/appdata/il2cpp-functions.h @@ -42,7 +42,7 @@ DO_APP_FUNC(float, AirshipStatus_CalculateLightRadius, (AirshipStatus* __this, G DO_APP_FUNC(bool, AutoOpenDoor_DoUpdate, (AutoOpenDoor* __this, float dt, MethodInfo* method), "Assembly-CSharp, System.Boolean AutoOpenDoor::DoUpdate(System.Single)"); -DO_APP_FUNC(void, NoShadowBehaviour_LateUpdate, (NoShadowBehaviour* __this, MethodInfo* method), "Assembly-CSharp, System.Void NoShadowBehaviour::LateUpdate()"); +//DO_APP_FUNC(void, NoShadowBehaviour_LateUpdate, (NoShadowBehaviour* __this, MethodInfo* method), "Assembly-CSharp, System.Void NoShadowBehaviour::LateUpdate()"); DO_APP_FUNC(void, NoShadowBehaviour_SetMaskFunction, (NoShadowBehaviour* __this, int32_t func, MethodInfo* method), "Assembly-CSharp, System.Void NoShadowBehaviour::SetMaskFunction(System.Int32)"); DO_APP_FUNC(Vector3, Camera_ScreenToWorldPoint, (Camera* __this, Vector3 position, MethodInfo* method), "UnityEngine.CoreModule, UnityEngine.Vector3 UnityEngine.Camera::ScreenToWorldPoint(UnityEngine.Vector3)"); @@ -56,9 +56,6 @@ DO_APP_FUNC(GameData_PlayerInfo*, GameData_GetPlayerById, (GameData* __this, uin DO_APP_FUNC(void, GameObject_SetActive, (GameObject* __this, bool value, MethodInfo* method), "UnityEngine.CoreModule, System.Void UnityEngine.GameObject::SetActive(System.Boolean)"); -DO_APP_FUNC(GameOptionsData*, GameOptionsData_Deserialize, (BinaryReader* reader, MethodInfo* method), "Assembly-CSharp, GameOptionsData GameOptionsData::Deserialize(System.IO.BinaryReader)"); -DO_APP_FUNC(GameOptionsData*, GameOptionsData_Deserialize_1, (MessageReader* reader, MethodInfo* method), "Assembly-CSharp, GameOptionsData GameOptionsData::Deserialize(Hazel.MessageReader)"); - DO_APP_FUNC(void, KeyboardJoystick_Update, (KeyboardJoystick* __this, MethodInfo* method), "Assembly-CSharp, System.Void KeyboardJoystick::Update()"); DO_APP_FUNC(void, ScreenJoystick_FixedUpdate, (ScreenJoystick* __this, MethodInfo* method), "Assembly-CSharp, System.Void ScreenJoystick::FixedUpdate()"); @@ -84,14 +81,14 @@ DO_APP_FUNC(void, PlayerControl_CompleteTask, (PlayerControl* __this, uint32_t i DO_APP_FUNC(void, PlayerControl_FixedUpdate, (PlayerControl* __this, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::FixedUpdate()"); DO_APP_FUNC(GameData_PlayerInfo*, PlayerControl_get_Data, (PlayerControl* __this, MethodInfo* method), "Assembly-CSharp, GameData.PlayerInfo PlayerControl::get_Data()"); DO_APP_FUNC(Vector2, PlayerControl_GetTruePosition, (PlayerControl* __this, MethodInfo* method), "Assembly-CSharp, UnityEngine.Vector2 PlayerControl::GetTruePosition()"); -DO_APP_FUNC(void, PlayerControl_RpcSyncSettings, (PlayerControl* __this, GameOptionsData* gameOptions, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSyncSettings(GameOptionsData)"); +DO_APP_FUNC(void, PlayerControl_RpcSyncSettings, (PlayerControl* __this, Byte__Array* optionsByteArray, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSyncSettings(System.Byte[])"); DO_APP_FUNC(void, PlayerControl_RpcPlayAnimation, (PlayerControl* __this, uint8_t animType, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcPlayAnimation(System.Byte)"); DO_APP_FUNC(void, PlayerControl_CmdReportDeadBody, (PlayerControl* __this, GameData_PlayerInfo* target, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::CmdReportDeadBody(GameData.PlayerInfo)"); DO_APP_FUNC(void, PlayerControl_MurderPlayer, (PlayerControl* __this, PlayerControl* target, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::MurderPlayer(PlayerControl)"); DO_APP_FUNC(void, PlayerControl_RpcMurderPlayer, (PlayerControl* __this, PlayerControl* target, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcMurderPlayer(PlayerControl)"); DO_APP_FUNC(void, PlayerControl_ReportDeadBody, (PlayerControl* __this, GameData_PlayerInfo* target, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::ReportDeadBody(GameData.PlayerInfo)"); DO_APP_FUNC(void, PlayerControl_StartMeeting, (PlayerControl* __this, GameData_PlayerInfo* target, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::StartMeeting(GameData.PlayerInfo)"); -DO_APP_FUNC(void, PlayerControl_RpcSetRole, (PlayerControl* __this, RoleTypes__Enum roleType, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSetRole(RoleTypes)"); +DO_APP_FUNC(void, PlayerControl_RpcSetRole, (PlayerControl* __this, RoleTypes__Enum roleType, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSetRole(AmongUs.GameOptions.RoleTypes)"); DO_APP_FUNC(void, PlayerControl_RpcSetScanner, (PlayerControl* __this, bool value, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSetScanner(System.Boolean)"); DO_APP_FUNC(void, PlayerControl_CmdCheckColor, (PlayerControl* __this, uint8_t bodyColor, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::CmdCheckColor(System.Byte)"); DO_APP_FUNC(void, PlayerControl_RpcSetColor, (PlayerControl* __this, uint8_t bodyColor, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RpcSetColor(System.Byte)"); @@ -127,7 +124,6 @@ DO_APP_FUNC(void, Vent_EnterVent, (Vent* __this, PlayerControl* pc, MethodInfo* DO_APP_FUNC(void, Vent_ExitVent, (Vent* __this, PlayerControl* pc, MethodInfo* method), "Assembly-CSharp, System.Void Vent::ExitVent(PlayerControl)"); DO_APP_FUNC(void, HudManager_Update, (HudManager* __this, MethodInfo* method), "Assembly-CSharp, System.Void HudManager::Update()"); -DO_APP_FUNC(void, HudManager_ShowMap, (HudManager* __this, Action_1_MapBehaviour_* mapAction, MethodInfo* method), "Assembly-CSharp, System.Void HudManager::ShowMap(System.Action)"); DO_APP_FUNC(void, HudManager_SetHudActive, (HudManager* __this, bool isActive, MethodInfo* method), "Assembly-CSharp, System.Void HudManager::SetHudActive(System.Boolean)"); DO_APP_FUNC(void, ChatController_AddChat, (ChatController* __this, PlayerControl* sourcePlayer, String* chatText, MethodInfo* method), "Assembly-CSharp, System.Void ChatController::AddChat(PlayerControl, System.String)"); DO_APP_FUNC(void, ChatController_SetVisible, (ChatController* __this, bool visible, MethodInfo* method), "Assembly-CSharp, System.Void ChatController::SetVisible(System.Boolean)"); @@ -196,20 +192,13 @@ DO_APP_FUNC(void, TMP_Text_set_text, (TMP_Text* __this, String* value, MethodInf DO_APP_FUNC(Color32, Color32_op_Implicit, (Color c, MethodInfo* method), "UnityEngine.CoreModule, UnityEngine.Color32 UnityEngine.Color32::op_Implicit(UnityEngine.Color)"); DO_APP_FUNC(void, RoleManager_SelectRoles, (RoleManager* __this, MethodInfo* method), "Assembly-CSharp, System.Void RoleManager::SelectRoles()"); -DO_APP_FUNC(void, RoleManager_AssignRolesForTeam, (List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method), "Assembly-CSharp, System.Void RoleManager::AssignRolesForTeam(System.Collections.Generic.List, RoleOptionsData, RoleTeamTypes, System.Int32, System.Nullable)"); -DO_APP_FUNC(void, RoleManager_AssignRolesFromList, (List_1_GameData_PlayerInfo_* players, int32_t teamMax, List_1_RoleTypes_* roleList, int32_t* rolesAssigned, MethodInfo* method), "Assembly-CSharp, System.Void RoleManager::AssignRolesFromList(System.Collections.Generic.List, System.Int32, System.Collections.Generic.List, System.Int32&)"); +//DO_APP_FUNC(void, RoleManager_AssignRolesForTeam, (List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method), "Assembly-CSharp, System.Void RoleManager::AssignRolesForTeam(System.Collections.Generic.List, RoleOptionsData, RoleTeamTypes, System.Int32, System.Nullable)"); +//DO_APP_FUNC(void, RoleManager_AssignRolesFromList, (List_1_GameData_PlayerInfo_* players, int32_t teamMax, List_1_RoleTypes_* roleList, int32_t* rolesAssigned, MethodInfo* method), "Assembly-CSharp, System.Void RoleManager::AssignRolesFromList(System.Collections.Generic.List, System.Int32, System.Collections.Generic.List, System.Int32&)"); DO_APP_FUNC(void, InnerNetClient_EnqueueDisconnect, (InnerNetClient* __this, DisconnectReasons__Enum reason, String* stringReason, MethodInfo* method), "Assembly-CSharp, System.Void InnerNet.InnerNetClient::EnqueueDisconnect(DisconnectReasons, System.String)"); DO_APP_FUNC(void, InnerNetClient_DisconnectInternal, (InnerNetClient* __this, DisconnectReasons__Enum reason, String* stringReason, MethodInfo* method), "Assembly-CSharp, System.Void InnerNet.InnerNetClient::DisconnectInternal(DisconnectReasons, System.String)"); DO_APP_FUNC(void, PlayerPhysics_FixedUpdate, (PlayerPhysics* __this, MethodInfo* method), "Assembly-CSharp, System.Void PlayerPhysics::FixedUpdate()"); -// deprecated -DO_APP_FUNC(String*, SaveManager_get_PlayerName, (MethodInfo* method), "Assembly-CSharp, System.String SaveManager::get_PlayerName()"); -// deprecated -DO_APP_FUNC(void, SaveManager_set_PlayerName, (String* value, MethodInfo* method), "Assembly-CSharp, System.Void SaveManager::set_PlayerName(System.String)"); -// deprecated -DO_APP_FUNC(bool, SaveManager_GetPurchase, (String* itemKey, String* bundleKey, MethodInfo* method), "Assembly-CSharp, System.Boolean SaveManager::GetPurchase(System.String, System.String)"); - DO_APP_FUNC(void, PlayerControl_TurnOnProtection, (PlayerControl* __this, bool visible, int32_t colorId, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::TurnOnProtection(System.Boolean, System.Int32)"); DO_APP_FUNC(void, PlayerControl_RemoveProtection, (PlayerControl* __this, MethodInfo* method), "Assembly-CSharp, System.Void PlayerControl::RemoveProtection()"); @@ -228,4 +217,9 @@ DO_APP_FUNC(void, PlayerStorageManager_OnReadPlayerPrefsComplete, (PlayerStorage DO_APP_FUNC(PlayerData*, DataManager_get_Player, (MethodInfo* method), "Assembly-CSharp, AmongUs.Data.Player.PlayerData AmongUs.Data.DataManager::get_Player()"); DO_APP_FUNC(String*, PlayerCustomizationData_get_Name, (PlayerCustomizationData* __this, MethodInfo* method), "Assembly-CSharp, System.String AmongUs.Data.Player.PlayerCustomizationData::get_Name()"); DO_APP_FUNC(void, PlayerCustomizationData_set_Name, (PlayerCustomizationData* __this, String* value, MethodInfo* method), "Assembly-CSharp, System.Void AmongUs.Data.Player.PlayerCustomizationData::set_Name(System.String)"); -DO_APP_FUNC(bool, PlayerPurchasesData_GetPurchase, (PlayerPurchasesData* __this, String* itemKey, String* bundleKey, MethodInfo* method), "Assembly-CSharp, System.Boolean PlayerPurchasesData::GetPurchase(System.String, System.String)"); \ No newline at end of file +DO_APP_FUNC(bool, PlayerPurchasesData_GetPurchase, (PlayerPurchasesData* __this, String* itemKey, String* bundleKey, MethodInfo* method), "Assembly-CSharp, System.Boolean PlayerPurchasesData::GetPurchase(System.String, System.String)"); + +// 2022.12.08e +DO_APP_FUNC(void, GameOptionsManager_set_CurrentGameOptions, (GameOptionsManager* __this, IGameOptions* value, MethodInfo* method), "Assembly-CSharp, System.Void GameOptionsManager::set_CurrentGameOptions(AmongUs.GameOptions.IGameOptions)"); +DO_APP_FUNC(GameManager*, GameManager_get_Instance, (MethodInfo* method), "Assembly-CSharp, GameManager GameManager::get_Instance()"); +DO_APP_FUNC(LogicOptions*, GameManager_get_LogicOptions, (GameManager* __this, MethodInfo* method), "Assembly-CSharp, LogicOptions GameManager::get_LogicOptions()"); \ No newline at end of file diff --git a/appdata/il2cpp-types.h b/appdata/il2cpp-types.h index 4546f230..0fb3b6ec 100644 --- a/appdata/il2cpp-types.h +++ b/appdata/il2cpp-types.h @@ -4022,7 +4022,7 @@ namespace app int32_t m_spriteIndex; int32_t m_spriteAnimationID; bool m_ignoreActiveState; - struct TMP_Text_TextBackingContainer m_TextBackingArray; + struct TMP_Text_TextBackingContainer m_TextBackingArray; void* k_Power; }; @@ -4169,9 +4169,8 @@ namespace app VirtualInvokeData InternalUpdate; }; - struct TMP_Text__StaticFields - { - + struct TMP_Text__StaticFields { + // ... }; struct TMP_Text__Class @@ -4495,13 +4494,11 @@ namespace app #pragma endregion #pragma region FullAccount - struct FullAccount__Fields - { + struct FullAccount__Fields { struct MonoBehaviour__Fields _; struct GameObject* randomizeNameButton; struct GameObject* editNameButton; - void* linkUnlinkAccountsButton; - struct GameObject* goOfflineButton; + struct GameObject* manageAccount; }; struct FullAccount @@ -4658,6 +4655,7 @@ namespace app struct SpriteRenderer* HighlightedFX; struct TextMeshPro* NameText; struct TextMeshPro* LevelNumberText; + struct TextMeshPro* ColorBlindName; bool AnimateButtonsFromLeft; bool AmDead; bool DidReport; @@ -4934,6 +4932,7 @@ namespace app void* EmergencyOverlay; void* ReportOverlay; void* MeetingBackground; + void* EmergencyButton; struct Vector2 InitialSpawnCenter; struct Vector2 MeetingSpawnCenter; struct Vector2 MeetingSpawnCenter2; @@ -4973,7 +4972,6 @@ namespace app #else int32_t Type; #endif - bool _ShouldCheckForGameEnd_k__BackingField; float _HideCountdown_k__BackingField; void* _CosmeticsCache_k__BackingField; void* logger; @@ -5573,6 +5571,10 @@ namespace app StatsScientistChargesGained = 0x00000604, StatsGuardianAngelCrewmatesProtected = 0x00000605, StatsShapeshifterShiftedKills = 0x00000606, + CrewmateGhostRole = 0x00000607, + ImpostorGhostRole = 0x00000608, + HauntAbilityName = 0x00000609, + SeekButton = 0x0000060a, SanctionDuration = 0x000006a4, SanctionPermanent = 0x000006a5, SanctionConduct = 0x000006a6, @@ -5602,6 +5604,24 @@ namespace app FeaturedCubes = 0x0000076f, BugReportPopUpAttachScreenshotDesc = 0x00000770, UserIdTokenError = 0x00000771, + NewGameMode = 0x00000772, + NewModeInfo = 0x00000773, + HideSeekHowToPlayTitleOne = 0x00000774, + HideSeekHowToPlayCaptionOne = 0x00000775, + HideSeekHowToPlayCaptionTwo = 0x00000776, + HideSeekHowToPlayCaptionThree = 0x00000777, + HideSeekHowToPlayPageOne = 0x00000778, + HideSeekHowToPlayImpostorOne = 0x00000779, + HideSeekHowToPlaySubtextOne = 0x0000077a, + HideSeekHowToPlayCrewmateInfoOne = 0x0000077b, + HideSeekHowToPlayCrewmateInfoTwo = 0x0000077c, + HideSeekHowToPlayImpostorInfoOne = 0x0000077d, + HideSeekHowToPlayFlashlightDefault = 0x0000077e, + HideSeekHowToPlayFinalHide = 0x0000077f, + HideSeekHowToPlayFlashlightMobile = 0x00000780, + HideSeekHowToPlayFlashlightSwitch = 0x00000781, + HideSeekHowToPlayFlashlightConsoles = 0x00000782, + HideSeekHowToPlayFlashlightPlayStation = 0x00000783, QCLocationLaptop = 0x000007d0, QCLocationSkeld = 0x000007d1, QCLocationMira = 0x000007d2, @@ -5933,19 +5953,54 @@ namespace app MaxVentUses = 0x00000a8c, MaxTimeInVent = 0x00000a8d, MinCrewmatesForVitals = 0x00000a8e, - FinalEscapeTime = 0x00000a8f, + EscapeTime = 0x00000a8f, AllTasksComplete = 0x00000a90, EscapePrompt = 0x00000a91, - CrewmateFlashlightFov = 0x00000a92, - ImpostorFlashlightFov = 0x00000a93, + CrewmateFlashlightSize = 0x00000a92, + ImpostorFlashlightSize = 0x00000a93, CrewmateLeadTime = 0x00000a94, CrewmadeHideBlurb = 0x00000a95, ImpostorKillBlurb = 0x00000a96, HideCountdown = 0x00000a97, - MusicDistance = 0x00000a98, + ScaryMusicDistance = 0x00000a98, ShortTaskTimeValue = 0x00000a99, LongTaskTimeValue = 0x00000a9a, CommonTaskTimeValue = 0x00000a9b, + UseFlashlight = 0x00000a9c, + FinalEscapeTime = 0x00000a9d, + VeryScaryMusicDistance = 0x00000a9e, + SeekerFinalSpeed = 0x00000a9f, + SeekerFinalVents = 0x00000aa0, + SeekerFinalMap = 0x00000aa1, + CrewmateVentCooldown = 0x00000aa2, + SeekerPings = 0x00000aa3, + MaxPingTime = 0x00000aa4, + ShowPingTime = 0x00000aa5, + MinPingTime = 0x00000aa6, + ShowCrewmateNames = 0x00000aa7, + ShowImpostorNames = 0x00000aa8, + HideActionButton = 0x00000aa9, + RuleOneCrewmates = 0x00000aaa, + RuleTwoCrewmates = 0x00000aab, + RuleThreeCrewmates = 0x00000aac, + RuleOneImpostor = 0x00000aad, + RuleTwoImpostor = 0x00000aae, + RuleThreeImpostor = 0x00000aaf, + RuleOneCrewmatesTitle = 0x00000ab0, + RuleTwoCrewmatesTitle = 0x00000ab1, + RuleThreeCrewmatesTitle = 0x00000ab2, + RuleOneImpostorTitle = 0x00000ab3, + RuleTwoImpostorTitle = 0x00000ab4, + RoundRobin = 0x00000ab5, + OptionUnavailablePublicLobby = 0x00000ab6, + StatsHidenSeekGamesCrewmateSurvived = 0x00000ab7, + StatsHidenSeekTimesVented = 0x00000ab8, + StatsTimesPettedPet = 0x00000ab9, + StatsImpostorKills_HideAndSeek = 0x00000aba, + StatsFastestCrewmateWin_HideAndSeek = 0x00000abb, + StatsFastestImpostorWin_HideAndSeek = 0x00000abc, + StatsHideAndSeekImpostorVictory = 0x00000abd, + StatsHideAndSeekCrewmateVictory = 0x00000abe, AmongUsFriends = 0x00000af0, FriendsGuestWarning = 0x00000af1, PlatformFriends = 0x00000af2, @@ -5999,6 +6054,9 @@ namespace app FriendListUnavailable = 0x00000b22, SignInIssueTitle = 0x00000b23, SignInIssueText = 0x00000b24, + Ghost = 0x00000b25, + CurrentlyHaunting = 0x00000b26, + RestorePurchases = 0x00000b27, QCAccIsRole = 0x00000bb8, QCAccIsRoleNeg = 0x00000bb9, QCAccShapeshited = 0x00000bba, @@ -6057,6 +6115,24 @@ namespace app ConfirmDeleteAccounts = 0x00000c88, ConfirmDeleteAccountsEmpty = 0x00000c89, AccountRequestDelete = 0x00000c8a, + HasBeenKilled = 0x00000c8b, + GameType = 0x00000dac, + GameTypeError = 0x00000dad, + GameTypeClassic = 0x00000dae, + GameTypeHideAndSeek = 0x00000daf, + PetAction = 0x00000db0, + CreateLabel = 0x00000db1, + TagFiltersTitle = 0x00000db2, + TagFiltersHelpFindGame = 0x00000db3, + TagFiltersHelpCreate = 0x00000db4, + TagsFilteredSingular = 0x00000db5, + TagsFilteredPlural = 0x00000db6, + TagsAppliedSingular = 0x00000db7, + TagsAppliedPlural = 0x00000db8, + DefaultFilterTag_FirstTime = 0x00000db9, + DefaultFilterTag_Casual = 0x00000dba, + DefaultFilterTag_Serious = 0x00000dbb, + DefaultFilterTag_Expert = 0x00000dbc, }; #else @@ -6606,6 +6682,10 @@ namespace app StringNames__Enum_StatsScientistChargesGained = 0x00000604, StringNames__Enum_StatsGuardianAngelCrewmatesProtected = 0x00000605, StringNames__Enum_StatsShapeshifterShiftedKills = 0x00000606, + StringNames__Enum_CrewmateGhostRole = 0x00000607, + StringNames__Enum_ImpostorGhostRole = 0x00000608, + StringNames__Enum_HauntAbilityName = 0x00000609, + StringNames__Enum_SeekButton = 0x0000060a, StringNames__Enum_SanctionDuration = 0x000006a4, StringNames__Enum_SanctionPermanent = 0x000006a5, StringNames__Enum_SanctionConduct = 0x000006a6, @@ -6635,6 +6715,24 @@ namespace app StringNames__Enum_FeaturedCubes = 0x0000076f, StringNames__Enum_BugReportPopUpAttachScreenshotDesc = 0x00000770, StringNames__Enum_UserIdTokenError = 0x00000771, + StringNames__Enum_NewGameMode = 0x00000772, + StringNames__Enum_NewModeInfo = 0x00000773, + StringNames__Enum_HideSeekHowToPlayTitleOne = 0x00000774, + StringNames__Enum_HideSeekHowToPlayCaptionOne = 0x00000775, + StringNames__Enum_HideSeekHowToPlayCaptionTwo = 0x00000776, + StringNames__Enum_HideSeekHowToPlayCaptionThree = 0x00000777, + StringNames__Enum_HideSeekHowToPlayPageOne = 0x00000778, + StringNames__Enum_HideSeekHowToPlayImpostorOne = 0x00000779, + StringNames__Enum_HideSeekHowToPlaySubtextOne = 0x0000077a, + StringNames__Enum_HideSeekHowToPlayCrewmateInfoOne = 0x0000077b, + StringNames__Enum_HideSeekHowToPlayCrewmateInfoTwo = 0x0000077c, + StringNames__Enum_HideSeekHowToPlayImpostorInfoOne = 0x0000077d, + StringNames__Enum_HideSeekHowToPlayFlashlightDefault = 0x0000077e, + StringNames__Enum_HideSeekHowToPlayFinalHide = 0x0000077f, + StringNames__Enum_HideSeekHowToPlayFlashlightMobile = 0x00000780, + StringNames__Enum_HideSeekHowToPlayFlashlightSwitch = 0x00000781, + StringNames__Enum_HideSeekHowToPlayFlashlightConsoles = 0x00000782, + StringNames__Enum_HideSeekHowToPlayFlashlightPlayStation = 0x00000783, StringNames__Enum_QCLocationLaptop = 0x000007d0, StringNames__Enum_QCLocationSkeld = 0x000007d1, StringNames__Enum_QCLocationMira = 0x000007d2, @@ -6966,19 +7064,54 @@ namespace app StringNames__Enum_MaxVentUses = 0x00000a8c, StringNames__Enum_MaxTimeInVent = 0x00000a8d, StringNames__Enum_MinCrewmatesForVitals = 0x00000a8e, - StringNames__Enum_FinalEscapeTime = 0x00000a8f, + StringNames__Enum_EscapeTime = 0x00000a8f, StringNames__Enum_AllTasksComplete = 0x00000a90, StringNames__Enum_EscapePrompt = 0x00000a91, - StringNames__Enum_CrewmateFlashlightFov = 0x00000a92, - StringNames__Enum_ImpostorFlashlightFov = 0x00000a93, + StringNames__Enum_CrewmateFlashlightSize = 0x00000a92, + StringNames__Enum_ImpostorFlashlightSize = 0x00000a93, StringNames__Enum_CrewmateLeadTime = 0x00000a94, StringNames__Enum_CrewmadeHideBlurb = 0x00000a95, StringNames__Enum_ImpostorKillBlurb = 0x00000a96, StringNames__Enum_HideCountdown = 0x00000a97, - StringNames__Enum_MusicDistance = 0x00000a98, + StringNames__Enum_ScaryMusicDistance = 0x00000a98, StringNames__Enum_ShortTaskTimeValue = 0x00000a99, StringNames__Enum_LongTaskTimeValue = 0x00000a9a, StringNames__Enum_CommonTaskTimeValue = 0x00000a9b, + StringNames__Enum_UseFlashlight = 0x00000a9c, + StringNames__Enum_FinalEscapeTime = 0x00000a9d, + StringNames__Enum_VeryScaryMusicDistance = 0x00000a9e, + StringNames__Enum_SeekerFinalSpeed = 0x00000a9f, + StringNames__Enum_SeekerFinalVents = 0x00000aa0, + StringNames__Enum_SeekerFinalMap = 0x00000aa1, + StringNames__Enum_CrewmateVentCooldown = 0x00000aa2, + StringNames__Enum_SeekerPings = 0x00000aa3, + StringNames__Enum_MaxPingTime = 0x00000aa4, + StringNames__Enum_ShowPingTime = 0x00000aa5, + StringNames__Enum_MinPingTime = 0x00000aa6, + StringNames__Enum_ShowCrewmateNames = 0x00000aa7, + StringNames__Enum_ShowImpostorNames = 0x00000aa8, + StringNames__Enum_HideActionButton = 0x00000aa9, + StringNames__Enum_RuleOneCrewmates = 0x00000aaa, + StringNames__Enum_RuleTwoCrewmates = 0x00000aab, + StringNames__Enum_RuleThreeCrewmates = 0x00000aac, + StringNames__Enum_RuleOneImpostor = 0x00000aad, + StringNames__Enum_RuleTwoImpostor = 0x00000aae, + StringNames__Enum_RuleThreeImpostor = 0x00000aaf, + StringNames__Enum_RuleOneCrewmatesTitle = 0x00000ab0, + StringNames__Enum_RuleTwoCrewmatesTitle = 0x00000ab1, + StringNames__Enum_RuleThreeCrewmatesTitle = 0x00000ab2, + StringNames__Enum_RuleOneImpostorTitle = 0x00000ab3, + StringNames__Enum_RuleTwoImpostorTitle = 0x00000ab4, + StringNames__Enum_RoundRobin = 0x00000ab5, + StringNames__Enum_OptionUnavailablePublicLobby = 0x00000ab6, + StringNames__Enum_StatsHidenSeekGamesCrewmateSurvived = 0x00000ab7, + StringNames__Enum_StatsHidenSeekTimesVented = 0x00000ab8, + StringNames__Enum_StatsTimesPettedPet = 0x00000ab9, + StringNames__Enum_StatsImpostorKills_HideAndSeek = 0x00000aba, + StringNames__Enum_StatsFastestCrewmateWin_HideAndSeek = 0x00000abb, + StringNames__Enum_StatsFastestImpostorWin_HideAndSeek = 0x00000abc, + StringNames__Enum_StatsHideAndSeekImpostorVictory = 0x00000abd, + StringNames__Enum_StatsHideAndSeekCrewmateVictory = 0x00000abe, StringNames__Enum_AmongUsFriends = 0x00000af0, StringNames__Enum_FriendsGuestWarning = 0x00000af1, StringNames__Enum_PlatformFriends = 0x00000af2, @@ -7032,6 +7165,9 @@ namespace app StringNames__Enum_FriendListUnavailable = 0x00000b22, StringNames__Enum_SignInIssueTitle = 0x00000b23, StringNames__Enum_SignInIssueText = 0x00000b24, + StringNames__Enum_Ghost = 0x00000b25, + StringNames__Enum_CurrentlyHaunting = 0x00000b26, + StringNames__Enum_RestorePurchases = 0x00000b27, StringNames__Enum_QCAccIsRole = 0x00000bb8, StringNames__Enum_QCAccIsRoleNeg = 0x00000bb9, StringNames__Enum_QCAccShapeshited = 0x00000bba, @@ -7090,6 +7226,24 @@ namespace app StringNames__Enum_ConfirmDeleteAccounts = 0x00000c88, StringNames__Enum_ConfirmDeleteAccountsEmpty = 0x00000c89, StringNames__Enum_AccountRequestDelete = 0x00000c8a, + StringNames__Enum_HasBeenKilled = 0x00000c8b, + StringNames__Enum_GameType = 0x00000dac, + StringNames__Enum_GameTypeError = 0x00000dad, + StringNames__Enum_GameTypeClassic = 0x00000dae, + StringNames__Enum_GameTypeHideAndSeek = 0x00000daf, + StringNames__Enum_PetAction = 0x00000db0, + StringNames__Enum_CreateLabel = 0x00000db1, + StringNames__Enum_TagFiltersTitle = 0x00000db2, + StringNames__Enum_TagFiltersHelpFindGame = 0x00000db3, + StringNames__Enum_TagFiltersHelpCreate = 0x00000db4, + StringNames__Enum_TagsFilteredSingular = 0x00000db5, + StringNames__Enum_TagsFilteredPlural = 0x00000db6, + StringNames__Enum_TagsAppliedSingular = 0x00000db7, + StringNames__Enum_TagsAppliedPlural = 0x00000db8, + StringNames__Enum_DefaultFilterTag_FirstTime = 0x00000db9, + StringNames__Enum_DefaultFilterTag_Casual = 0x00000dba, + StringNames__Enum_DefaultFilterTag_Serious = 0x00000dbb, + StringNames__Enum_DefaultFilterTag_Expert = 0x00000dbc, }; #endif @@ -7451,14 +7605,14 @@ namespace app #pragma endregion #pragma region AirshipStatus - struct AirshipStatus__Fields - { + struct AirshipStatus__Fields { struct ShipStatus__Fields _; void* Ladders; void* SpawnInGame; struct MovingPlatformBehaviour* GapPlatform; void* ShowerParticles; void* LightAffectors; + struct GameObject* outOfOrderPlat; }; struct AirshipStatus @@ -7704,25 +7858,27 @@ namespace app #pragma region RoleTypes__Enum #if defined(_CPLUSPLUS_) - enum class RoleTypes__Enum : uint16_t - { + enum class RoleTypes__Enum : uint16_t { Crewmate = 0x0000, Impostor = 0x0001, Scientist = 0x0002, Engineer = 0x0003, GuardianAngel = 0x0004, Shapeshifter = 0x0005, + CrewmateGhost = 0x0006, + ImpostorGhost = 0x0007, }; #else - enum RoleTypes__Enum - { + enum RoleTypes__Enum { RoleTypes__Enum_Crewmate = 0x0000, RoleTypes__Enum_Impostor = 0x0001, RoleTypes__Enum_Scientist = 0x0002, RoleTypes__Enum_Engineer = 0x0003, RoleTypes__Enum_GuardianAngel = 0x0004, RoleTypes__Enum_Shapeshifter = 0x0005, + RoleTypes__Enum_CrewmateGhost = 0x0006, + RoleTypes__Enum_ImpostorGhost = 0x0007, }; #endif @@ -7765,8 +7921,7 @@ namespace app #pragma endregion #pragma region RoleBehaviour - struct RoleBehaviour__Fields - { + struct RoleBehaviour__Fields { struct MonoBehaviour__Fields _; #if defined(_CPLUSPLUS_) RoleTypes__Enum Role; @@ -7806,9 +7961,15 @@ namespace app int32_t TeamType; #endif struct AbilityButtonSettings* Ability; +#if defined(_CPLUSPLUS_) + RoleTypes__Enum DefaultGhostRole; +#else + uint16_t DefaultGhostRole; +#endif struct AudioClip* UseSound; struct AudioClip* IntroSound; struct PlayerControl* Player; + void* buttonManager; }; struct RoleBehaviour @@ -7823,6 +7984,8 @@ namespace app VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; VirtualInvokeData ToString; + VirtualInvokeData __unknown; + VirtualInvokeData get_IsAffectedByComms; VirtualInvokeData CanUse; VirtualInvokeData DidWin; VirtualInvokeData Deinitialize; @@ -7835,8 +7998,10 @@ namespace app VirtualInvokeData SetPlayerTarget; VirtualInvokeData SetCooldown; VirtualInvokeData IsValidTarget; - VirtualInvokeData __unknown; + VirtualInvokeData FindClosestTarget; VirtualInvokeData GetAbilityDistance; + VirtualInvokeData AdjustTasks; + VirtualInvokeData AppendTaskHint; }; struct RoleBehaviour__StaticFields { @@ -7854,6 +8019,18 @@ namespace app }; #pragma endregion +#pragma region Nullable_1_AmongUs_GameOptions_RoleTypes_ + struct Nullable_1_AmongUs_GameOptions_RoleTypes_ + { +#if defined(_CPLUSPLUS_) + RoleTypes__Enum value; +#else + uint16_t value; +#endif + bool has_value; + }; +#pragma endregion + #pragma region GameData_PlayerInfo struct __declspec(align(4)) GameData_PlayerInfo__Fields { uint8_t PlayerId; @@ -7864,6 +8041,7 @@ namespace app #else uint16_t RoleType; #endif + struct Nullable_1_AmongUs_GameOptions_RoleTypes_ RoleWhenAlive; struct Dictionary_2_PlayerOutfitType_GameData_PlayerOutfit_* Outfits; uint32_t PlayerLevel; bool Disconnected; @@ -7904,11 +8082,11 @@ namespace app #pragma endregion #pragma region MovingPlatformBehaviour - struct MovingPlatformBehaviour__Fields - { + struct MovingPlatformBehaviour__Fields { struct MonoBehaviour__Fields _; struct Vector3 LeftPosition; struct Vector3 RightPosition; + struct Vector3 DisabledPosition; struct Vector3 LeftUsePosition; struct Vector3 RightUsePosition; void* MovingSound; @@ -7992,14 +8170,14 @@ namespace app #endif - struct Minigame__Fields - { + struct Minigame__Fields { struct MonoBehaviour__Fields _; #if defined(_CPLUSPLUS_) TransitionType__Enum TransType; #else int32_t TransType; #endif + struct Vector2 TargetPosition; void* MyTask; void* MyNormTask; void* _Console_k__BackingField; @@ -8362,66 +8540,66 @@ namespace app #pragma endregion #pragma region List_1_RoleEffectAnimation_ -struct __declspec(align(4)) List_1_RoleEffectAnimation___Fields { - struct RoleEffectAnimation__Array *_items; - int32_t _size; - int32_t _version; - struct Object *_syncRoot; -}; - -struct List_1_RoleEffectAnimation_ { - void *klass; - MonitorData *monitor; - struct List_1_RoleEffectAnimation___Fields fields; -}; + struct __declspec(align(4)) List_1_RoleEffectAnimation___Fields { + struct RoleEffectAnimation__Array* _items; + int32_t _size; + int32_t _version; + struct Object* _syncRoot; + }; + + struct List_1_RoleEffectAnimation_ { + void* klass; + MonitorData* monitor; + struct List_1_RoleEffectAnimation___Fields fields; + }; #if defined(_CPLUSPLUS_) -enum class RoleEffectAnimation_EffectType__Enum : int32_t { - Default = 0x00000000, - ProtectLoop = 0x00000001, - Shapeshift = 0x00000002, -}; + enum class RoleEffectAnimation_EffectType__Enum : int32_t { + Default = 0x00000000, + ProtectLoop = 0x00000001, + Shapeshift = 0x00000002, + }; #else -enum RoleEffectAnimation_EffectType__Enum { - RoleEffectAnimation_EffectType__Enum_Default = 0x00000000, - RoleEffectAnimation_EffectType__Enum_ProtectLoop = 0x00000001, - RoleEffectAnimation_EffectType__Enum_Shapeshift = 0x00000002, -}; + enum RoleEffectAnimation_EffectType__Enum { + RoleEffectAnimation_EffectType__Enum_Default = 0x00000000, + RoleEffectAnimation_EffectType__Enum_ProtectLoop = 0x00000001, + RoleEffectAnimation_EffectType__Enum_Shapeshift = 0x00000002, + }; #endif #pragma endregion #pragma region RoleEffectAnimation -struct RoleEffectAnimation__Fields { - struct MonoBehaviour__Fields _; + struct RoleEffectAnimation__Fields { + struct MonoBehaviour__Fields _; #if defined(_CPLUSPLUS_) - RoleEffectAnimation_EffectType__Enum effectType; + RoleEffectAnimation_EffectType__Enum effectType; #else - int32_t effectType; + int32_t effectType; #endif - struct AnimationClip* Clip; - struct SpriteAnim* Animator; - struct Action* MidAnimCB; - struct SpriteRenderer* Renderer; - struct AudioClip* UseSound; - struct AudioSource* AudioSource; - struct PlayerControl* parent; -}; - -struct RoleEffectAnimation { - void* klass; - MonitorData* monitor; - struct RoleEffectAnimation__Fields fields; -}; - -struct RoleEffectAnimation__Array { - void* klass; - MonitorData* monitor; - Il2CppArrayBounds* bounds; - il2cpp_array_size_t max_length; - struct RoleEffectAnimation* vector[32]; -}; + struct AnimationClip* Clip; + struct SpriteAnim* Animator; + struct Action* MidAnimCB; + struct SpriteRenderer* Renderer; + struct AudioClip* UseSound; + struct AudioSource* AudioSource; + struct PlayerControl* parent; + }; + + struct RoleEffectAnimation { + void* klass; + MonitorData* monitor; + struct RoleEffectAnimation__Fields fields; + }; + + struct RoleEffectAnimation__Array { + void* klass; + MonitorData* monitor; + Il2CppArrayBounds* bounds; + il2cpp_array_size_t max_length; + struct RoleEffectAnimation* vector[32]; + }; #pragma endregion #pragma region List_1_PlayerTask_ @@ -8532,10 +8710,9 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region FollowerCamera - struct FollowerCamera__Fields - { + struct FollowerCamera__Fields { struct MonoBehaviour__Fields _; - void* Target; + struct MonoBehaviour* Target; struct Vector2 Offset; bool Locked; float shakeAmount; @@ -8633,8 +8810,7 @@ struct RoleEffectAnimation__Array { int32_t PoolIndex; }; - struct ChatBubble__Fields - { + struct ChatBubble__Fields { struct PoolableBehavior__Fields _; void* Player; // struct PoolablePlayer struct SpriteRenderer* Xmark; @@ -8644,6 +8820,7 @@ struct RoleEffectAnimation__Array { struct SpriteRenderer* Background; struct SpriteRenderer* MaskArea; void* PlatformIcon; + struct TextMeshPro* ColorBlindName; struct GameData_PlayerInfo* playerInfo; int32_t maskLayer; }; @@ -8749,6 +8926,38 @@ struct RoleEffectAnimation__Array { }; #pragma endregion +#pragma region PlayerMaterial +#if defined(_CPLUSPLUS_) + enum class PlayerMaterial_MaskType__Enum : int32_t { + None = 0x00000000, + SimpleUI = 0x00000001, + ComplexUI = 0x00000002, + Exile = 0x00000003, + ScrollingUI = 0x00000004, + }; + +#else + enum PlayerMaterial_MaskType__Enum { + PlayerMaterial_MaskType__Enum_None = 0x00000000, + PlayerMaterial_MaskType__Enum_SimpleUI = 0x00000001, + PlayerMaterial_MaskType__Enum_ComplexUI = 0x00000002, + PlayerMaterial_MaskType__Enum_Exile = 0x00000003, + PlayerMaterial_MaskType__Enum_ScrollingUI = 0x00000004, + }; + +#endif + + struct PlayerMaterial_Properties { +#if defined(_CPLUSPLUS_) + PlayerMaterial_MaskType__Enum MaskType; +#else + int32_t MaskType; +#endif + int32_t MaskLayer; + int32_t ColorId; + }; +#pragma endregion + #pragma region SkinLayer struct SkinLayer__Fields { @@ -8756,6 +8965,7 @@ struct RoleEffectAnimation__Array { struct SpriteRenderer* layer; void* animator; void* skin; + struct PlayerMaterial_Properties matProperties; }; struct SkinLayer { @@ -8786,19 +8996,41 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region PlayerPhysics + +#if defined(_CPLUSPLUS_) + enum class PlayerBodyTypes__Enum : int32_t { + Normal = 0x00000000, + Horse = 0x00000001, + Seeker = 0x00000002, + }; + +#else + enum PlayerBodyTypes__Enum { + PlayerBodyTypes__Enum_Normal = 0x00000000, + PlayerBodyTypes__Enum_Horse = 0x00000001, + PlayerBodyTypes__Enum_Seeker = 0x00000002, + }; + +#endif + struct PlayerPhysics__Fields { struct InnerNetObject__Fields _; uint8_t lastClimbLadderSid; - void* AnimationGroups; - void* CurrentAnimationGroup; + void* ImpostorDiscoveredSound; + void* Animations; + void* inputHandler; float Speed; float GhostSpeed; + void* logger; void* body; struct PlayerControl* myPlayer; - void* logger; - void* GlowAnimator; - void* ImpostorDiscoveredSound; - void* inputHandler; +#if defined(_CPLUSPLUS_) + PlayerBodyTypes__Enum bodyType; +#else + int32_t bodyType; +#endif + void* petCoroutine; + bool _DoingCustomAnimation_k__BackingField; }; struct PlayerPhysics { @@ -8837,57 +9069,33 @@ struct RoleEffectAnimation__Array { }; #pragma endregion -#pragma region PlayerMaterial -#if defined(_CPLUSPLUS_) - enum class PlayerMaterial_MaskType__Enum : int32_t { - None = 0x00000000, - SimpleUI = 0x00000001, - ComplexUI = 0x00000002, - Exile = 0x00000003, - ScrollingUI = 0x00000004, - }; - -#else - enum PlayerMaterial_MaskType__Enum { - PlayerMaterial_MaskType__Enum_None = 0x00000000, - PlayerMaterial_MaskType__Enum_SimpleUI = 0x00000001, - PlayerMaterial_MaskType__Enum_ComplexUI = 0x00000002, - PlayerMaterial_MaskType__Enum_Exile = 0x00000003, - PlayerMaterial_MaskType__Enum_ScrollingUI = 0x00000004, - }; - -#endif - - struct PlayerMaterial_Properties { -#if defined(_CPLUSPLUS_) - PlayerMaterial_MaskType__Enum MaskType; -#else - int32_t MaskType; -#endif - int32_t MaskLayer; - int32_t ColorId; - }; -#pragma endregion - #pragma region CosmeticsLayer struct CosmeticsLayer__Fields { struct MonoBehaviour__Fields _; bool alwaysDrawNormalPlayer; + bool uiPet; + float zIndexSpacing; + bool showColorBlindText; void* bodySprites; struct TextMeshPro* colorBlindText; void* hat; struct TextMeshPro* nameText; + struct GameObject* nameTextContainer; struct Transform* petParent; - bool showColorBlindText; struct SkinLayer* skin; - bool uiPet; void* visor; - float zIndexSpacing; +#if defined(_CPLUSPLUS_) + PlayerBodyTypes__Enum bodyType; +#else + int32_t bodyType; +#endif struct PlayerMaterial_Properties bodyMatProperties; void* currentBodySprite; struct PetBehaviour* currentPet; - bool initialized; void* normalBodySprite; + bool initialized; + bool visible; + bool isNameVisible; bool lockVisible; }; @@ -8935,7 +9143,10 @@ struct RoleEffectAnimation__Array { int32_t _CurrentOutfitType_k__BackingField; #endif bool inVent; + bool walkingToVent; + bool petting; bool inMovingPlat; + bool onLadder; bool protectedByGuardianThisRound; bool shapeshifting; struct GameData_PlayerInfo* _cachedData; @@ -8947,23 +9158,21 @@ struct RoleEffectAnimation__Array { float killTimer; int32_t RemainingEmergencies; void* LightPrefab; - void* myLight; + void* lightSource; struct Collider2D* Collider; struct PlayerPhysics* MyPhysics; struct CustomNetworkTransform* NetTransform; - void* myAnim; - void* horseAnim; + struct Collider2D* clickKillCollider; struct List_1_PlayerTask_* myTasks; struct Vector3 defaultPlayerScale; - void* ScannerAnims; - struct SpriteRenderer__Array* ScannersImages; struct List_1_RoleEffectAnimation_* currentRoleAnimations; + struct GameObject* TargetFlashlight; bool isDummy; bool notRealPlayer; + void* logger; void* hitBuffer; void* closest; bool isNew; - void* logger; void* cache; void* itemsInRange; void* newItemsInRange; @@ -8992,10 +9201,8 @@ struct RoleEffectAnimation__Array { VirtualInvokeData Deserialize; }; - struct PlayerControl__StaticFields - { + struct PlayerControl__StaticFields { struct PlayerControl* LocalPlayer; - struct GameOptionsData* GameOptions; struct List_1_PlayerControl_* AllPlayerControls; }; @@ -9128,23 +9335,29 @@ struct RoleEffectAnimation__Array { void* SabotageButton; void* ImpostorVentButton; void* UseButton; + void* PetButton; void* AbilityButton; void* ReportButton; struct TextMeshPro* GameSettings; struct GameObject* TaskStuff; + struct TaskPanelBehaviour* TaskPanel; + struct CrewmatesKilledTracker* CrewmatesKilled; struct ChatController* Chat; void* Dialogue; - struct TextMeshPro* TaskText; struct Transform* TaskCompleteOverlay; float taskDirtyTimer; void* ShadowQuad; struct SpriteRenderer* FullScreen; void* _ReactorFlash_k__BackingField; void* _OxyFlash_k__BackingField; - struct SpriteRenderer* MapButton; + void* MapButton; void* KillOverlay; void* joystick; + void* joystickR; void* Joysticks; + struct MonoBehaviour* RightVJoystick; + struct Collider2D* LeftStickDeadZone; + struct Collider2D* RightStickDeadZone; void* discussEmblem; void* shhhEmblem; void* IntroPrefab; @@ -9159,6 +9372,9 @@ struct RoleEffectAnimation__Array { struct GameObject* GameLoadAnimation; float consoleUIHorizontalShift; struct GameObject* playerListPrompt; + void* AlertFlash; + void* DangerMeter; + struct GameObject* SettingsButton; void* tasksString; void* lightFlashHandle; bool _IsIntroDisplayed_k__BackingField; @@ -9282,13 +9498,13 @@ struct RoleEffectAnimation__Array { struct KeyboardJoystick__Fields fields; }; - struct KeyboardJoystick__VTable - { + struct KeyboardJoystick__VTable { VirtualInvokeData Equals; VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; VirtualInvokeData ToString; - VirtualInvokeData get_Delta; + VirtualInvokeData get_DeltaL; + VirtualInvokeData get_DeltaR; VirtualInvokeData ToggleVisuals; }; @@ -9325,13 +9541,13 @@ struct RoleEffectAnimation__Array { struct ScreenJoystick__Fields fields; }; - struct ScreenJoystick__VTable - { + struct ScreenJoystick__VTable { VirtualInvokeData Equals; VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; VirtualInvokeData ToString; - VirtualInvokeData get_Delta; + VirtualInvokeData get_DeltaL; + VirtualInvokeData get_DeltaR; VirtualInvokeData ToggleVisuals; }; @@ -9400,6 +9616,9 @@ struct RoleEffectAnimation__Array { VirtualInvokeData ToString; }; + struct VoteSpreader__StaticFields { + }; + struct VoteSpreader__Class { Il2CppClass_0 _0; Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; @@ -9518,14 +9737,12 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region CustomNetworkTransform - struct CustomNetworkTransform__Fields - { + struct CustomNetworkTransform__Fields { struct InnerNetObject__Fields _; - void* XRange; - void* YRange; float sendInterval; float snapThreshold; float interpolateMovement; + struct PlayerControl* myPlayer; void* body; struct Vector2 targetSyncPosition; struct Vector2 targetSyncVelocity; @@ -9733,19 +9950,33 @@ struct RoleEffectAnimation__Array { #endif #if defined(_CPLUSPLUS_) - enum class GameModes__Enum : int32_t - { + enum class GameModes__Enum : uint8_t { + None = 0x00, + Normal = 0x01, + HideNSeek = 0x02, + }; + +#else + enum GameModes__Enum { + GameModes__Enum_None = 0x00, + GameModes__Enum_Normal = 0x01, + GameModes__Enum_HideNSeek = 0x02, + }; + +#endif + +#if defined(_CPLUSPLUS_) + enum class NetworkModes__Enum : int32_t { LocalGame = 0x00000000, OnlineGame = 0x00000001, FreePlay = 0x00000002, }; #else - enum GameModes__Enum - { - GameModes__Enum_LocalGame = 0x00000000, - GameModes__Enum_OnlineGame = 0x00000001, - GameModes__Enum_FreePlay = 0x00000002, + enum NetworkModes__Enum { + NetworkModes__Enum_LocalGame = 0x00000000, + NetworkModes__Enum_OnlineGame = 0x00000001, + NetworkModes__Enum_FreePlay = 0x00000002, }; #endif @@ -9770,8 +10001,7 @@ struct RoleEffectAnimation__Array { #endif - struct InnerNetClient__Fields - { + struct InnerNetClient__Fields { struct MonoBehaviour__Fields _; float MinSendInterval; uint32_t NetIdCnt; @@ -9784,6 +10014,7 @@ struct RoleEffectAnimation__Array { void* allObjectsFast; void* Streams; int32_t msgNum; + void* serverLogger; struct String* networkAddress; int32_t networkPort; bool useDtls; @@ -9794,9 +10025,9 @@ struct RoleEffectAnimation__Array { int32_t mode; #endif #if defined(_CPLUSPLUS_) - GameModes__Enum GameMode; + NetworkModes__Enum NetworkMode; #else - int32_t GameMode; + int32_t NetworkMode; #endif int32_t GameId; int32_t HostId; @@ -9813,6 +10044,7 @@ struct RoleEffectAnimation__Array { void* LastMatchmakerError; void* PreSpawnDispatcher; void* Dispatcher; + void* gameOptionsFactory; bool _IsGamePublic_k__BackingField; #if defined(_CPLUSPLUS_) InnerNetClient_GameStates__Enum GameState; @@ -10400,14 +10632,13 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region DeadBody - struct DeadBody__Fields - { + struct DeadBody__Fields { struct MonoBehaviour__Fields _; bool Reported; uint8_t ParentId; - void* myCollider; - void* bloodSplatter; - void* bodyRenderer; + struct Collider2D* myCollider; + struct SpriteRenderer* bloodSplatter; + struct SpriteRenderer* bodyRenderer; }; struct DeadBody @@ -10577,8 +10808,7 @@ struct RoleEffectAnimation__Array { MonitorData* monitor; struct CosmeticData__Fields fields; }; - struct CosmeticData__VTable - { + struct CosmeticData__VTable { VirtualInvokeData Equals; VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; @@ -10591,6 +10821,7 @@ struct RoleEffectAnimation__Array { VirtualInvokeData PreviewOnPlayer; VirtualInvokeData GetItemCategory; VirtualInvokeData SetProdId; + VirtualInvokeData CoLoadIcon; }; struct CosmeticData__StaticFields @@ -10660,11 +10891,11 @@ struct RoleEffectAnimation__Array { #pragma region HatData__Array struct HatData__Array { - struct HatData__Array__Class* klass; - MonitorData* monitor; - Il2CppArrayBounds* bounds; - il2cpp_array_size_t max_length; - struct HatData* vector[32]; + struct HatData__Array__Class* klass; + MonitorData* monitor; + Il2CppArrayBounds* bounds; + il2cpp_array_size_t max_length; + struct HatData* vector[32]; }; struct HatData__Array__VTable { @@ -10694,9 +10925,9 @@ struct RoleEffectAnimation__Array { }; struct List_1_HatData_ { - struct List_1_HatData___Class* klass; - MonitorData* monitor; - struct List_1_HatData___Fields fields; + struct List_1_HatData___Class* klass; + MonitorData* monitor; + struct List_1_HatData___Fields fields; }; struct List_1_HatData___VTable { @@ -10851,10 +11082,13 @@ struct RoleEffectAnimation__Array { void* shadowRend; void* body; struct Collider2D* Collider; + struct Transform* PettingHandPosition; void* idleClip; void* sadClip; void* scaredClip; void* walkClip; + void* petClip; + bool beingPet; }; struct PetBehaviour { @@ -11047,98 +11281,91 @@ struct RoleEffectAnimation__Array { }; #pragma endregion -#pragma region GameOptionsDataParent - struct __declspec(align(4)) GameOptionsDataParent__Fields { - float playerSpeedMod; - int32_t killDistance; - float killCooldown; - int32_t numCommonTasks; - int32_t numLongTasks; - int32_t numShortTasks; - int32_t numImpostors; - bool isDefaults; - }; - - struct GameOptionsDataParent { - struct GameOptionsDataParent__Class* klass; +#pragma region IRoleOptionsCollection + struct IRoleOptionsCollection { + struct IRoleOptionsCollection__Class* klass; MonitorData* monitor; - struct GameOptionsDataParent__Fields fields; }; - struct GameOptionsDataParent__VTable { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; + struct IRoleOptionsCollection__VTable { + VirtualInvokeData GetNumPerGame; + VirtualInvokeData GetChancePerGame; + VirtualInvokeData SetRoleRate; + VirtualInvokeData SetRoleRecommended; }; - struct GameOptionsDataParent__StaticFields { + struct IRoleOptionsCollection__StaticFields { }; - struct GameOptionsDataParent__Class { + struct IRoleOptionsCollection__Class { Il2CppClass_0 _0; Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct GameOptionsDataParent__StaticFields* static_fields; + struct IRoleOptionsCollection__StaticFields* static_fields; const Il2CppRGCTXData* rgctx_data; Il2CppClass_1 _1; - struct GameOptionsDataParent__VTable vtable; + struct IRoleOptionsCollection__VTable vtable; }; - #pragma endregion -#pragma region GameOptionsData - -#if defined(_CPLUSPLUS_) - enum class GameKeywords__Enum : uint32_t - { - All = 0x00000000, - English = 0x00000100, - SpanishLA = 0x00000002, - Brazilian = 0x00000800, - Portuguese = 0x00000010, - Korean = 0x00000004, - Russian = 0x00000008, - Dutch = 0x00001000, - Filipino = 0x00000040, - French = 0x00002000, - German = 0x00004000, - Italian = 0x00008000, - Japanese = 0x00000200, - SpanishEU = 0x00000400, - Arabic = 0x00000020, - Polish = 0x00000080, - SChinese = 0x00010000, - TChinese = 0x00020000, - Irish = 0x00040000, - Other = 0x00000001, +#pragma region LogicOptions + struct LogicOptions { + struct LogicOptions__Class* klass; + MonitorData* monitor; + //struct LogicOptions__Fields fields; }; -#else - enum GameKeywords__Enum - { - GameKeywords__Enum_All = 0x00000000, - GameKeywords__Enum_English = 0x00000100, - GameKeywords__Enum_SpanishLA = 0x00000002, - GameKeywords__Enum_Brazilian = 0x00000800, - GameKeywords__Enum_Portuguese = 0x00000010, - GameKeywords__Enum_Korean = 0x00000004, - GameKeywords__Enum_Russian = 0x00000008, - GameKeywords__Enum_Dutch = 0x00001000, - GameKeywords__Enum_Filipino = 0x00000040, - GameKeywords__Enum_French = 0x00002000, - GameKeywords__Enum_German = 0x00004000, - GameKeywords__Enum_Italian = 0x00008000, - GameKeywords__Enum_Japanese = 0x00000200, - GameKeywords__Enum_SpanishEU = 0x00000400, - GameKeywords__Enum_Arabic = 0x00000020, - GameKeywords__Enum_Polish = 0x00000080, - GameKeywords__Enum_SChinese = 0x00010000, - GameKeywords__Enum_TChinese = 0x00020000, - GameKeywords__Enum_Irish = 0x00040000, - GameKeywords__Enum_Other = 0x00000001, + struct LogicOptions__VTable { + VirtualInvokeData Equals; + VirtualInvokeData Finalize; + VirtualInvokeData GetHashCode; + VirtualInvokeData ToString; + VirtualInvokeData __unknown; + VirtualInvokeData __unknown_1; + VirtualInvokeData __unknown_2; + VirtualInvokeData __unknown_3; + VirtualInvokeData OnPlayerDisconnect; + VirtualInvokeData HandleRPC; + VirtualInvokeData Serialize; + VirtualInvokeData Deserialize; + VirtualInvokeData __unknown_4; + VirtualInvokeData GetAdjustedNumImpostors; + VirtualInvokeData SetRecommendations; + VirtualInvokeData __unknown_5; + VirtualInvokeData GetGhostsDoTasks; + VirtualInvokeData GetEngineerCooldown; + VirtualInvokeData GetEngineerInVentTime; + VirtualInvokeData GetGuardianAngelCooldown; + VirtualInvokeData GetShapeshifterDuration; + VirtualInvokeData GetShapeshifterCooldown; + VirtualInvokeData GetShapeshifterLeaveSkin; + VirtualInvokeData GetScientistCooldown; + VirtualInvokeData GetScientistBatteryCharge; + VirtualInvokeData GetKillCooldown; + VirtualInvokeData GetKillDistance; + VirtualInvokeData GetPlayerSpeedMod; + VirtualInvokeData GetConfirmImpostor; + VirtualInvokeData GetEmergencyCooldown; + VirtualInvokeData GetNumEmergencyMeetings; + VirtualInvokeData GetVisualTasks; + VirtualInvokeData GetAnonymousVotes; + VirtualInvokeData GetTaskBarMode; + VirtualInvokeData GetShowCrewmateNames; + }; + + struct LogicOptions__StaticFields { + }; + + struct LogicOptions__Class { + Il2CppClass_0 _0; + Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; + struct LogicOptions__StaticFields* static_fields; + const Il2CppRGCTXData* rgctx_data; + Il2CppClass_1 _1; + struct LogicOptions__VTable vtable; }; +#pragma endregion -#endif +#pragma region IGameOptions #if defined(_CPLUSPLUS_) enum class TaskBarMode__Enum : int32_t @@ -11159,87 +11386,244 @@ struct RoleEffectAnimation__Array { #endif #if defined(_CPLUSPLUS_) - enum class GameType__Enum : int32_t { - Normal = 0x00000000, + enum class ByteOptionNames__Enum : int32_t { + Invalid = 0x00000000, + MapId = 0x00000001, }; #else - enum GameType__Enum { - GameType__Enum_Normal = 0x00000000, + enum ByteOptionNames__Enum { + ByteOptionNames__Enum_Invalid = 0x00000000, + ByteOptionNames__Enum_MapId = 0x00000001, + }; + +#endif + +#if defined(_CPLUSPLUS_) + enum class FloatOptionNames__Enum : int32_t { + Invalid = 0x00000000, + KillCooldown = 0x00000001, + PlayerSpeedMod = 0x00000002, + ImpostorLightMod = 0x00000003, + CrewLightMod = 0x00000004, + CrewmateTimeInVent = 0x00000064, + FinalEscapeTime = 0x00000065, + EscapeTime = 0x00000066, + SeekerFinalSpeed = 0x00000067, + MaxPingTime = 0x00000068, + CrewmateFlashlightSize = 0x00000069, + ImpostorFlashlightSize = 0x0000006a, + ShapeshifterCooldown = 0x000003e8, + ShapeshifterDuration = 0x000003e9, + ProtectionDurationSeconds = 0x0000044c, + GuardianAngelCooldown = 0x0000044d, + ScientistCooldown = 0x000004b0, + ScientistBatteryCharge = 0x000004b1, + EngineerCooldown = 0x00000514, + EngineerInVentMaxTime = 0x00000515, + }; + +#else + enum FloatOptionNames__Enum { + FloatOptionNames__Enum_Invalid = 0x00000000, + FloatOptionNames__Enum_KillCooldown = 0x00000001, + FloatOptionNames__Enum_PlayerSpeedMod = 0x00000002, + FloatOptionNames__Enum_ImpostorLightMod = 0x00000003, + FloatOptionNames__Enum_CrewLightMod = 0x00000004, + FloatOptionNames__Enum_CrewmateTimeInVent = 0x00000064, + FloatOptionNames__Enum_FinalEscapeTime = 0x00000065, + FloatOptionNames__Enum_EscapeTime = 0x00000066, + FloatOptionNames__Enum_SeekerFinalSpeed = 0x00000067, + FloatOptionNames__Enum_MaxPingTime = 0x00000068, + FloatOptionNames__Enum_CrewmateFlashlightSize = 0x00000069, + FloatOptionNames__Enum_ImpostorFlashlightSize = 0x0000006a, + FloatOptionNames__Enum_ShapeshifterCooldown = 0x000003e8, + FloatOptionNames__Enum_ShapeshifterDuration = 0x000003e9, + FloatOptionNames__Enum_ProtectionDurationSeconds = 0x0000044c, + FloatOptionNames__Enum_GuardianAngelCooldown = 0x0000044d, + FloatOptionNames__Enum_ScientistCooldown = 0x000004b0, + FloatOptionNames__Enum_ScientistBatteryCharge = 0x000004b1, + FloatOptionNames__Enum_EngineerCooldown = 0x00000514, + FloatOptionNames__Enum_EngineerInVentMaxTime = 0x00000515, }; #endif - struct GameOptionsData__Fields - { - struct GameOptionsDataParent__Fields _; - int32_t MaxPlayers; #if defined(_CPLUSPLUS_) - GameKeywords__Enum Keywords; + enum class BoolOptionNames__Enum : int32_t { + Invalid = 0x00000000, + VisualTasks = 0x00000001, + GhostsDoTasks = 0x00000002, + ConfirmImpostor = 0x00000003, + AnonymousVotes = 0x00000004, + IsDefaults = 0x00000005, + UseFlashlight = 0x00000006, + SeekerFinalVents = 0x00000007, + SeekerFinalMap = 0x00000008, + SeekerPings = 0x00000009, + ShowCrewmateNames = 0x0000000a, + ShapeshifterLeaveSkin = 0x000003e8, + ImpostorsCanSeeProtect = 0x0000044c, + }; + #else - uint32_t Keywords; + enum BoolOptionNames__Enum { + BoolOptionNames__Enum_Invalid = 0x00000000, + BoolOptionNames__Enum_VisualTasks = 0x00000001, + BoolOptionNames__Enum_GhostsDoTasks = 0x00000002, + BoolOptionNames__Enum_ConfirmImpostor = 0x00000003, + BoolOptionNames__Enum_AnonymousVotes = 0x00000004, + BoolOptionNames__Enum_IsDefaults = 0x00000005, + BoolOptionNames__Enum_UseFlashlight = 0x00000006, + BoolOptionNames__Enum_SeekerFinalVents = 0x00000007, + BoolOptionNames__Enum_SeekerFinalMap = 0x00000008, + BoolOptionNames__Enum_SeekerPings = 0x00000009, + BoolOptionNames__Enum_ShowCrewmateNames = 0x0000000a, + BoolOptionNames__Enum_ShapeshifterLeaveSkin = 0x000003e8, + BoolOptionNames__Enum_ImpostorsCanSeeProtect = 0x0000044c, + }; + #endif - uint8_t MapId; - int32_t NumEmergencyMeetings; - int32_t EmergencyCooldown; - bool ghostsDoTasks; - int32_t DiscussionTime; - int32_t VotingTime; - float CrewLightMod; - float ImpostorLightMod; - bool ConfirmImpostor; - bool VisualTasks; - bool AnonymousVotes; + #if defined(_CPLUSPLUS_) - TaskBarMode__Enum TaskBarMode; + enum class Int32OptionNames__Enum : int32_t { + Invalid = 0x00000000, + NumImpostors = 0x00000001, + KillDistance = 0x00000002, + NumEmergencyMeetings = 0x00000003, + EmergencyCooldown = 0x00000004, + DiscussionTime = 0x00000005, + VotingTime = 0x00000006, + MaxImpostors = 0x00000007, + MinPlayers = 0x00000008, + MaxPlayers = 0x00000009, + NumCommonTasks = 0x0000000a, + NumShortTasks = 0x0000000b, + NumLongTasks = 0x0000000c, + TaskBarMode = 0x0000000d, + CrewmatesRemainingForVitals = 0x00000064, + CrewmateVentUses = 0x00000065, + ImpostorPlayerID = 0x00000066, + }; + #else - int32_t TaskBarMode; + enum Int32OptionNames__Enum { + Int32OptionNames__Enum_Invalid = 0x00000000, + Int32OptionNames__Enum_NumImpostors = 0x00000001, + Int32OptionNames__Enum_KillDistance = 0x00000002, + Int32OptionNames__Enum_NumEmergencyMeetings = 0x00000003, + Int32OptionNames__Enum_EmergencyCooldown = 0x00000004, + Int32OptionNames__Enum_DiscussionTime = 0x00000005, + Int32OptionNames__Enum_VotingTime = 0x00000006, + Int32OptionNames__Enum_MaxImpostors = 0x00000007, + Int32OptionNames__Enum_MinPlayers = 0x00000008, + Int32OptionNames__Enum_MaxPlayers = 0x00000009, + Int32OptionNames__Enum_NumCommonTasks = 0x0000000a, + Int32OptionNames__Enum_NumShortTasks = 0x0000000b, + Int32OptionNames__Enum_NumLongTasks = 0x0000000c, + Int32OptionNames__Enum_TaskBarMode = 0x0000000d, + Int32OptionNames__Enum_CrewmatesRemainingForVitals = 0x00000064, + Int32OptionNames__Enum_CrewmateVentUses = 0x00000065, + Int32OptionNames__Enum_ImpostorPlayerID = 0x00000066, + }; + #endif - struct RoleOptionsData* RoleOptions; + #if defined(_CPLUSPLUS_) - GameType__Enum gameType; + enum class UInt32OptionNames__Enum : int32_t { + Invalid = 0x00000000, + Keywords = 0x00000001, + }; + #else - int32_t gameType; + enum UInt32OptionNames__Enum { + UInt32OptionNames__Enum_Invalid = 0x00000000, + UInt32OptionNames__Enum_Keywords = 0x00000001, + }; + #endif - void* settings; + +#if defined(_CPLUSPLUS_) + enum class Int32ArrayOptionNames__Enum : int32_t { + Invalid = 0x00000000, + MaxImpostors = 0x00000001, + MinPlayers = 0x00000002, }; - struct GameOptionsData - { - struct GameOptionsData__Class* klass; - void* monitor; - struct GameOptionsData__Fields fields; +#else + enum Int32ArrayOptionNames__Enum { + Int32ArrayOptionNames__Enum_Invalid = 0x00000000, + Int32ArrayOptionNames__Enum_MaxImpostors = 0x00000001, + Int32ArrayOptionNames__Enum_MinPlayers = 0x00000002, }; - struct GameOptionsData__VTable - { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; +#endif + +#if defined(_CPLUSPLUS_) + enum class FloatArrayOptionNames__Enum : int32_t { + Invalid = 0x00000000, + KillDistances = 0x00000001, }; - struct GameOptionsData__StaticFields - { - void* KillDistances; - void* KillDistanceStrings; - void* RecommendedKillCooldown; - void* RecommendedImpostors; - void* MaxImpostors; - void* MinPlayers; +#else + enum FloatArrayOptionNames__Enum { + FloatArrayOptionNames__Enum_Invalid = 0x00000000, + FloatArrayOptionNames__Enum_KillDistances = 0x00000001, }; - struct GameOptionsData__Class - { +#endif + + struct IGameOptions { + struct IGameOptions__Class* klass; + MonitorData* monitor; + }; + + struct IGameOptions__VTable { + VirtualInvokeData get_Version; + VirtualInvokeData get_GameMode; + VirtualInvokeData get_MaxPlayers; + VirtualInvokeData get_Keywords; + VirtualInvokeData get_MapId; + VirtualInvokeData get_NumImpostors; + VirtualInvokeData get_TotalTaskCount; + VirtualInvokeData get_IsDefaults; + VirtualInvokeData get_RoleOptions; + VirtualInvokeData AreInvalid; + VirtualInvokeData SetRecommendations; + VirtualInvokeData SetByte; + VirtualInvokeData SetFloat; + VirtualInvokeData SetBool; + VirtualInvokeData SetInt; + VirtualInvokeData SetUInt; + VirtualInvokeData GetByte; + VirtualInvokeData GetFloat; + VirtualInvokeData GetBool; + VirtualInvokeData GetInt; + VirtualInvokeData GetIntArray; + VirtualInvokeData GetFloatArray; + VirtualInvokeData TryGetByte; + VirtualInvokeData TryGetFloat; + VirtualInvokeData TryGetBool; + VirtualInvokeData TryGetInt; + VirtualInvokeData TryGetIntArray; + VirtualInvokeData TryGetFloatArray; + }; + + struct IGameOptions__StaticFields { + }; + + struct IGameOptions__Class { Il2CppClass_0 _0; Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct GameOptionsData__StaticFields* static_fields; + struct IGameOptions__StaticFields* static_fields; const Il2CppRGCTXData* rgctx_data; Il2CppClass_1 _1; - struct GameOptionsData__VTable vtable; + struct IGameOptions__VTable vtable; }; + #pragma endregion + #pragma region List_1_GameData_PlayerInfo_ struct __declspec(align(4)) List_1_GameData_PlayerInfo___Fields { @@ -11319,315 +11703,6 @@ struct RoleEffectAnimation__Array { }; #pragma endregion -#pragma region RoleOptionsData - struct __declspec(align(4)) RoleOptionsData__Fields - { - bool ShapeshifterLeaveSkin; - float ShapeshifterCooldown; - float ShapeshifterDuration; - float ScientistCooldown; - float ScientistBatteryCharge; - float GuardianAngelCooldown; - bool ImpostorsCanSeeProtect; - float ProtectionDurationSeconds; - float EngineerCooldown; - float EngineerInVentMaxTime; - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate_* roleRates; - }; - - struct RoleOptionsData - { - struct RoleOptionsData__Class* klass; - void* monitor; - struct RoleOptionsData__Fields fields; - }; - - struct RoleOptionsData__VTable - { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; - }; - - struct IEqualityComparer_1_RoleTypes_ - { - struct IEqualityComparer_1_RoleTypes___Class* klass; - MonitorData* monitor; - }; - - struct IEqualityComparer_1_RoleTypes___StaticFields - { - }; - - struct IEqualityComparer_1_RoleTypes___VTable - { - VirtualInvokeData Equals; - VirtualInvokeData GetHashCode; - }; - - struct IEqualityComparer_1_RoleTypes___Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct IEqualityComparer_1_RoleTypes___StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct IEqualityComparer_1_RoleTypes___VTable vtable; - }; - - struct __declspec(align(4)) Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___Fields - { - struct Int32__Array* buckets; - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array* entries; - int32_t count; - int32_t version; - int32_t freeList; - int32_t freeCount; - struct IEqualityComparer_1_RoleTypes_* comparer; - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate_* keys; - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate_* values; - struct Object* _syncRoot; - }; - - struct __declspec(align(4)) Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___Fields - { - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate_* dictionary; - }; - - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate_ - { - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___Class* klass; - MonitorData* monitor; - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___Fields fields; - }; - - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___VTable - { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; - VirtualInvokeData get_Count; - VirtualInvokeData System_Collections_Generic_ICollection_TValue__get_IsReadOnly; - VirtualInvokeData System_Collections_Generic_ICollection_TValue__Add; - VirtualInvokeData System_Collections_Generic_ICollection_TValue__Clear; - VirtualInvokeData System_Collections_Generic_ICollection_TValue__Contains; - VirtualInvokeData CopyTo; - VirtualInvokeData System_Collections_Generic_ICollection_TValue__Remove; - VirtualInvokeData System_Collections_Generic_IEnumerable_TValue__GetEnumerator; - VirtualInvokeData System_Collections_IEnumerable_GetEnumerator; - VirtualInvokeData System_Collections_ICollection_CopyTo; - VirtualInvokeData get_Count_1; - VirtualInvokeData System_Collections_ICollection_get_SyncRoot; - VirtualInvokeData System_Collections_ICollection_get_IsSynchronized; - VirtualInvokeData get_Count_2; - }; - - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___StaticFields - { - }; - - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct Dictionary_2_TKey_TValue_ValueCollection_RoleTypes_RoleOptionsData_RoleRate___VTable vtable; - }; - - struct __declspec(align(4)) Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___Fields - { - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate_* dictionary; - }; - - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate_ - { - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___Class* klass; - MonitorData* monitor; - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___Fields fields; - }; - - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___VTable - { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; - VirtualInvokeData get_Count; - VirtualInvokeData System_Collections_Generic_ICollection_TKey__get_IsReadOnly; - VirtualInvokeData System_Collections_Generic_ICollection_TKey__Add; - VirtualInvokeData System_Collections_Generic_ICollection_TKey__Clear; - VirtualInvokeData System_Collections_Generic_ICollection_TKey__Contains; - VirtualInvokeData CopyTo; - VirtualInvokeData System_Collections_Generic_ICollection_TKey__Remove; - VirtualInvokeData System_Collections_Generic_IEnumerable_TKey__GetEnumerator; - VirtualInvokeData System_Collections_IEnumerable_GetEnumerator; - VirtualInvokeData System_Collections_ICollection_CopyTo; - VirtualInvokeData get_Count_1; - VirtualInvokeData System_Collections_ICollection_get_SyncRoot; - VirtualInvokeData System_Collections_ICollection_get_IsSynchronized; - VirtualInvokeData get_Count_2; - }; - - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___StaticFields - { - }; - - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct Dictionary_2_TKey_TValue_KeyCollection_RoleTypes_RoleOptionsData_RoleRate___VTable vtable; - }; - - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate_ - { - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___Class* klass; - MonitorData* monitor; - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___Fields fields; - }; - - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___VTable - { - VirtualInvokeData Equals; - VirtualInvokeData Finalize; - VirtualInvokeData GetHashCode; - VirtualInvokeData ToString; - VirtualInvokeData get_Item; - VirtualInvokeData set_Item; - VirtualInvokeData System_Collections_Generic_IDictionary_TKey_TValue__get_Keys; - VirtualInvokeData System_Collections_Generic_IDictionary_TKey_TValue__get_Values; - VirtualInvokeData ContainsKey; - VirtualInvokeData Add; - VirtualInvokeData Remove; - VirtualInvokeData TryGetValue; - VirtualInvokeData get_Count; - VirtualInvokeData System_Collections_Generic_ICollection_System_Collections_Generic_KeyValuePair_TKey_TValue___get_IsReadOnly; - VirtualInvokeData System_Collections_Generic_ICollection_System_Collections_Generic_KeyValuePair_TKey_TValue___Add; - VirtualInvokeData Clear; - VirtualInvokeData System_Collections_Generic_ICollection_System_Collections_Generic_KeyValuePair_TKey_TValue___Contains; - VirtualInvokeData System_Collections_Generic_ICollection_System_Collections_Generic_KeyValuePair_TKey_TValue___CopyTo; - VirtualInvokeData System_Collections_Generic_ICollection_System_Collections_Generic_KeyValuePair_TKey_TValue___Remove; - VirtualInvokeData System_Collections_Generic_IEnumerable_System_Collections_Generic_KeyValuePair_TKey_TValue___GetEnumerator; - VirtualInvokeData System_Collections_IEnumerable_GetEnumerator; - VirtualInvokeData System_Collections_IDictionary_get_Item; - VirtualInvokeData System_Collections_IDictionary_set_Item; - VirtualInvokeData System_Collections_IDictionary_get_Keys; - VirtualInvokeData System_Collections_IDictionary_get_Values; - VirtualInvokeData System_Collections_IDictionary_Contains; - VirtualInvokeData System_Collections_IDictionary_Add; - VirtualInvokeData Clear_1; - VirtualInvokeData System_Collections_IDictionary_get_IsReadOnly; - VirtualInvokeData System_Collections_IDictionary_get_IsFixedSize; - VirtualInvokeData System_Collections_IDictionary_GetEnumerator; - VirtualInvokeData System_Collections_IDictionary_Remove; - VirtualInvokeData System_Collections_ICollection_CopyTo; - VirtualInvokeData get_Count_1; - VirtualInvokeData System_Collections_ICollection_get_SyncRoot; - VirtualInvokeData System_Collections_ICollection_get_IsSynchronized; - VirtualInvokeData ContainsKey_1; - VirtualInvokeData TryGetValue_1; - VirtualInvokeData System_Collections_Generic_IReadOnlyDictionary_TKey_TValue__get_Keys; - VirtualInvokeData System_Collections_Generic_IReadOnlyDictionary_TKey_TValue__get_Values; - VirtualInvokeData get_Count_2; - VirtualInvokeData GetObjectData; - VirtualInvokeData OnDeserialization; - VirtualInvokeData GetObjectData_1; - VirtualInvokeData OnDeserialization_1; - }; - - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___VTable vtable; - }; - - struct Dictionary_2_RoleTypes_RoleOptionsData_RoleRate___StaticFields - { - }; - - struct RoleOptionsData_RoleRate - { - int32_t MaxCount; - int32_t Chance; - }; - - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate_ - { - int32_t hashCode; - int32_t next; -#if defined(_CPLUSPLUS_) - RoleTypes__Enum key; -#else - uint16_t key; -#endif - struct RoleOptionsData_RoleRate value; - }; - - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array - { - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__Class* klass; - MonitorData* monitor; - Il2CppArrayBounds* bounds; - il2cpp_array_size_t max_length; - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate_ vector[32]; - }; - - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__VTable - { - }; - - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__VTable vtable; - }; - - struct RoleOptionsData__StaticFields - { - }; - - struct Dictionary_2_TKey_TValue_Entry_RoleTypes_RoleOptionsData_RoleRate___Array__StaticFields - { - }; - - struct RoleOptionsData__Class - { - Il2CppClass_0 _0; - Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct RoleOptionsData__StaticFields* static_fields; - const Il2CppRGCTXData* rgctx_data; - Il2CppClass_1 _1; - struct RoleOptionsData__VTable vtable; - }; -#pragma endregion - -#pragma region Nullable_1_RoleTypes_ - struct Nullable_1_RoleTypes_ - { -#if defined(_CPLUSPLUS_) - RoleTypes__Enum value; -#else - uint16_t value; -#endif - bool has_value; - }; -#pragma endregion - #pragma region RoleTypes__Enum__Array struct RoleTypes__Enum__Array { @@ -11657,23 +11732,20 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region List_1_RoleTypes_ - struct __declspec(align(4)) List_1_RoleTypes___Fields - { + struct __declspec(align(4)) List_1_AmongUs_GameOptions_RoleTypes___Fields { struct RoleTypes__Enum__Array* _items; int32_t _size; int32_t _version; struct Object* _syncRoot; }; - struct List_1_RoleTypes_ - { - struct List_1_RoleTypes___Class* klass; - void* monitor; - struct List_1_RoleTypes___Fields fields; + struct List_1_AmongUs_GameOptions_RoleTypes_ { + struct List_1_AmongUs_GameOptions_RoleTypes___Class* klass; + MonitorData* monitor; + struct List_1_AmongUs_GameOptions_RoleTypes___Fields fields; }; - struct List_1_RoleTypes___VTable - { + struct List_1_AmongUs_GameOptions_RoleTypes___VTable { VirtualInvokeData Equals; VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; @@ -11711,19 +11783,17 @@ struct RoleEffectAnimation__Array { VirtualInvokeData get_Count_2; }; - struct List_1_RoleTypes___StaticFields - { + struct List_1_AmongUs_GameOptions_RoleTypes___StaticFields { struct RoleTypes__Enum__Array* _emptyArray; }; - struct List_1_RoleTypes___Class - { + struct List_1_AmongUs_GameOptions_RoleTypes___Class { Il2CppClass_0 _0; Il2CppRuntimeInterfaceOffsetPair* interfaceOffsets; - struct List_1_RoleTypes___StaticFields* static_fields; + struct List_1_AmongUs_GameOptions_RoleTypes___StaticFields* static_fields; const Il2CppRGCTXData* rgctx_data; Il2CppClass_1 _1; - struct List_1_RoleTypes___VTable vtable; + struct List_1_AmongUs_GameOptions_RoleTypes___VTable vtable; }; #pragma endregion @@ -11802,8 +11872,7 @@ struct RoleEffectAnimation__Array { struct MonoBehaviour__Fields _; }; - struct PlainDoor__Fields - { + struct PlainDoor__Fields { struct SomeKindaDoor__Fields _; #if defined(_CPLUSPLUS_) SystemTypes__Enum Room; @@ -11813,6 +11882,7 @@ struct RoleEffectAnimation__Array { int32_t Id; bool Open; void* myCollider; + struct Collider2D* shadowCollider; void* animator; void* OpenDoorAnim; void* CloseDoorAnim; @@ -11898,8 +11968,7 @@ struct RoleEffectAnimation__Array { #pragma endregion #pragma region Vent - struct Vent__Fields - { + struct Vent__Fields { struct MonoBehaviour__Fields _; int32_t Id; struct Vent* Left; @@ -11912,7 +11981,7 @@ struct RoleEffectAnimation__Array { struct Vector3 Offset; float spreadAmount; float spreadShift; - void* myRend; + struct SpriteRenderer* myRend; }; struct Vent @@ -11957,6 +12026,8 @@ struct RoleEffectAnimation__Array { struct __declspec(align(4)) StatsManager_Stats__Fields { float banPoints; int64_t lastGameStarted; + float FastestCrewmateWin_HideAndSeek; + float FastestImpostorWin_HideAndSeek; void* gameplayStats; void* winReasons; void* loseReasons; @@ -12288,6 +12359,8 @@ struct RoleEffectAnimation__Array { VirtualInvokeData Finalize; VirtualInvokeData GetHashCode; VirtualInvokeData ToString; + VirtualInvokeData get_IsDead; + VirtualInvokeData get_IsAffectedByComms; VirtualInvokeData CanUse; VirtualInvokeData DidWin; VirtualInvokeData Deinitialize; @@ -12302,6 +12375,8 @@ struct RoleEffectAnimation__Array { VirtualInvokeData IsValidTarget; VirtualInvokeData FindClosestTarget; VirtualInvokeData GetAbilityDistance; + VirtualInvokeData AdjustTasks; + VirtualInvokeData AppendTaskHint; }; struct EngineerRole__StaticFields @@ -12508,4 +12583,7 @@ struct RoleEffectAnimation__Array { typedef Il2CppObject PlayerCustomizationData; typedef Il2CppObject PlayerPurchasesData; + typedef Il2CppObject GameOptionsManager; + typedef Il2CppObject GameManager; + typedef Il2CppObject GameOptionsFactory; } \ No newline at end of file diff --git a/gui/tabs/game_tab.cpp b/gui/tabs/game_tab.cpp index 535ffe03..80f52648 100644 --- a/gui/tabs/game_tab.cpp +++ b/gui/tabs/game_tab.cpp @@ -13,21 +13,21 @@ namespace GameTab { if (SteppedSliderFloat("Player Speed", &State.PlayerSpeed, 0.5f, 3.f, 0.25f, "%.2fx", ImGuiSliderFlags_Logarithmic | ImGuiSliderFlags_NoInput)) { if (!IsInGame()) State.PlayerSpeed = State.PrevPlayerSpeed; else { - (*Game::pGameOptionsData)->fields._.playerSpeedMod = State.PlayerSpeed; + GameOptions().SetFloat(app::FloatOptionNames__Enum::PlayerSpeedMod, State.PlayerSpeed); State.PrevPlayerSpeed = State.PlayerSpeed; } } if (CustomListBoxInt("Kill Distance", &State.KillDistance, KILL_DISTANCE, 225 * State.dpiScale)) { if (!IsInGame()) State.KillDistance = State.PrevKillDistance; else { - (*Game::pGameOptionsData)->fields._.killDistance = State.KillDistance; + GameOptions().SetInt(app::Int32OptionNames__Enum::KillDistance, State.KillDistance); State.PrevKillDistance = State.KillDistance; } } if (CustomListBoxInt("Task Bar Updates", &State.TaskBarUpdates, TASKBARUPDATES, 225 * State.dpiScale)) { if (!IsInGame()) State.TaskBarUpdates = State.PrevTaskBarUpdates; else { - (*Game::pGameOptionsData)->fields.TaskBarMode = (TaskBarMode__Enum)State.TaskBarUpdates; + GameOptions().SetInt(app::Int32OptionNames__Enum::TaskBarMode, State.TaskBarUpdates); State.PrevTaskBarUpdates = State.TaskBarUpdates; } } @@ -94,51 +94,55 @@ namespace GameTab { State.rpcQueue.push(new RpcUsePlatform()); } #ifdef _DEBUG - if ((IsInGame() || IsInLobby()) && Game::pGameOptionsData != NULL) + if (IsInGame() || IsInLobby()) { ImGui::Dummy(ImVec2(7, 7) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(7, 7) * State.dpiScale); - app::GameOptionsData* options = *Game::pGameOptionsData; - if (options != NULL) + GameOptions options; + if (options.GetGameMode() == GameModes__Enum::Normal) { auto allPlayers = GetAllPlayerControl(); - RoleRates roleRates = RoleRates(options->fields, (int)allPlayers.size()); + RoleRates roleRates = RoleRates(options, (int)allPlayers.size()); // this should be all the major ones. if people want more they're simple enough to add. - ImGui::Text("Visual Tasks: %s", (options->fields.VisualTasks == true ? "on" : "off")); - ImGui::Text("Taskbar Update Mode: %s", (options->fields.TaskBarMode == app::TaskBarMode__Enum::Normal ? "Normal" : "MeetingOnly")); - ImGui::Text("Confirm Impostor: %s", (options->fields.ConfirmImpostor == true ? "on" : "off")); - ImGui::Text("Kill CD: %.2f", options->fields._.killCooldown); + ImGui::Text("Visual Tasks: %s", (options.GetBool(app::BoolOptionNames__Enum::VisualTasks) ? "on" : "off")); + ImGui::Text("Taskbar Update Mode: %s", (options.GetInt(app::Int32OptionNames__Enum::TaskBarMode) + == (int)app::TaskBarMode__Enum::Normal ? "Normal" : "MeetingOnly")); + ImGui::Text("Confirm Impostor: %s", (options.GetBool(app::BoolOptionNames__Enum::ConfirmImpostor) ? "on" : "off")); + ImGui::Text("Kill CD: %.2f", options.GetKillCooldown()); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Text("Max Engineers: %d", roleRates.GetRoleCount(app::RoleTypes__Enum::Engineer)); - ImGui::Text("Engineer CD: %.2f", options->fields.RoleOptions->fields.EngineerCooldown); - ImGui::Text("Engineer Duration: %.2f", options->fields.RoleOptions->fields.EngineerInVentMaxTime); + ImGui::Text("Engineer CD: %.2f", options.GetFloat(app::FloatOptionNames__Enum::EngineerCooldown, 1.0F)); + ImGui::Text("Engineer Duration: %.2f", options.GetFloat(app::FloatOptionNames__Enum::EngineerInVentMaxTime, 1.0F) ); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Text("Max Angels: %d", roleRates.GetRoleCount(app::RoleTypes__Enum::GuardianAngel)); - ImGui::Text("Angel CD: %.2f", options->fields.RoleOptions->fields.GuardianAngelCooldown); - ImGui::Text("Angel Duration: %.2f", options->fields.RoleOptions->fields.ProtectionDurationSeconds); + ImGui::Text("Angel CD: %.2f", options.GetFloat(app::FloatOptionNames__Enum::GuardianAngelCooldown, 1.0F)); + ImGui::Text("Angel Duration: %.2f", options.GetFloat(app::FloatOptionNames__Enum::ProtectionDurationSeconds, 1.0F)); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Text("Max Shapeshifters: %d", roleRates.GetRoleCount(app::RoleTypes__Enum::Shapeshifter)); - ImGui::Text("Shapeshifter CD: %.2f", options->fields.RoleOptions->fields.ShapeshifterCooldown); - ImGui::Text("Shapeshifter Duration: %.2f", options->fields.RoleOptions->fields.ShapeshifterDuration); + ImGui::Text("Shapeshifter CD: %.2f", options.GetFloat(app::FloatOptionNames__Enum::ShapeshifterCooldown, 1.0F)); + ImGui::Text("Shapeshifter Duration: %.2f", options.GetFloat(app::FloatOptionNames__Enum::ShapeshifterDuration, 1.0F)); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(3, 3) * State.dpiScale); } + else if (options.GetGameMode() == GameModes__Enum::HideNSeek) { + // TODO: HideNSeek + } } #endif ImGui::EndTabItem(); diff --git a/gui/tabs/host_tab.cpp b/gui/tabs/host_tab.cpp index 12dc0f63..4f67b99d 100644 --- a/gui/tabs/host_tab.cpp +++ b/gui/tabs/host_tab.cpp @@ -7,18 +7,18 @@ namespace HostTab { static void SetRoleAmount(RoleTypes__Enum type, int amount) { - il2cpp::Dictionary roleRates = (*Game::pGameOptionsData)->fields.RoleOptions->fields.roleRates; - if (auto value = roleRates[type]) { - if (amount > 0) - value->Chance = 100; - if (amount > value->MaxCount) - value->MaxCount = amount; - } + auto&& options = GameOptions().GetRoleOptions(); + auto maxCount = options.GetNumPerGame(type); + if (amount > maxCount) + options.SetRoleRate(type, amount, 100); + else if (amount > 0) + options.SetRoleRate(type, maxCount, 100); } void Render() { if (IsHost() && IsInLobby()) { if (ImGui::BeginTabItem("Host")) { + GameOptions options; ImGui::Text("Select Roles:"); ImGui::BeginChild("host#list", ImVec2(200, 0) * State.dpiScale, true); bool shouldEndListBox = ImGui::ListBoxHeader("Choose Roles", ImVec2(200, 150) * State.dpiScale); @@ -56,8 +56,8 @@ namespace HostTab { SetRoleAmount(RoleTypes__Enum::Engineer, State.engineers_amount); SetRoleAmount(RoleTypes__Enum::Scientist, State.scientists_amount); SetRoleAmount(RoleTypes__Enum::Shapeshifter, State.shapeshifters_amount); - if((*Game::pGameOptionsData)->fields._.numImpostors <= State.impostors_amount + State.shapeshifters_amount) - (*Game::pGameOptionsData)->fields._.numImpostors = State.impostors_amount + State.shapeshifters_amount; + if(options.GetNumImpostors() <= State.impostors_amount + State.shapeshifters_amount) + options.SetInt(app::Int32OptionNames__Enum::NumImpostors, State.impostors_amount + State.shapeshifters_amount); } } } @@ -68,16 +68,16 @@ namespace HostTab { ImGui::BeginChild("host#actions", ImVec2(200, 0) * State.dpiScale, true); // AU v2022.8.24 has been able to change maps in lobby. - State.mapHostChoice = (*Game::pGameOptionsData)->fields.MapId; + State.mapHostChoice = options.GetByte(app::ByteOptionNames__Enum::MapId); State.mapHostChoice = std::clamp(State.mapHostChoice, 0, 4); if (CustomListBoxInt("Map", &State.mapHostChoice, MAP_NAMES, 75 * State.dpiScale)) { if (!IsInGame()) { if (State.mapHostChoice == 3) { - (*Game::pGameOptionsData)->fields.MapId = 0; + options.SetByte(app::ByteOptionNames__Enum::MapId, 0); State.FlipSkeld = true; } else { - (*Game::pGameOptionsData)->fields.MapId = State.mapHostChoice; + options.SetByte(app::ByteOptionNames__Enum::MapId, State.mapHostChoice); State.FlipSkeld = false; } } diff --git a/gui/tabs/self_tab.cpp b/gui/tabs/self_tab.cpp index 8c9d483e..61c82a39 100644 --- a/gui/tabs/self_tab.cpp +++ b/gui/tabs/self_tab.cpp @@ -1,4 +1,4 @@ -#include "pch-il2cpp.h" +#include "pch-il2cpp.h" #include "self_tab.h" #include "game.h" #include "gui-helpers.hpp" @@ -71,7 +71,9 @@ namespace SelfTab { if (ImGui::Checkbox("Reveal Votes", &State.RevealVotes)) { State.Save(); } - if (!IsInGame() && !IsInLobby() || (*Game::pGameOptionsData)->fields.AnonymousVotes) { + if (!IsInGame() && !IsInLobby() + || GameOptions().GetGameMode() != GameModes__Enum::Normal + || GameOptions().GetBool(app::BoolOptionNames__Enum::AnonymousVotes)) { ImGui::SameLine(); if (ImGui::Checkbox("Reveal Anonymous Votes", &State.RevealAnonymousVotes)) { State.Save(); @@ -125,11 +127,11 @@ namespace SelfTab { auto self = GetPlayerData(*Game::pLocalPlayer); if (self->fields.IsDead) return; + GameOptions options; if (PlayerIsImpostor(self) - && (*Game::pGameOptionsData)->fields.RoleOptions->fields.ImpostorsCanSeeProtect) + && options.GetBool(app::BoolOptionNames__Enum::ImpostorsCanSeeProtect)) return; - float& _Duration = (*Game::pGameOptionsData)->fields.RoleOptions->fields.ProtectionDurationSeconds; - const float ProtectionDurationSeconds = _Duration; + const float ProtectionDurationSeconds = options.GetFloat(app::FloatOptionNames__Enum::ProtectionDurationSeconds, 1.0F); for (auto player : GetAllPlayerControl()) { if (!player->fields.protectedByGuardian) continue; @@ -149,10 +151,11 @@ namespace SelfTab { synchronized(State.protectMutex) { pair = State.protectMonitor[player->fields.PlayerId]; } - _Duration = ProtectionDurationSeconds - (app::Time_get_time(nullptr) - pair.second); + float _Duration = ProtectionDurationSeconds - (app::Time_get_time(nullptr) - pair.second); + options.SetFloat(app::FloatOptionNames__Enum::ProtectionDurationSeconds, _Duration); if (_Duration > 0.f) app::PlayerControl_TurnOnProtection(player, State.ShowProtections, pair.first, nullptr); - _Duration = ProtectionDurationSeconds; + options.SetFloat(app::FloatOptionNames__Enum::ProtectionDurationSeconds, ProtectionDurationSeconds); } } } \ No newline at end of file diff --git a/gui/tabs/settings_tab.cpp b/gui/tabs/settings_tab.cpp index e2576ca1..7161cb9c 100644 --- a/gui/tabs/settings_tab.cpp +++ b/gui/tabs/settings_tab.cpp @@ -62,10 +62,11 @@ namespace SettingsTab { State.userName = std::string(*nameBuffer); } } - + /* ImGui::Dummy(ImVec2(7, 7) * State.dpiScale); ImGui::Separator(); ImGui::Dummy(ImVec2(7, 7) * State.dpiScale); + if (ImGui::Button("Unlock all Steam achievements")) { for (const char* achievement : steamAchievements) @@ -73,7 +74,7 @@ namespace SettingsTab { Game::SteamUserStats_SetAchievement(convert_to_string(std::string(achievement))); } Game::SteamUserStats_StoreStats(); - } + }*/ ImGui::EndTabItem(); } diff --git a/hooks/GameOptionsData.cpp b/hooks/GameOptionsData.cpp deleted file mode 100644 index ce2c062e..00000000 --- a/hooks/GameOptionsData.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "pch-il2cpp.h" -#include "_hooks.h" -#include "state.hpp" - -GameOptionsData* dGameOptionsData_Deserialize(BinaryReader* reader, MethodInfo* method) { - auto gameOptions = GameOptionsData_Deserialize(reader, method); - - State.PrevPlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PrevKillDistance = gameOptions->fields._.killDistance; - State.KillDistance = gameOptions->fields._.killDistance; - State.PrevTaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - State.TaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - State.mapHostChoice = gameOptions->fields.MapId; - State.impostors_amount = gameOptions->fields._.numImpostors; - - return gameOptions; -} - -GameOptionsData* dGameOptionsData_Deserialize_1(MessageReader* reader, MethodInfo* method) { - auto gameOptions = GameOptionsData_Deserialize_1(reader, method); - - State.PrevPlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PrevKillDistance = gameOptions->fields._.killDistance; - State.KillDistance = gameOptions->fields._.killDistance; - State.PrevTaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - State.TaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - State.mapHostChoice = gameOptions->fields.MapId; - State.impostors_amount = gameOptions->fields._.numImpostors; - - return gameOptions; -} \ No newline at end of file diff --git a/hooks/GameOptionsManager.cpp b/hooks/GameOptionsManager.cpp new file mode 100644 index 00000000..280bb968 --- /dev/null +++ b/hooks/GameOptionsManager.cpp @@ -0,0 +1,11 @@ +#include "pch-il2cpp.h" +#include "_hooks.h" +#include "state.hpp" + +void dGameOptionsManager_set_CurrentGameOptions(GameOptionsManager* __this, IGameOptions* value, MethodInfo* method) { + GameOptionsManager_set_CurrentGameOptions(__this, value, method); + GameOptions gameOptions(value); + if (gameOptions.HasOptions()) { + SaveGameOptions(gameOptions); + } +} \ No newline at end of file diff --git a/hooks/HudManager.cpp b/hooks/HudManager.cpp index bffad002..c183a10f 100644 --- a/hooks/HudManager.cpp +++ b/hooks/HudManager.cpp @@ -4,15 +4,6 @@ #include "utility.h" #include "game.h" -void dHudManager_ShowMap(HudManager* __this, Action_1_MapBehaviour_* mapAction, MethodInfo* method) { - HudManager_ShowMap(__this, mapAction, method); - - //if (State.ChatAlwaysActive) - // ChatController_SetVisible(__this->fields.Chat, true, NULL); - //else - // ChatController_SetVisible(__this->fields.Chat, false, NULL); -} - void dHudManager_Update(HudManager* __this, MethodInfo* method) { static bool bChatAlwaysActivePrevious = false; if (bChatAlwaysActivePrevious != State.ChatAlwaysActive) diff --git a/hooks/InnerNetClient.cpp b/hooks/InnerNetClient.cpp index 20794dcd..f9e5052c 100644 --- a/hooks/InnerNetClient.cpp +++ b/hooks/InnerNetClient.cpp @@ -162,7 +162,7 @@ bool bogusTransformSnap(PlayerSelection& _player, Vector2 newPosition) return false; //For some reason the playercontroller is not marked dead at this point, so we check what layer the player is on auto currentPosition = PlayerControl_GetTruePosition(player.get_PlayerControl(), NULL); auto distanceToTarget = (int32_t)Vector2_Distance(currentPosition, newPosition, NULL); //rounding off as the smallest kill distance is zero - auto killDistance = std::clamp((*Game::pGameOptionsData)->fields._.killDistance, 0, 2); + auto killDistance = std::clamp(GameOptions().GetInt(app::Int32OptionNames__Enum::KillDistance), 0, 2); auto initialSpawnLocation = GetSpawnLocation(player.get_PlayerControl()->fields.PlayerId, (int)il2cpp::List((*Game::pGameData)->fields.AllPlayers).size(), true); auto meetingSpawnLocation = GetSpawnLocation(player.get_PlayerControl()->fields.PlayerId, (int)il2cpp::List((*Game::pGameData)->fields.AllPlayers).size(), false); if (Equals(initialSpawnLocation, newPosition)) return false; @@ -227,7 +227,7 @@ void dInnerNetClient_DisconnectInternal(InnerNetClient* __this, DisconnectReason // IsInGame() || IsInLobby() if (__this->fields.GameState == InnerNetClient_GameStates__Enum::Started || __this->fields.GameState == InnerNetClient_GameStates__Enum::Joined - || __this->fields.GameMode == GameModes__Enum::FreePlay) { + || __this->fields.NetworkMode == NetworkModes__Enum::FreePlay) { onGameEnd(); } InnerNetClient_DisconnectInternal(__this, reason, stringReason, method); diff --git a/hooks/MeetingHud.cpp b/hooks/MeetingHud.cpp index 6d77e1d3..372d1239 100644 --- a/hooks/MeetingHud.cpp +++ b/hooks/MeetingHud.cpp @@ -103,18 +103,19 @@ void dMeetingHud_PopulateResults(MeetingHud* __this, Il2CppArraySize* states, Me } } - auto prevAnonymousVotes = (*Game::pGameOptionsData)->fields.AnonymousVotes; + GameOptions options; + const auto prevAnonymousVotes = options.GetBool(app::BoolOptionNames__Enum::AnonymousVotes); if (prevAnonymousVotes && State.RevealAnonymousVotes) - (*Game::pGameOptionsData)->fields.AnonymousVotes = false; + options.SetBool(app::BoolOptionNames__Enum::AnonymousVotes, false); MeetingHud_PopulateResults(__this, states, method); - (*Game::pGameOptionsData)->fields.AnonymousVotes = prevAnonymousVotes; + options.SetBool(app::BoolOptionNames__Enum::AnonymousVotes, prevAnonymousVotes); } void RevealAnonymousVotes() { if (!State.InMeeting || !app::MeetingHud__TypeInfo || !app::MeetingHud__TypeInfo->static_fields->Instance - || !(*Game::pGameOptionsData)->fields.AnonymousVotes) + || !GameOptions().GetBool(app::BoolOptionNames__Enum::AnonymousVotes)) return; auto meetingHud = app::MeetingHud__TypeInfo->static_fields->Instance; for (auto votedForArea : il2cpp::Array(meetingHud->fields.playerStates)) { @@ -179,9 +180,10 @@ void dMeetingHud_Update(MeetingHud* __this, MethodInfo* method) { // avoid duplicate votes if (isBeforeResultsState) { - auto prevAnonymousVotes = (*Game::pGameOptionsData)->fields.AnonymousVotes; + GameOptions options; + const auto prevAnonymousVotes = options.GetBool(app::BoolOptionNames__Enum::AnonymousVotes); if (prevAnonymousVotes && State.RevealAnonymousVotes) - (*Game::pGameOptionsData)->fields.AnonymousVotes = false; + options.SetBool(app::BoolOptionNames__Enum::AnonymousVotes, false); if (playerVoteArea->fields.VotedFor != Game::SkippedVote) { for (auto votedForArea : playerStates) { if (votedForArea->fields.TargetPlayerId == playerVoteArea->fields.VotedFor) { @@ -195,7 +197,7 @@ void dMeetingHud_Update(MeetingHud* __this, MethodInfo* method) { auto transform = app::GameObject_get_transform(__this->fields.SkippedVoting, nullptr); MeetingHud_BloopAVoteIcon(__this, playerData, 0, transform, nullptr); } - (*Game::pGameOptionsData)->fields.AnonymousVotes = prevAnonymousVotes; + options.SetBool(app::BoolOptionNames__Enum::AnonymousVotes, prevAnonymousVotes); } } else if (!didVote && State.voteMonitor.find(playerData->fields.PlayerId) != State.voteMonitor.end()) diff --git a/hooks/NoShadowBehaviour.cpp b/hooks/NoShadowBehaviour.cpp index 5a61eef4..0442593f 100644 --- a/hooks/NoShadowBehaviour.cpp +++ b/hooks/NoShadowBehaviour.cpp @@ -4,11 +4,11 @@ #include "logger.h" void dNoShadowBehaviour_LateUpdate(NoShadowBehaviour* __this, MethodInfo* method) { - if ((State.Wallhack || State.FreeCam || State.EnableZoom) && !State.OcclusionCulling) { + /*22.12.08e if ((State.Wallhack || State.FreeCam || State.EnableZoom) && !State.OcclusionCulling) { NoShadowBehaviour_SetMaskFunction(__this, 8, NULL); } else { NoShadowBehaviour_LateUpdate(__this, method); - } + }*/ return; } \ No newline at end of file diff --git a/hooks/PlayerControl.cpp b/hooks/PlayerControl.cpp index f4551e14..18071fd5 100644 --- a/hooks/PlayerControl.cpp +++ b/hooks/PlayerControl.cpp @@ -239,16 +239,10 @@ void dPlayerControl_FixedUpdate(PlayerControl* __this, MethodInfo* method) { app::PlayerControl_FixedUpdate(__this, method); } -void dPlayerControl_RpcSyncSettings(PlayerControl* __this, GameOptionsData* gameOptions, MethodInfo* method) -{ - State.PrevPlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PlayerSpeed = gameOptions->fields._.playerSpeedMod; - State.PrevKillDistance = gameOptions->fields._.killDistance; - State.KillDistance = gameOptions->fields._.killDistance; - State.PrevTaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - State.TaskBarUpdates = (int)gameOptions->fields.TaskBarMode; - - PlayerControl_RpcSyncSettings(__this, gameOptions, method); +void dPlayerControl_RpcSyncSettings(PlayerControl* __this, Byte__Array* optionsByteArray, MethodInfo* method) { + SaveGameOptions(); + + PlayerControl_RpcSyncSettings(__this, optionsByteArray, method); } void dPlayerControl_MurderPlayer(PlayerControl* __this, PlayerControl* target, MethodInfo* method) diff --git a/hooks/RoleManager.cpp b/hooks/RoleManager.cpp index b98f8559..f639af43 100644 --- a/hooks/RoleManager.cpp +++ b/hooks/RoleManager.cpp @@ -8,8 +8,9 @@ void dRoleManager_SelectRoles(RoleManager* __this, MethodInfo* method) { std::vector assignedPlayers; + GameOptions options; auto allPlayers = GetAllPlayerControl(); - auto roleRates = RoleRates((*Game::pGameOptionsData)->fields, (int)allPlayers.size()); + auto roleRates = RoleRates(options, (int)allPlayers.size()); AssignPreChosenRoles(roleRates, assignedPlayers); AssignRoles(roleRates, roleRates.ShapeshifterChance, RoleTypes__Enum::Shapeshifter, allPlayers, assignedPlayers); @@ -19,13 +20,13 @@ void dRoleManager_SelectRoles(RoleManager* __this, MethodInfo* method) { AssignRoles(roleRates, 100, RoleTypes__Enum::Crewmate, allPlayers, assignedPlayers); } -void dRoleManager_AssignRolesForTeam(List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method) { +/*void dRoleManager_AssignRolesForTeam(List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method) { return RoleManager_AssignRolesForTeam(players, opts, team, teamMax, defaultRole, method); } void dRoleManager_AssignRolesFromList(List_1_GameData_PlayerInfo_* players, int32_t teamMax, List_1_RoleTypes_* roleList, int32_t* rolesAssigned, MethodInfo* method) { return RoleManager_AssignRolesFromList(players, teamMax, roleList, rolesAssigned, method); -} +}*/ void AssignPreChosenRoles(RoleRates& roleRates, std::vector& assignedPlayers) { diff --git a/hooks/_hooks.cpp b/hooks/_hooks.cpp index 1a903121..c75258e3 100644 --- a/hooks/_hooks.cpp +++ b/hooks/_hooks.cpp @@ -110,22 +110,17 @@ void DetourInitilization() { HOOKFUNC(ChatBubble_SetName); HOOKFUNC(ChatController_AddChat); HOOKFUNC(ChatController_SetVisible); - HOOKFUNC(HudManager_ShowMap); HOOKFUNC(HudManager_Update); HOOKFUNC(Camera_ScreenToWorldPoint); HOOKFUNC(KeyboardJoystick_Update); HOOKFUNC(ScreenJoystick_FixedUpdate); HOOKFUNC(PlainDoor_SetDoorway); - HOOKFUNC(GameOptionsData_Deserialize); - HOOKFUNC(GameOptionsData_Deserialize_1); HOOKFUNC(PlayerControl_MurderPlayer); HOOKFUNC(PlayerControl_CompleteTask); - //HOOKFUNC(PlayerControl_CmdReportDeadBody); - //HOOKFUNC(PlayerControl_ReportDeadBody); HOOKFUNC(PlayerControl_StartMeeting); HOOKFUNC(RoleManager_SelectRoles); - HOOKFUNC(RoleManager_AssignRolesForTeam); - HOOKFUNC(RoleManager_AssignRolesFromList); + //HOOKFUNC(RoleManager_AssignRolesForTeam); + //HOOKFUNC(RoleManager_AssignRolesFromList); HOOKFUNC(PlayerControl_HandleRpc); HOOKFUNC(Renderer_set_enabled); HOOKFUNC(MeetingHud_Awake); @@ -136,7 +131,7 @@ void DetourInitilization() { HOOKFUNC(Constants_ShouldFlipSkeld); HOOKFUNC(LobbyBehaviour_Start); HOOKFUNC(GameObject_SetActive); - HOOKFUNC(NoShadowBehaviour_LateUpdate); + //HOOKFUNC(NoShadowBehaviour_LateUpdate); HOOKFUNC(FollowerCamera_Update); HOOKFUNC(DoorBreakerGame_Start); HOOKFUNC(DoorCardSwipeGame_Begin); @@ -151,16 +146,14 @@ void DetourInitilization() { HOOKFUNC(ChatController_Update); HOOKFUNC(InnerNetClient_EnqueueDisconnect); HOOKFUNC(PlayerPhysics_FixedUpdate); - if (SaveManager_GetPurchase != nullptr) - HOOKFUNC(SaveManager_GetPurchase); - if (PlayerPurchasesData_GetPurchase != nullptr) // v2022.10.25s - HOOKFUNC(PlayerPurchasesData_GetPurchase); + HOOKFUNC(PlayerPurchasesData_GetPurchase); HOOKFUNC(PlayerControl_TurnOnProtection); HOOKFUNC(AmongUsClient_OnGameEnd); HOOKFUNC(InnerNetClient_DisconnectInternal); HOOKFUNC(AccountManager_UpdateKidAccountDisplay); HOOKFUNC(PlayerStorageManager_OnReadPlayerPrefsComplete); HOOKFUNC(EOSManager_UpdatePermissionKeys); + HOOKFUNC(GameOptionsManager_set_CurrentGameOptions); if (!HookFunction(&(PVOID&)oPresent, dPresent, "D3D_PRESENT_FUNCTION")) return; @@ -174,10 +167,7 @@ void DetourUninitialization() DetourUpdateThread(GetCurrentThread()); - if (SaveManager_GetPurchase != nullptr) - UNHOOKFUNC(SaveManager_GetPurchase); - if (PlayerPurchasesData_GetPurchase != nullptr) // v2022.10.25s - UNHOOKFUNC(PlayerPurchasesData_GetPurchase); + UNHOOKFUNC(PlayerPurchasesData_GetPurchase); UNHOOKFUNC(PlayerPhysics_FixedUpdate); UNHOOKFUNC(GameObject_SetActive); UNHOOKFUNC(SceneManager_Internal_ActiveSceneChanged); @@ -202,22 +192,17 @@ void DetourUninitialization() UNHOOKFUNC(ChatBubble_SetName); UNHOOKFUNC(ChatController_AddChat); UNHOOKFUNC(ChatController_SetVisible); - UNHOOKFUNC(HudManager_ShowMap); UNHOOKFUNC(HudManager_Update); UNHOOKFUNC(ScreenJoystick_FixedUpdate); UNHOOKFUNC(KeyboardJoystick_Update); UNHOOKFUNC(Camera_ScreenToWorldPoint); UNHOOKFUNC(PlainDoor_SetDoorway); - UNHOOKFUNC(GameOptionsData_Deserialize); - UNHOOKFUNC(GameOptionsData_Deserialize_1); UNHOOKFUNC(PlayerControl_MurderPlayer); UNHOOKFUNC(PlayerControl_CompleteTask); - //UNHOOKFUNC(PlayerControl_CmdReportDeadBody); - //UNHOOKFUNC(PlayerControl_ReportDeadBody); UNHOOKFUNC(PlayerControl_StartMeeting); UNHOOKFUNC(RoleManager_SelectRoles); - UNHOOKFUNC(RoleManager_AssignRolesForTeam); - UNHOOKFUNC(RoleManager_AssignRolesFromList); + //UNHOOKFUNC(RoleManager_AssignRolesForTeam); + //UNHOOKFUNC(RoleManager_AssignRolesFromList); UNHOOKFUNC(PlayerControl_HandleRpc); UNHOOKFUNC(Renderer_set_enabled); UNHOOKFUNC(MeetingHud_Awake); @@ -227,7 +212,7 @@ void DetourUninitialization() UNHOOKFUNC(CustomNetworkTransform_SnapTo); UNHOOKFUNC(Constants_ShouldFlipSkeld); UNHOOKFUNC(LobbyBehaviour_Start); - UNHOOKFUNC(NoShadowBehaviour_LateUpdate); + //UNHOOKFUNC(NoShadowBehaviour_LateUpdate); UNHOOKFUNC(FollowerCamera_Update); UNHOOKFUNC(DoorBreakerGame_Start); UNHOOKFUNC(DoorCardSwipeGame_Begin); @@ -247,6 +232,7 @@ void DetourUninitialization() UNHOOKFUNC(AccountManager_UpdateKidAccountDisplay); UNHOOKFUNC(PlayerStorageManager_OnReadPlayerPrefsComplete); UNHOOKFUNC(EOSManager_UpdatePermissionKeys); + UNHOOKFUNC(GameOptionsManager_set_CurrentGameOptions); if (DetourDetach(&(PVOID&)oPresent, dPresent) != 0) return; diff --git a/hooks/_hooks.h b/hooks/_hooks.h index ad23f06e..5645769d 100644 --- a/hooks/_hooks.h +++ b/hooks/_hooks.h @@ -12,13 +12,10 @@ bool dStatsManager_get_AmBanned(StatsManager* __this, MethodInfo* method); float dShipStatus_CalculateLightRadius(ShipStatus* __this, GameData_PlayerInfo* player, MethodInfo* method); float dStatsManager_get_BanPoints(StatsManager* __this, MethodInfo* method); float dVent_CanUse(Vent* __this, GameData_PlayerInfo* pc, bool* canUse, bool* couldUse, MethodInfo* method); -GameOptionsData* dGameOptionsData_Deserialize(BinaryReader* reader, MethodInfo* method); -GameOptionsData* dGameOptionsData_Deserialize_1(MessageReader* reader, MethodInfo* method); int32_t dStatsManager_get_BanMinutesLeft(StatsManager* __this, MethodInfo* method); void dChatBubble_SetName(ChatBubble* __this, String* playerName, bool isDead, bool voted, Color color, MethodInfo* method); void dChatController_AddChat(ChatController* __this, PlayerControl* sourcePlayer, String* chatText, MethodInfo* method); void dChatController_SetVisible(ChatController* __this, bool visible, MethodInfo* method); -void dHudManager_ShowMap(HudManager* __this, Action_1_MapBehaviour_* mapAction, MethodInfo* method); void dHudManager_Update(HudManager* __this, MethodInfo* method); Vector3 dCamera_ScreenToWorldPoint(Camera* __this, Vector3 position, MethodInfo* method); void dKeyboardJoystick_Update(KeyboardJoystick* __this, MethodInfo* method); @@ -32,9 +29,7 @@ void dPlayerControl_CompleteTask(PlayerControl* __this, uint32_t idx, MethodInfo void dPlayerControl_FixedUpdate(PlayerControl* __this, MethodInfo* method); void dPlayerControl_MurderPlayer(PlayerControl* __this, PlayerControl* target, MethodInfo* method); void dPlayerControl_StartMeeting(PlayerControl* __this, GameData_PlayerInfo* target, MethodInfo* method); -//void dPlayerControl_CmdReportDeadBody(PlayerControl* __this, GameData_PlayerInfo* target, MethodInfo* method); -//void dPlayerControl_ReportDeadBody(PlayerControl*__this, GameData_PlayerInfo* target, MethodInfo *method); -void dPlayerControl_RpcSyncSettings(PlayerControl* __this, GameOptionsData* gameOptions, MethodInfo* method); +void dPlayerControl_RpcSyncSettings(PlayerControl* __this, Byte__Array* optionsByteArray, MethodInfo* method); void dPlayerControl_HandleRpc(PlayerControl* __this, uint8_t callId, MessageReader* reader, MethodInfo* method); void dPlayerControl_Shapeshift(PlayerControl* __this, PlayerControl* target, bool animate, MethodInfo* method); void dPlayerControl_ProtectPlayer(PlayerControl* __this, PlayerControl* target, int32_t colorId, MethodInfo* method); @@ -66,8 +61,8 @@ void dChatController_Update(ChatController* __this, MethodInfo* method); void dInnerNetClient_EnqueueDisconnect(InnerNetClient* __this, DisconnectReasons__Enum reason, String* stringReason, MethodInfo* method); void dInnerNetClient_DisconnectInternal(InnerNetClient* __this, DisconnectReasons__Enum reason, String* stringReason, MethodInfo* method); void dRoleManager_SelectRoles(RoleManager* __this, MethodInfo * method); -void dRoleManager_AssignRolesForTeam(List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method); -void dRoleManager_AssignRolesFromList(List_1_GameData_PlayerInfo_* players, int32_t teamMax, List_1_RoleTypes_* roleList, int32_t* rolesAssigned, MethodInfo* method); +//void dRoleManager_AssignRolesForTeam(List_1_GameData_PlayerInfo_* players, RoleOptionsData* opts, RoleTeamTypes__Enum team, int32_t teamMax, Nullable_1_RoleTypes_ defaultRole, MethodInfo* method); +//void dRoleManager_AssignRolesFromList(List_1_GameData_PlayerInfo_* players, int32_t teamMax, List_1_RoleTypes_* roleList, int32_t* rolesAssigned, MethodInfo* method); void dPlayerPhysics_FixedUpdate (PlayerPhysics* __this, MethodInfo* method); bool dSaveManager_GetPurchase(String* itemKey, String* bundleKey, MethodInfo* method); void dPlayerControl_TurnOnProtection(PlayerControl* __this, bool visible, int32_t colorId, MethodInfo* method); @@ -75,3 +70,4 @@ void dAmongUsClient_OnGameEnd(AmongUsClient* __this, Object* endGameResult, Meth void dAccountManager_UpdateKidAccountDisplay(AccountManager* __this, MethodInfo* method); void dPlayerStorageManager_OnReadPlayerPrefsComplete(PlayerStorageManager* __this, void* data, MethodInfo* method); bool dPlayerPurchasesData_GetPurchase(PlayerPurchasesData* __this, String* itemKey, String* bundleKey, MethodInfo* method); +void dGameOptionsManager_set_CurrentGameOptions(GameOptionsManager* __this, IGameOptions* value, MethodInfo* method); diff --git a/user/game.cpp b/user/game.cpp index b803c0d2..35764648 100644 --- a/user/game.cpp +++ b/user/game.cpp @@ -5,7 +5,6 @@ namespace Game { AmongUsClient** pAmongUsClient = nullptr; GameData** pGameData = nullptr; - GameOptionsData** pGameOptionsData = nullptr; List_1_PlayerControl_** pAllPlayerControls = nullptr; PlayerControl** pLocalPlayer = nullptr; ShipStatus** pShipStatus = nullptr; diff --git a/user/game.h b/user/game.h index 30d6da74..97823816 100644 --- a/user/game.h +++ b/user/game.h @@ -22,7 +22,6 @@ namespace Game { extern AmongUsClient** pAmongUsClient; extern GameData** pGameData; - extern GameOptionsData** pGameOptionsData; extern List_1_PlayerControl_** pAllPlayerControls; extern PlayerControl** pLocalPlayer; extern ShipStatus** pShipStatus; diff --git a/user/main.cpp b/user/main.cpp index e158df1e..98eb6994 100644 --- a/user/main.cpp +++ b/user/main.cpp @@ -112,7 +112,6 @@ void Run(LPVOID lpParam) { #endif GAME_STATIC_POINTER(Game::pAmongUsClient, app::AmongUsClient, Instance); GAME_STATIC_POINTER(Game::pGameData, app::GameData, Instance); - GAME_STATIC_POINTER(Game::pGameOptionsData, app::PlayerControl, GameOptions); GAME_STATIC_POINTER(Game::pAllPlayerControls, app::PlayerControl, AllPlayerControls); GAME_STATIC_POINTER(Game::pLocalPlayer, app::PlayerControl, LocalPlayer); GAME_STATIC_POINTER(Game::pShipStatus, app::ShipStatus, Instance); diff --git a/user/utility.cpp b/user/utility.cpp index 7e4d8ffb..af67fcf9 100644 --- a/user/utility.cpp +++ b/user/utility.cpp @@ -16,18 +16,17 @@ int randi(int lo, int hi) { return lo + i; } -RoleRates::RoleRates(const GameOptionsData__Fields& gameOptionsDataFields, int playerAmount) { - this->ImposterCount = gameOptionsDataFields._.numImpostors; +RoleRates::RoleRates(const class GameOptions& gameOptions, int playerAmount) { + this->ImposterCount = gameOptions.GetNumImpostors(); auto maxImpostors = GetMaxImposterAmount(playerAmount); if(this->ImposterCount > maxImpostors) this->ImposterCount = maxImpostors; - il2cpp::Dictionary roleRates = gameOptionsDataFields.RoleOptions->fields.roleRates; + const auto& roleOptions = gameOptions.GetRoleOptions(); #define GET_ROLE_RATE(type) \ - if (auto value = roleRates[RoleTypes__Enum::##type]) { \ - this->type##Chance = value->Chance; \ - this->type##Count = value->MaxCount; \ - } + this->type##Chance = roleOptions.GetChancePerGame(RoleTypes__Enum::##type); \ + this->type##Count = roleOptions.GetNumPerGame(RoleTypes__Enum::##type); + GET_ROLE_RATE(Engineer); GET_ROLE_RATE(Scientist); GET_ROLE_RATE(Shapeshifter); @@ -232,13 +231,14 @@ ImVec4 AmongUsColorToImVec4(const Color32& color) { return ImVec4(color.r / 255.0F, color.g / 255.0F, color.b / 255.0F, color.a / 255.0F); } -#define LocalInGame (((*Game::pAmongUsClient)->fields._.GameMode == GameModes__Enum::LocalGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Started)) -#define OnlineInGame (((*Game::pAmongUsClient)->fields._.GameMode == GameModes__Enum::OnlineGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Started)) -#define OnlineInLobby (((*Game::pAmongUsClient)->fields._.GameMode == GameModes__Enum::OnlineGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Joined)) +#define LocalInGame (((*Game::pAmongUsClient)->fields._.NetworkMode == NetworkModes__Enum::LocalGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Started)) +#define OnlineInGame (((*Game::pAmongUsClient)->fields._.NetworkMode == NetworkModes__Enum::OnlineGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Started)) +#define OnlineInLobby (((*Game::pAmongUsClient)->fields._.NetworkMode == NetworkModes__Enum::OnlineGame) && ((*Game::pAmongUsClient)->fields._.GameState == InnerNetClient_GameStates__Enum::Joined)) #define TutorialScene (State.CurrentScene.compare("Tutorial") == 0) bool IsInLobby() { if (Object_1_IsNull((Object_1*)*Game::pAmongUsClient)) return false; + if (!app::GameManager_get_Instance(nullptr)) return false; return OnlineInLobby && Object_1_IsNotNull((Object_1*)*Game::pLocalPlayer); } @@ -249,11 +249,13 @@ bool IsHost() { bool IsInGame() { if (Object_1_IsNull((Object_1*)*Game::pAmongUsClient)) return false; + if (!app::GameManager_get_Instance(nullptr)) return false; return (LocalInGame || OnlineInGame || TutorialScene) && Object_1_IsNotNull((Object_1*)*Game::pShipStatus) && Object_1_IsNotNull((Object_1*)*Game::pLocalPlayer); } bool IsInMultiplayerGame() { if (Object_1_IsNull((Object_1*)*Game::pAmongUsClient)) return false; + if (!app::GameManager_get_Instance(nullptr)) return false; return (LocalInGame || OnlineInGame) && Object_1_IsNotNull((Object_1*)*Game::pShipStatus) && Object_1_IsNotNull((Object_1*)*Game::pLocalPlayer); } @@ -819,31 +821,184 @@ bool Object_1_IsNull(app::Object_1* obj) } std::string GetPlayerName() { - if (app::PlayerCustomizationData_get_Name != nullptr) { - // v2022.10.25s - auto player = app::DataManager_get_Player(nullptr); - static FieldInfo* field = il2cpp_class_get_field_from_name(player->Il2CppClass.klass, "customization"); - LOG_ASSERT(field != nullptr); - auto customization = il2cpp_field_get_value_object(field, player); - LOG_ASSERT(customization != nullptr); - return convert_from_string(app::PlayerCustomizationData_get_Name(customization, nullptr)); - } - else { - return convert_from_string(app::SaveManager_get_PlayerName(nullptr)); - } + auto player = app::DataManager_get_Player(nullptr); + static FieldInfo* field = il2cpp_class_get_field_from_name(player->Il2CppClass.klass, "customization"); + LOG_ASSERT(field != nullptr); + auto customization = il2cpp_field_get_value_object(field, player); + LOG_ASSERT(customization != nullptr); + return convert_from_string(app::PlayerCustomizationData_get_Name(customization, nullptr)); } void SetPlayerName(std::string_view name) { - if (app::PlayerCustomizationData_set_Name != nullptr) { - // v2022.10.25s - auto player = app::DataManager_get_Player(nullptr); - static FieldInfo* field = il2cpp_class_get_field_from_name(player->Il2CppClass.klass, "customization"); - LOG_ASSERT(field != nullptr); - auto customization = il2cpp_field_get_value_object(field, player); - LOG_ASSERT(customization != nullptr); - app::PlayerCustomizationData_set_Name(customization, convert_to_string(name), nullptr); - } - else { - app::SaveManager_set_PlayerName(convert_to_string(name), nullptr); - } -} \ No newline at end of file + auto player = app::DataManager_get_Player(nullptr); + static FieldInfo* field = il2cpp_class_get_field_from_name(player->Il2CppClass.klass, "customization"); + LOG_ASSERT(field != nullptr); + auto customization = il2cpp_field_get_value_object(field, player); + LOG_ASSERT(customization != nullptr); + app::PlayerCustomizationData_set_Name(customization, convert_to_string(name), nullptr); +} + +//TODO: Workaround +#define GET_VIRTUAL_INVOKE(obj, method) \ + ((VirtualInvokeData*)(&obj->klass->vtable))[ \ + (obj->klass->interfaceOffsets ? obj->klass->interfaceOffsets[0].offset : 0) \ + + offsetof(decltype(obj->klass->vtable), method) \ + / sizeof(VirtualInvokeData)] + +GameOptions::GameOptions() : _options(nullptr) { + auto mgr = app::GameManager_get_Instance(nullptr); + LOG_ASSERT(mgr != nullptr); + auto logic = app::GameManager_get_LogicOptions(mgr, nullptr); + LOG_ASSERT(logic != nullptr); + auto& func = GET_VIRTUAL_INVOKE(logic, __unknown_4); + _options = ((app::IGameOptions*(*)(void*, const void*))(func.methodPtr))(logic, func.method); + LOG_ASSERT(_options != nullptr); +} + +GameOptions& GameOptions::SetByte(app::ByteOptionNames__Enum option, uint8_t value) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetByte); + ((void(*)(void*, app::ByteOptionNames__Enum, uint8_t, const void*))(func.methodPtr)) + (_options, option, value, func.method); + return *this; +} + +GameOptions& GameOptions::SetFloat(app::FloatOptionNames__Enum option, float value) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetFloat); + ((void(*)(void*, app::FloatOptionNames__Enum, float, const void*))(func.methodPtr)) + (_options, option, value, func.method); + return *this; +} + +GameOptions& GameOptions::SetBool(app::BoolOptionNames__Enum option, bool value) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetBool); + ((void(*)(void*, app::BoolOptionNames__Enum, bool, const void*))(func.methodPtr)) + (_options, option, value, func.method); + return *this; +} + +GameOptions& GameOptions::SetInt(app::Int32OptionNames__Enum option, int32_t value) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetInt); + ((void(*)(void*, app::Int32OptionNames__Enum, int32_t, const void*))(func.methodPtr)) + (_options, option, value, func.method); + return *this; +} + +GameOptions& GameOptions::SetUInt(app::UInt32OptionNames__Enum option, uint32_t value) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetUInt); + ((void(*)(void*, app::UInt32OptionNames__Enum, uint32_t, const void*))(func.methodPtr)) + (_options, option, value, func.method); + return *this; +} + +uint8_t GameOptions::GetByte(app::ByteOptionNames__Enum option, uint8_t defaultValue) const { + auto& func = GET_VIRTUAL_INVOKE(_options, TryGetByte); + uint8_t value; + bool succ = ((bool(*)(void*, app::ByteOptionNames__Enum, uint8_t*, const void*))(func.methodPtr)) + (_options, option, &value, func.method); + if (!succ) + value = defaultValue; + return value; +} + +float GameOptions::GetFloat(app::FloatOptionNames__Enum option, float defaultValue) const { + auto& func = GET_VIRTUAL_INVOKE(_options, TryGetFloat); + float value; + bool succ = ((bool(*)(void*, app::FloatOptionNames__Enum, float*, const void*))(func.methodPtr)) + (_options, option, &value, func.method); + if (!succ) + value = defaultValue; + return value; +} + +bool GameOptions::GetBool(app::BoolOptionNames__Enum option, bool defaultValue) const { + auto& func = GET_VIRTUAL_INVOKE(_options, TryGetBool); + bool value; + bool succ = ((bool(*)(void*, app::BoolOptionNames__Enum, bool*, const void*))(func.methodPtr)) + (_options, option, &value, func.method); + if (!succ) + value = defaultValue; + return value; +} + +int32_t GameOptions::GetInt(app::Int32OptionNames__Enum option, int32_t defaultValue) const { + auto& func = GET_VIRTUAL_INVOKE(_options, TryGetInt); + int32_t value; + bool succ = ((bool(*)(void*, app::Int32OptionNames__Enum, int32_t*, const void*))(func.methodPtr)) + (_options, option, &value, func.method); + if (!succ) + value = defaultValue; + return value; +} + +app::GameModes__Enum GameOptions::GetGameMode() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_GameMode); + return ((app::GameModes__Enum(*)(void*, const void*))(func.methodPtr))(_options, func.method); +} + +int32_t GameOptions::GetMaxPlayers() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_MaxPlayers); + return ((int32_t(*)(void*, const void*))(func.methodPtr))(_options, func.method); +} + +uint8_t GameOptions::GetMapId() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_MapId); + return ((uint8_t(*)(void*, const void*))(func.methodPtr))(_options, func.method); +} + +int32_t GameOptions::GetNumImpostors() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_NumImpostors); + return ((int32_t(*)(void*, const void*))(func.methodPtr))(_options, func.method); +} + +int32_t GameOptions::GetTotalTaskCount() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_TotalTaskCount); + return ((int32_t(*)(void*, const void*))(func.methodPtr))(_options, func.method); +} + +RoleOptions GameOptions::GetRoleOptions() const { + auto& func = GET_VIRTUAL_INVOKE(_options, get_RoleOptions); + return RoleOptions(((app::IRoleOptionsCollection*(*)(void*, const void*))(func.methodPtr))(_options, func.method)); +} + +float GameOptions::GetPlayerSpeedMod() const { + return GetFloat(app::FloatOptionNames__Enum::PlayerSpeedMod, 1.0F); +} + +float GameOptions::GetKillCooldown() const { + return GetFloat(app::FloatOptionNames__Enum::KillCooldown, 1.0F); +} + +RoleOptions& RoleOptions::SetRoleRate(app::RoleTypes__Enum role, int32_t maxCount, int32_t chance) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetRoleRate); + ((void(*)(void*, app::RoleTypes__Enum, int32_t, int32_t, const void*))(func.methodPtr)) + (_options, role, maxCount, chance, func.method); + return *this; +} + +RoleOptions& RoleOptions::SetRoleRecommended(app::RoleTypes__Enum role) { + auto& func = GET_VIRTUAL_INVOKE(_options, SetRoleRecommended); + ((void(*)(void*, app::RoleTypes__Enum, const void*))(func.methodPtr))(_options, role, func.method); + return *this; +} + +int32_t RoleOptions::GetNumPerGame(app::RoleTypes__Enum role) const { + auto& func = GET_VIRTUAL_INVOKE(_options, GetNumPerGame); + return ((int32_t(*)(void*, app::RoleTypes__Enum, const void*))(func.methodPtr))(_options, role, func.method); +} + +int32_t RoleOptions::GetChancePerGame(app::RoleTypes__Enum role) const { + auto& func = GET_VIRTUAL_INVOKE(_options, GetChancePerGame); + return ((int32_t(*)(void*, app::RoleTypes__Enum, const void*))(func.methodPtr))(_options, role, func.method); +} + +void SaveGameOptions() { + SaveGameOptions(GameOptions()); +} + +void SaveGameOptions(const class GameOptions& gameOptions) { + State.PlayerSpeed = State.PrevPlayerSpeed = gameOptions.GetPlayerSpeedMod(); + State.KillDistance = State.PrevKillDistance = gameOptions.GetInt(app::Int32OptionNames__Enum::KillDistance); + State.TaskBarUpdates = State.PrevTaskBarUpdates = gameOptions.GetInt(app::Int32OptionNames__Enum::TaskBarMode); + State.mapHostChoice = gameOptions.GetMapId(); + State.impostors_amount = gameOptions.GetNumImpostors(); +} diff --git a/user/utility.h b/user/utility.h index 937aea16..287d4a7e 100644 --- a/user/utility.h +++ b/user/utility.h @@ -50,7 +50,7 @@ class RoleRates { int GuardianAngelCount = 0; int GuardianAngelChance = 0; int MaxCrewmates = Game::MAX_PLAYERS; - RoleRates(const GameOptionsData__Fields& gameOptionsDataFields, int playerAmount); + RoleRates(const class GameOptions& gameOptions, int playerAmount); int GetRoleCount(RoleTypes__Enum role); void SubtractRole(RoleTypes__Enum role); }; @@ -208,4 +208,55 @@ bool Object_1_IsNotNull(app::Object_1* unity_object); bool Object_1_IsNull(app::Object_1* unity_object); std::string GetPlayerName(); -void SetPlayerName(std::string_view name); \ No newline at end of file +void SetPlayerName(std::string_view name); + +void SaveGameOptions(); +void SaveGameOptions(const class GameOptions& gameOptions); + +class RoleOptions { +public: + RoleOptions(app::IRoleOptionsCollection* options) + : _options(options) { + } + + RoleOptions& SetRoleRate(app::RoleTypes__Enum role, int32_t maxCount, int32_t chance); + RoleOptions& SetRoleRecommended(app::RoleTypes__Enum role); + + int32_t GetNumPerGame(app::RoleTypes__Enum role) const; + int32_t GetChancePerGame(app::RoleTypes__Enum role) const; +private: + app::IRoleOptionsCollection* _options; +}; + +class GameOptions { +public: + GameOptions(); + GameOptions(app::IGameOptions* options) : _options(options){}; + + constexpr bool HasOptions() const { + return _options != nullptr; + } + + GameOptions& SetByte(app::ByteOptionNames__Enum option, uint8_t value); + GameOptions& SetFloat(app::FloatOptionNames__Enum option, float value); + GameOptions& SetBool(app::BoolOptionNames__Enum option, bool value); + GameOptions& SetInt(app::Int32OptionNames__Enum option, int32_t value); + GameOptions& SetUInt(app::UInt32OptionNames__Enum option, uint32_t value); + + uint8_t GetByte(app::ByteOptionNames__Enum option, uint8_t defaultValue = 0) const; + float GetFloat(app::FloatOptionNames__Enum option, float defaultValue = 0.0) const; + bool GetBool(app::BoolOptionNames__Enum option, bool defaultValue = false) const; + int32_t GetInt(app::Int32OptionNames__Enum option, int32_t defaultValue = 0) const; + + app::GameModes__Enum GetGameMode() const; + int32_t GetMaxPlayers() const; + uint8_t GetMapId() const; + int32_t GetNumImpostors() const; + int32_t GetTotalTaskCount() const; + RoleOptions GetRoleOptions() const; + + float GetPlayerSpeedMod() const; + float GetKillCooldown() const; +private: + app::IGameOptions* _options; +};