diff --git a/CMakeLists.txt b/CMakeLists.txt index a9ebbae..5760195 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ set(CMAKE_REQUIRED_QUIET ON) set(OK TRUE) -file(GLOB_RECURSE HEADERS "*.hpp") +file(GLOB_RECURSE HEADERS "**.hpp") message(STATUS "") diff --git a/network/snConnectToPeerTask.hpp b/network/snConnectToPeerTask.hpp new file mode 100644 index 0000000..8edc25b --- /dev/null +++ b/network/snConnectToPeerTask.hpp @@ -0,0 +1,21 @@ +#pragma once +#include + +namespace rage +{ + class snConnectToPeerTaskData + { + public: + int m_unk; + int m_reason; + uint64_t m_session_token; + }; + + class snConnectToPeerTaskResult + { + public: + char pad[0x10]{}; + int m_peer_id; + char pad2[0x400]{}; + }; +} \ No newline at end of file diff --git a/rage/rlQueryPresenceAttributesContext.hpp b/rage/rlQueryPresenceAttributesContext.hpp new file mode 100644 index 0000000..f455312 --- /dev/null +++ b/rage/rlQueryPresenceAttributesContext.hpp @@ -0,0 +1,15 @@ +#pragma once +#include + +namespace rage +{ + class rlQueryPresenceAttributesContext + { + public: + char m_presence_attribute_key[64]; //0x0000 + char m_presence_attribute_value[256]; //0x0040 + uint32_t m_presence_attibute_type; //0x0140 + char pad_0144[4]; //0x0144 + }; //Size: 0x0148 + static_assert(sizeof(rage::rlQueryPresenceAttributesContext) == 0x148); +} \ No newline at end of file diff --git a/rage/rlScHandle.hpp b/rage/rlScHandle.hpp new file mode 100644 index 0000000..0aea109 --- /dev/null +++ b/rage/rlScHandle.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include + +namespace rage +{ +#pragma pack(push,8) + class rlScHandle + { + public: + uint64_t m_rockstar_id; //0x0000 + char m_pad[2]; + uint8_t m_platform; //0x000A + uint8_t unk_0009; //0x000B + + inline rlScHandle() = default; + + inline rlScHandle(uint64_t rockstar_id) : + m_rockstar_id(rockstar_id), + m_platform(3), + unk_0009(0) + { + } + }; //Size: 0x0010 + static_assert(sizeof(rlScHandle) == 0x10); +#pragma pack(pop) +} \ No newline at end of file diff --git a/rage/rlTaskStatus.hpp b/rage/rlTaskStatus.hpp new file mode 100644 index 0000000..706b376 --- /dev/null +++ b/rage/rlTaskStatus.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace rage +{ + struct rlTaskStatus + { + int status = 0; + int unk = 0; + }; +} \ No newline at end of file diff --git a/script/HudColor.hpp b/script/HudColor.hpp new file mode 100644 index 0000000..b0852ca --- /dev/null +++ b/script/HudColor.hpp @@ -0,0 +1,222 @@ +#pragma once +#include "types.hpp" + +enum class HudColor : std::uint32_t +{ + HUD_COLOUR_PURE_WHITE, + HUD_COLOUR_WHITE, + HUD_COLOUR_BLACK, + HUD_COLOUR_GREY, + HUD_COLOUR_GREYLIGHT, + HUD_COLOUR_GREYDARK, + HUD_COLOUR_RED, + HUD_COLOUR_REDLIGHT, + HUD_COLOUR_REDDARK, + HUD_COLOUR_BLUE, + HUD_COLOUR_BLUELIGHT, + HUD_COLOUR_BLUEDARK, + HUD_COLOUR_YELLOW, + HUD_COLOUR_YELLOWLIGHT, + HUD_COLOUR_YELLOWDARK, + HUD_COLOUR_ORANGE, + HUD_COLOUR_ORANGELIGHT, + HUD_COLOUR_ORANGEDARK, + HUD_COLOUR_GREEN, + HUD_COLOUR_GREENLIGHT, + HUD_COLOUR_GREENDARK, + HUD_COLOUR_PURPLE, + HUD_COLOUR_PURPLELIGHT, + HUD_COLOUR_PURPLEDARK, + HUD_COLOUR_PINK, + HUD_COLOUR_RADAR_HEALTH, + HUD_COLOUR_RADAR_ARMOUR, + HUD_COLOUR_RADAR_DAMAGE, + HUD_COLOUR_NET_PLAYER1, + HUD_COLOUR_NET_PLAYER2, + HUD_COLOUR_NET_PLAYER3, + HUD_COLOUR_NET_PLAYER4, + HUD_COLOUR_NET_PLAYER5, + HUD_COLOUR_NET_PLAYER6, + HUD_COLOUR_NET_PLAYER7, + HUD_COLOUR_NET_PLAYER8, + HUD_COLOUR_NET_PLAYER9, + HUD_COLOUR_NET_PLAYER10, + HUD_COLOUR_NET_PLAYER11, + HUD_COLOUR_NET_PLAYER12, + HUD_COLOUR_NET_PLAYER13, + HUD_COLOUR_NET_PLAYER14, + HUD_COLOUR_NET_PLAYER15, + HUD_COLOUR_NET_PLAYER16, + HUD_COLOUR_NET_PLAYER17, + HUD_COLOUR_NET_PLAYER18, + HUD_COLOUR_NET_PLAYER19, + HUD_COLOUR_NET_PLAYER20, + HUD_COLOUR_NET_PLAYER21, + HUD_COLOUR_NET_PLAYER22, + HUD_COLOUR_NET_PLAYER23, + HUD_COLOUR_NET_PLAYER24, + HUD_COLOUR_NET_PLAYER25, + HUD_COLOUR_NET_PLAYER26, + HUD_COLOUR_NET_PLAYER27, + HUD_COLOUR_NET_PLAYER28, + HUD_COLOUR_NET_PLAYER29, + HUD_COLOUR_NET_PLAYER30, + HUD_COLOUR_NET_PLAYER31, + HUD_COLOUR_NET_PLAYER32, + HUD_COLOUR_SIMPLEBLIP_DEFAULT, + HUD_COLOUR_MENU_BLUE, + HUD_COLOUR_MENU_GREY_LIGHT, + HUD_COLOUR_MENU_BLUE_EXTRA_DARK, + HUD_COLOUR_MENU_YELLOW, + HUD_COLOUR_MENU_YELLOW_DARK, + HUD_COLOUR_MENU_GREEN, + HUD_COLOUR_MENU_GREY, + HUD_COLOUR_MENU_GREY_DARK, + HUD_COLOUR_MENU_HIGHLIGHT, + HUD_COLOUR_MENU_STANDARD, + HUD_COLOUR_MENU_DIMMED, + HUD_COLOUR_MENU_EXTRA_DIMMED, + HUD_COLOUR_BRIEF_TITLE, + HUD_COLOUR_MID_GREY_MP, + HUD_COLOUR_NET_PLAYER1_DARK, + HUD_COLOUR_NET_PLAYER2_DARK, + HUD_COLOUR_NET_PLAYER3_DARK, + HUD_COLOUR_NET_PLAYER4_DARK, + HUD_COLOUR_NET_PLAYER5_DARK, + HUD_COLOUR_NET_PLAYER6_DARK, + HUD_COLOUR_NET_PLAYER7_DARK, + HUD_COLOUR_NET_PLAYER8_DARK, + HUD_COLOUR_NET_PLAYER9_DARK, + HUD_COLOUR_NET_PLAYER10_DARK, + HUD_COLOUR_NET_PLAYER11_DARK, + HUD_COLOUR_NET_PLAYER12_DARK, + HUD_COLOUR_NET_PLAYER13_DARK, + HUD_COLOUR_NET_PLAYER14_DARK, + HUD_COLOUR_NET_PLAYER15_DARK, + HUD_COLOUR_NET_PLAYER16_DARK, + HUD_COLOUR_NET_PLAYER17_DARK, + HUD_COLOUR_NET_PLAYER18_DARK, + HUD_COLOUR_NET_PLAYER19_DARK, + HUD_COLOUR_NET_PLAYER20_DARK, + HUD_COLOUR_NET_PLAYER21_DARK, + HUD_COLOUR_NET_PLAYER22_DARK, + HUD_COLOUR_NET_PLAYER23_DARK, + HUD_COLOUR_NET_PLAYER24_DARK, + HUD_COLOUR_NET_PLAYER25_DARK, + HUD_COLOUR_NET_PLAYER26_DARK, + HUD_COLOUR_NET_PLAYER27_DARK, + HUD_COLOUR_NET_PLAYER28_DARK, + HUD_COLOUR_NET_PLAYER29_DARK, + HUD_COLOUR_NET_PLAYER30_DARK, + HUD_COLOUR_NET_PLAYER31_DARK, + HUD_COLOUR_NET_PLAYER32_DARK, + HUD_COLOUR_BRONZE, + HUD_COLOUR_SILVER, + HUD_COLOUR_GOLD, + HUD_COLOUR_PLATINUM, + HUD_COLOUR_GANG1, + HUD_COLOUR_GANG2, + HUD_COLOUR_GANG3, + HUD_COLOUR_GANG4, + HUD_COLOUR_SAME_CREW, + HUD_COLOUR_FREEMODE, + HUD_COLOUR_PAUSE_BG, + HUD_COLOUR_FRIENDLY, + HUD_COLOUR_ENEMY, + HUD_COLOUR_LOCATION, + HUD_COLOUR_PICKUP, + HUD_COLOUR_PAUSE_SINGLEPLAYER, + HUD_COLOUR_FREEMODE_DARK, + HUD_COLOUR_INACTIVE_MISSION, + HUD_COLOUR_DAMAGE, + HUD_COLOUR_PINKLIGHT, + HUD_COLOUR_PM_MITEM_HIGHLIGHT, + HUD_COLOUR_SCRIPT_VARIABLE, + HUD_COLOUR_YOGA, + HUD_COLOUR_TENNIS, + HUD_COLOUR_GOLF, + HUD_COLOUR_SHOOTING_RANGE, + HUD_COLOUR_FLIGHT_SCHOOL, + HUD_COLOUR_NORTH_BLUE, + HUD_COLOUR_SOCIAL_CLUB, + HUD_COLOUR_PLATFORM_BLUE, + HUD_COLOUR_PLATFORM_GREEN, + HUD_COLOUR_PLATFORM_GREY, + HUD_COLOUR_FACEBOOK_BLUE, + HUD_COLOUR_INGAME_BG, + HUD_COLOUR_DARTS, + HUD_COLOUR_WAYPOINT, + HUD_COLOUR_MICHAEL, + HUD_COLOUR_FRANKLIN, + HUD_COLOUR_TREVOR, + HUD_COLOUR_GOLF_P1, + HUD_COLOUR_GOLF_P2, + HUD_COLOUR_GOLF_P3, + HUD_COLOUR_GOLF_P4, + HUD_COLOUR_WAYPOINTLIGHT, + HUD_COLOUR_WAYPOINTDARK, + HUD_COLOUR_PANEL_LIGHT, + HUD_COLOUR_MICHAEL_DARK, + HUD_COLOUR_FRANKLIN_DARK, + HUD_COLOUR_TREVOR_DARK, + HUD_COLOUR_OBJECTIVE_ROUTE, + HUD_COLOUR_PAUSEMAP_TINT, + HUD_COLOUR_PAUSE_DESELECT, + HUD_COLOUR_PM_WEAPONS_PURCHASABLE, + HUD_COLOUR_PM_WEAPONS_LOCKED, + HUD_COLOUR_END_SCREEN_BG, + HUD_COLOUR_CHOP, + HUD_COLOUR_PAUSEMAP_TINT_HALF, + HUD_COLOUR_NORTH_BLUE_OFFICIAL, + HUD_COLOUR_SCRIPT_VARIABLE_2, + HUD_COLOUR_H, + HUD_COLOUR_HDARK, + HUD_COLOUR_T, + HUD_COLOUR_TDARK, + HUD_COLOUR_HSHARD, + HUD_COLOUR_CONTROLLER_MICHAEL, + HUD_COLOUR_CONTROLLER_FRANKLIN, + HUD_COLOUR_CONTROLLER_TREVOR, + HUD_COLOUR_CONTROLLER_CHOP, + HUD_COLOUR_VIDEO_EDITOR_VIDEO, + HUD_COLOUR_VIDEO_EDITOR_AUDIO, + HUD_COLOUR_VIDEO_EDITOR_TEXT, + HUD_COLOUR_HB_BLUE, + HUD_COLOUR_HB_YELLOW, + HUD_COLOUR_VIDEO_EDITOR_SCORE, + HUD_COLOUR_VIDEO_EDITOR_AUDIO_FADEOUT, + HUD_COLOUR_VIDEO_EDITOR_TEXT_FADEOUT, + HUD_COLOUR_VIDEO_EDITOR_SCORE_FADEOUT, + HUD_COLOUR_HEIST_BACKGROUND, + HUD_COLOUR_VIDEO_EDITOR_AMBIENT, + HUD_COLOUR_VIDEO_EDITOR_AMBIENT_FADEOUT, + HUD_COLOUR_GB, + HUD_COLOUR_G, + HUD_COLOUR_B, + HUD_COLOUR_LOW_FLOW, + HUD_COLOUR_LOW_FLOW_DARK, + HUD_COLOUR_G1, + HUD_COLOUR_G2, + HUD_COLOUR_G3, + HUD_COLOUR_G4, + HUD_COLOUR_G5, + HUD_COLOUR_G6, + HUD_COLOUR_G7, + HUD_COLOUR_G8, + HUD_COLOUR_G9, + HUD_COLOUR_G10, + HUD_COLOUR_G11, + HUD_COLOUR_G12, + HUD_COLOUR_G13, + HUD_COLOUR_G14, + HUD_COLOUR_G15, + HUD_COLOUR_ADVERSARY, + HUD_COLOUR_DEGEN_RED, + HUD_COLOUR_DEGEN_YELLOW, + HUD_COLOUR_DEGEN_GREEN, + HUD_COLOUR_DEGEN_CYAN, + HUD_COLOUR_DEGEN_BLUE, + HUD_COLOUR_DEGEN_MAGENTA, + HUD_COLOUR_STUNT_1, + HUD_COLOUR_STUNT_2 +}; \ No newline at end of file diff --git a/script/Timer.hpp b/script/Timer.hpp new file mode 100644 index 0000000..0f21f11 --- /dev/null +++ b/script/Timer.hpp @@ -0,0 +1,10 @@ +#pragma once +#include "types.hpp" + +// this is named stopwatch in the decompiler but "timer" is probably a better name for it +struct TIMER +{ + SCR_INT Time; + SCR_BOOL IsInitialized; +}; +static_assert(sizeof(TIMER) == 2 * 8); \ No newline at end of file diff --git a/script/globals/GPBD_FM.hpp b/script/globals/GPBD_FM.hpp new file mode 100644 index 0000000..df9fb13 --- /dev/null +++ b/script/globals/GPBD_FM.hpp @@ -0,0 +1,658 @@ +#pragma once +#include "../types.hpp" +#include "../Timer.hpp" + +enum class eMissionDataFlags +{ + kMissionLaunched = 0, + kJobDownloaded = 2, + kStartingJob = 3, + kRequestingScript = 4, + kLaunchedScript = 6, // should be set if kMissionLaunched is set + kAutoStartOnProximity = 7, // used by gang attack + kNJVSQuickMatch = 8, + kVoteLiked = 10, + kVoteDisliked = 11, + kNoVote = 25 +}; // TODO + +enum class eTutorialBitset +{ + kInTutorialRace = 0, + kTutorialRaceActive = 2, + kShowCredits = 4, + kNeedFreeVehicle = 6 +}; + +enum class eGangCallServices +{ + kMugger = 0, + kMercenary = 1 +}; + +enum class eVehicleSelectionState +{ + NONE, + SELECTING, + SELECTED +}; + +enum class eStatState +{ + NONE, + LETHARGIC, + OUT_OF_SHAPE, + HEALTHY, + ATHLETE, + TRI_ATHLETE, + UNTRAINED, + SPRAY_AND_PRAY, + POLICE_TRAINING, + MILITARY_TRAINING, + DEAD_EYE, + FRAGILE, + WEAK, + AVERAGE, + TOUGH, + BODYBUILDER, + CLUMSY, + LOUD, + SNEAKY, + HUNTER, + NINJA, + DANGEROUS, + RC_PILOT, + COMMERCIAL_PILOT, + FIGHTER_PILOT, + ACE, + UNLICENSED, + SUNDAY_DRIVER, + COMMUTER, + STREET_RACER, + PRO_RACER, + NORMAL, + UNSTABLE, + DERANGED, + MANIAC, + PSYCHOPATH, + DRUNK +}; + +enum class ePropertyInteriorFlags +{ + kOwnerOfInterior = 0, + kVisitorOfInterior = 1, // mutually exclusive with above flag + kConcealWhenDead = 12, + kRenovatingProperty = 19, + kPreviewingDecor = 20, + kRenovatingClubhouse = 21, + kUsingYachtRmBath1 = 22, + kUsingYachtRmBath3 = 23, + kUsingYachtRmWeeBathroom = 25, + kGunLockerOpen = 27, + kOfficeSafeOpen = 28, + kOfficeAssistantMale = 29 +}; + +enum class eInteriorStyleFlags +{ + kGunLockerShowPumpShotgun = 0, + kGunLockerShowMicroSMG = 1, + kGunLockerShowC4 = 2, // proximity or sticky + kGunLockerShowGrenade = 3, + kGunLockerShowCombatMG = 4, + kGunLockerShowMarksmanRifle = 5, + kPurchasedSnacks = 6, + kPurchasedInteriorRenovations = 7, + kForceOfficeAssistantSpawn = 8, + kAssistantAnimationOver = 9, + kChangeInteriorDecorOfficeHelpShown = 11, + kChangeInteriorDecorApartmentHelpShown = 12, + kOwnsOfficeBedroom = 13, + kOwnsClubhouseBikeShop = 16, + kOwnsOfficeGunLocker = 17, + KOwnsClubhouseWalls = 18, // ??? + kOwnsClubhouseFurnishings = 19, + kOwnsClubhouseDecors = 20 +}; + +enum class eBusinessHubProductIndex +{ + CARGO, + WEAPONS, + COCAINE, + METH, + WEED, + FORGED_DOCUMENTS, + COUNTERFEIT_CASH +}; + +struct PLAYLIST_DATA +{ + PLAYER_INDEX Host; + SCR_INT Flags; + SCR_BOOL PAD_0002; + SCR_INT CurrentMission; + SCR_INT TotalMissions; + PLAYER_INDEX PAD_0006; +}; +static_assert(sizeof(PLAYLIST_DATA) == 6 * 8); + +struct MISSION_DATA +{ + SCR_INT PAD_0000; // unused + SCR_INT ScriptId; // TODO: add enum + SCR_INT InstanceId; + uint64_t PAD_0003[7]; // unused + SCR_VEC3 TriggerPosition; + uint64_t PAD_0013[3]; // unused + SCR_INT InstanceIdForPresence; + SCR_INT PAD_0017; // unused + SCR_BITSET Flags; +}; +static_assert(sizeof(MISSION_DATA) == 19 * 8); + +// local copy can be found at Global_2680247 +struct JOB_SETTINGS +{ + SCR_ARRAY Settings; // indices vary based on job type. take a look at func_8988 in fmmc_launcher if you wish to change them + SCR_INT NumPlayers; // verify + SCR_INT PAD_0033; + SCR_INT SpawnSimpleInteriorIndex; + SCR_INT PAD_0035; // unused + SCR_BOOL MatchmakingOpen; + SCR_INT ContentHash; +}; +static_assert(sizeof(JOB_SETTINGS) == 38 * 8); + +struct VEHICLE_SELECTION +{ + SCR_BOOL Active; + SCR_BOOL Active2; + PLAYER_INDEX PAD_0002; // set to host by fmmc but not read at all + SCR_HASH VehicleModel; + SCR_INT CreatorIndex; + alignas(8) eVehicleSelectionState State; + SCR_INT PrimaryColor; + Color3 CustomPrimaryColor; + Color3 CustomSecondaryColor; + PLAYER_INDEX Partner; // for rally races? + GAMER_HANDLE PartnerHandle; + SCR_INT PreferredRole; // target assault races + SCR_INT PAD_0028; // TODO + SCR_INT ControlType; // 1 = kb&m 2 = controller + SCR_INT BettingFlags; + SCR_INT Team; + SCR_INT Flags; + SCR_INT JoinedMembers; // bitset of joined transition members set by the host + SCR_INT AdversaryOutfitIndex; + alignas(8) eStatState StatState; // see func_9142 in fmmc_launcher, shown to other players + SCR_INT CashWager; // shown to other players... + uint64_t PAD_0037[2]; // TODO + SCR_INT PAD_0039; // TODO random integer between 1 and 11 +}; +static_assert(sizeof(VEHICLE_SELECTION) == 40 * 8); + +struct STRIKE_TEAM +{ + PLAYER_INDEX Target; + TIMER Cooldown; + SCR_BOOL CancelStrikeTeam; // read but not written to + SCR_INT Level; +}; +static_assert(sizeof(STRIKE_TEAM) == 5 * 8); + +struct PLAYER_STATS +{ + SCR_INT Team; + SCR_INT RP; + SCR_INT CrewRP; + SCR_INT WalletBalance; + SCR_INT HeistBonus; + SCR_INT GlobalRP; + SCR_INT Rank; + TEXT_LABEL_31 CrewTitle; + SCR_INT TotalRacesWon; + SCR_INT TotalRacesLost; + SCR_INT TimesFinishRaceAsTop3; + SCR_INT TimesFinishRaceLast; + SCR_INT TimesRaceBestLap; + SCR_INT TotalDeathmatchesWon; + SCR_INT TotalDeathmatchesLost; + SCR_INT TotalTeamDeathmatchesWon; + SCR_INT TotalTeamDeathmatchesLost; + SCR_INT Shots; + SCR_INT Hits; + SCR_FLOAT KdRatio; + SCR_FLOAT DropoutRate; + SCR_INT KillsOnPlayers; + SCR_INT DeathsByPlayers; + SCR_INT TotalFinishDeathmatchAsTop3; + SCR_INT TotalFinishDeathmatchLast; + SCR_INT DartsTotalWins; + SCR_INT DartsTotalMatches; + SCR_INT ArmwrestlingTotalWins; + SCR_INT ArmwrestlingTotalMatches; + SCR_INT TennisMatchesWon; + SCR_INT TennisMatchesLost; + SCR_INT BaseJumpWins; + SCR_INT BaseJumpLosses; + SCR_INT GolfWins; + SCR_INT GolfLosses; + SCR_INT ShootingRangeWins; + SCR_INT ShootingRangeLosses; + SCR_INT ShootingAbility; + SCR_INT MissionWins; + SCR_INT TotalMissionsPlayed; + SCR_INT SurvivalWins; + SCR_INT TotalSurvivalsPlayed; + SCR_INT PAD_0049; // TODO + SCR_INT MissionsCreated; + SCR_INT CommunicationRestrictions; + SCR_BOOL CanSpectate; + SCR_INT MostFavoriteStation; + SCR_INT ProstitutesFrequented; + SCR_INT LapDancesBought; + SCR_INT Money; + SCR_FLOAT WeaponAccuracy; + SCR_HASH FavoriteVehicle; + SCR_HASH FavoriteWeapon; +}; +static_assert(sizeof(PLAYER_STATS) == 60 * 8); + +struct EXEC_WAREHOUSE_INFO +{ + SCR_INT Index; + SCR_INT Stock; + SCR_INT PAD_0002; // unused +}; +static_assert(sizeof(EXEC_WAREHOUSE_INFO) == 3 * 8); + +struct IE_WAREHOUSE_DATA +{ + SCR_INT Index; + SCR_INT NumVehicles; + SCR_ARRAY Vehicles; + SCR_INT PAD_0043; // set to zero and not read + SCR_INT OwnedWarehouseVariation; +}; +static_assert(sizeof(IE_WAREHOUSE_DATA) == 45 * 8); + +struct FACTORY_INFO +{ + SCR_INT Index; + SCR_INT TotalProduct; + SCR_INT TotalSupplies; + SCR_INT TotalSupplies2; // TODO: what's the difference? + uint64_t PAD_0004; + SCR_INT EquipmentUpgrades; + SCR_BOOL Running; + SCR_BOOL SetupDone; + SCR_BOOL PAD_0008; + SCR_INT Research; // valid only for factory index 5 (bunker) + SCR_INT StaffState; + SCR_INT ProductValue; // untested + SCR_INT StaffAssignmentType; // valid only for factory index 5 (bunker) 0 = manufacturing, 1 = research, 2 = both +}; +static_assert(sizeof(FACTORY_INFO) == 13 * 8); + +struct HANGAR_DATA +{ + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT PAD_0002; // unused + SCR_INT TotalContraband; + SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either + SCR_BOOL SetupDone; +}; +static_assert(sizeof(HANGAR_DATA) == 6 * 8); + +// facility +struct DEFUNCT_BASE_DATA +{ + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT ObtainedAwards; + SCR_INT PAD_0004; // unused, a function tries to set it to something but is never called with the right parameters. it isn't read either + SCR_INT PAD_0005; + SCR_INT TotalContraband; // wat +}; +static_assert(sizeof(DEFUNCT_BASE_DATA) == 7 * 8); + +// nightclub +struct BUSINESS_HUB_DATA +{ + SCR_INT Index; + SCR_INT TotalContraband; // not read by the scripts + SCR_INT ProducingBusinesses; // bitset + SCR_INT ProducingFactories; // bitset + SCR_INT Upgrades; + SCR_INT PAD_0005; + SCR_INT PAD_0006; // not read by the scripts + SCR_INT SetupBitset; // includes owned DJs + SCR_ARRAY ProductStocks; // see eBusinessHubProductIndex + SCR_ARRAY PAD_0017; // have no clue what this is + SCR_ARRAY TotalSoldProduct; +}; +static_assert(sizeof(BUSINESS_HUB_DATA) == 43 * 8); + +// also the nightclub? strange +struct NIGHTCLUB_DATA +{ + SCR_INT Index; // same as BusinessHubData::Index + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT AccessSettings; // TODO: figure out how this works + SCR_FLOAT Popularity; // 0.0 to 1.0 + SCR_INT SafeCashValue; + SCR_INT EntryCost; // can be set to any arbitrary value + SCR_INT CroudVariation; + SCR_INT DanceAwardProgress; // "Gold Dancer trophy unlocked." + SCR_INT DanceAward2Progress; // "Gold Battler trophy unlocked." + TIMER DJMusicChangeTimer; +}; +static_assert(sizeof(NIGHTCLUB_DATA) == 12 * 8); + +struct ARENA_GARAGE_DATA +{ + SCR_INT Index; // always one for obvious reasons + SCR_INT OwnedGarageFloorLevel; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT InteriorTypeA; + SCR_INT InteriorTypeB; + SCR_INT SpectatingIndex; + SCR_INT SpectatingType; + SCR_INT PAD_0008; // unused +}; +static_assert(sizeof(ARENA_GARAGE_DATA) == 9 * 8); + +struct INSIDE_TRACK +{ + TEXT_LABEL_63 PlayerName; // real name leak when playing inside track + SCR_INT BetHorseID; + SCR_INT BetChips; +}; +static_assert(sizeof(INSIDE_TRACK) == 18 * 8); + +// casino penthouse +struct CASINO_APARTMENT_DATA +{ + SCR_INT Index; // always one for obvious reasons + SCR_INT PAD_0001; // unused + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + uint64_t PAD_0005[2]; + INSIDE_TRACK InsideTrack; +}; +static_assert(sizeof(CASINO_APARTMENT_DATA) == 24 * 8); + +struct ARCADE_DATA +{ + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT AppearanceBitset3; + SCR_INT SafeCashValue; + SCR_INT PAD_0005; // unused +}; +static_assert(sizeof(ARCADE_DATA) == 6 * 8); + +struct ARCADE_MACHINES +{ + SCR_INT OrderedMachinesBitset; + SCR_INT ArrivedMachinesBitset; +}; +static_assert(sizeof(ARCADE_MACHINES) == 2 * 8); + +struct SUBMARINE_DATA +{ + SCR_INT AppearanceBitset; + SCR_HASH Model; // not read by the scripts, always set to HASH("kosatka") + SCR_INT Color; // "PACKED_MP_INT_KOSATKA_COLOUR" + SCR_INT Flag; // "PACKED_MP_INT_KOSATKA_FLAG" + SCR_INT LastGuidedMissileUseTime; + SCR_INT PAD_0005; // unused +}; +static_assert(sizeof(SUBMARINE_DATA) == 6 * 8); + +struct AUTOSHOP_DATA +{ + SCR_INT Index; + SCR_INT AccessSetting; + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_INT PAD_0004; + SCR_ARRAY ModdingVehicles; // VEHICLE_INDEX, not NETWORK_INDEX +}; +static_assert(sizeof(AUTOSHOP_DATA) == 8 * 8); + +// LS car meet +struct CAR_CLUB_DATA +{ + SCR_INT Flags; + SCR_INT Reputation; + SCR_INT ReputationLevel; + SCR_INT TestTrackAccess; // unused? +}; +static_assert(sizeof(CAR_CLUB_DATA) == 4 * 8); + +// agency +struct FIXER_HQ_DATA +{ + SCR_INT Index; + SCR_INT AppearanceBitset; + SCR_INT SafeCashValue; +}; +static_assert(sizeof(FIXER_HQ_DATA) == 3 * 8); + +// eclipse blvd garage (currently unreleased) +struct MULTI_STOREY_GARAGE_DATA +{ + SCR_INT Index; // always one for obvious reasons + SCR_INT AppearanceBitset; + SCR_INT AppearanceBitset2; + SCR_ARRAY GarageTints; +}; +static_assert(sizeof(MULTI_STOREY_GARAGE_DATA) == 6 * 8); + +struct PROPERTY_DATA +{ + SCR_ARRAY PropertyIds; + SCR_BITSETFlags; // I really don't want to indent everything again + SCR_INT RingingPlayers; // bitset of players requesting entry into property + SCR_INT Index; // the value you pass to the send to apartment TSE + SCR_INT Instance; + SCR_INT ExteriorIndex; + PLAYER_INDEX ExteriorOwner; + SCR_ARRAY RingingPlayersState; // 0 = ringing, 1 = accepted, 2 = denied + GAMER_HANDLE OwnerHandle; // can be used to bypass RID spoofing when player is inside interior + SCR_ARRAY EclipseTheme; // not sure why this is an array of 30 yet + SCR_INT ApartmentType; // normal vs stilt vs eclipse + SCR_INT OwnerInstance; // same as Instance in most cases + SCR_ARRAY ExecutiveWarehouseInfos; + SCR_INT OfficeSafeMoneyMultiplier; + SCR_BITSET StyleFlags; + SCR_INT PAD_0134; // unused + SCR_INT AssistantGreetingChoice; + SCR_INT AssistantDialogBitset; + SCR_INT AssistantDialogBitset2; + SCR_INT LifetimeCargoMissionsComplete; // used for trophy type + SCR_INT CasinoChipsMultiplier; + SCR_INT AssistantDialogBitset3; + SCR_INT AssistantDialogBitset4; + SCR_INT AssistantDialogBitset5; + SCR_INT AssistantDialogBitset6; // do we REALLY need 6 bitsets for assistant dialog? + IE_WAREHOUSE_DATA IEWarehouseData; + SCR_INT Garage1DataBitset; + SCR_INT Garage2DataBitset; + SCR_INT Garage3DataBitset; + SCR_INT ModshopDataBitset; + SCR_ARRAY FactoryInfos; + SCR_INT TotalBunkerResearch; + SCR_INT CurrentBunkerResearchProgress; + SCR_INT BunkerDecorVariation; + SCR_INT PAD_0288; + SCR_INT MOCColor; // bitset for some reason + uint64_t PAD_0290[2]; // unused + SCR_INT GunShopFlags; + HANGAR_DATA HangarData; + SCR_INT PAD_0299; + DEFUNCT_BASE_DATA DefunctBaseData; + SCR_INT AvengerInteriorDecorFlags; // "PACKED_MP_INT_ARMORY_AIRCRAFT_INTERIOR_v0" + uint64_t PAD_0308[2]; + BUSINESS_HUB_DATA BusinessHubData; + NIGHTCLUB_DATA NightclubData; + SCR_INT PAD_0365; + SCR_INT TerrorbyteDesign; + SCR_INT PAD_0367; + SCR_INT AcidLabRadio; + SCR_INT TerrorbyteRadio; + SCR_INT NanoDroneCooldown; + PLAYER_INDEX HostOfInteriorScript; + ARENA_GARAGE_DATA ArenaGarageData; + SCR_INT ArcadeJukeboxStation; // for simple interior type 17 + SCR_INT JukeboxFavoritePlaylist; + SCR_INT ClubhouseBarCashAmount; + SCR_INT DefaultJukeboxStation; + SCR_INT FreakshopJukeboxStation; + SCR_INT PAD_0386; // TODO + SCR_HASH MOCModel; // used by the bunker script to detect exits with MOC + SCR_INT PAD_0388; // unused + SCR_HASH TerrorbyteModel; + SCR_ARRAY PAD_0390; // some property interior stuff + uint64_t PAD_0398[4]; + SCR_INT OfficeGarageModdingVehicleSlot; + SCR_INT CurrentOfficeGarageFloor; + CASINO_APARTMENT_DATA CasinoApartmentData; + ARCADE_DATA ArcadeData; + ARCADE_MACHINES ArcadeMachines; + SCR_ARRAY ArcadeMachineSlots; + SCR_INT PAD_0478; // TODO + SUBMARINE_DATA SubmarineData; + AUTOSHOP_DATA AutoShopData; + SCR_ARRAY AutoShopArcadeMachineSlots; + CAR_CLUB_DATA CarClubData; + FIXER_HQ_DATA FixerHQData; + SCR_INT PAD_0503; // not read by the scripts + VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ; + MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData; + SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled +}; +static_assert(sizeof(PROPERTY_DATA) == 512 * 8); + +struct BIKER_CONTRACTS +{ + SCR_ARRAY ActiveContractMissions; + SCR_INT SelectedContractMission; + SCR_BOOL Enabled; +}; +static_assert(sizeof(BIKER_CONTRACTS) == 7 * 8); + +struct NIGHTCLUB_SALE +{ + SCR_INT BuyerIndex; + SCR_INT NumSoldItems; + SCR_INT SaleAmount; + uint64_t PAD_0003[2]; +}; +static_assert(sizeof(NIGHTCLUB_SALE) == 5 * 8); + +struct ARENA_WAR_DATA +{ + SCR_INT PointsTier; + SCR_INT SkillLevel; + SCR_INT TrinketBitset; // MP_STAT_ARN_BS_TRINKET_SAVED +}; +static_assert(sizeof(ARENA_WAR_DATA) == 3 * 8); + +struct GPBD_FM_Entry +{ + SCR_INT CurrentActivity; + SCR_INT MissionScriptInstance; + SCR_INT PAD_0002; // TODO + SCR_INT NumFreeSpectatorSlots; + SCR_INT NumPlayersInTransition; // not really + SCR_INT NJVSVoteState; // voting screen shown after a mission ends + SCR_INT NJVSVoteContentBitset; + SCR_BOOL NJVSChoiceMade; + SCR_INT NJVSLeaveState; // network error or quit + SCR_INT JobPoints; // can be spoofed to change the "JP" value in the player list + PLAYER_INDEX NextHost; // transfer transition host when joining next job + PLAYLIST_DATA PlaylistData; + TEXT_LABEL_63 JobName; + SCR_ARRAY ActiveGunRange; // this should have really been an enum lol + MISSION_DATA MissionData; + uint64_t PAD_0055[2]; // unused + JOB_SETTINGS JobSettings; + SCR_INT FMMCLauncherState; + VEHICLE_SELECTION VehicleSelection; + SCR_INT JobStartCloudTime; // this is a struct but too lazy to create one + SCR_INT ContentHash; + SCR_BOOL PAD_0138; // unused + SCR_BITSET TutorialBitset; + SCR_BITSET GangCallRequestedServices; + PLAYER_INDEX GangCallTarget; // can be used to send muggers/hit squad + SCR_BITSET GangCallSentServices; + SCR_INT TutorialBitset2; + TEXT_LABEL_23 PlayingContentUsedId; + TEXT_LABEL_23 MatchId; + uint64_t PAD_0156[8]; // unused + TEXT_LABEL_63 DisplayJobName; // as shown in the playerlist? + STRIKE_TEAM StrikeTeam; + uint64_t PAD_0185[7]; // pad + SCR_INT FMMCState; + SCR_INT PAD_0193; // TODO + SCR_INT KillStreak; + SCR_INT NumSuicides; // deducts RP reward in missions + SCR_INT DeathmatchBounty; // "You have been deducted $~1~ for being idle for too long, and you now have a bounty placed on you." + SCR_BOOL CollectedBounty; + SCR_INT AliveDeathmatchPlayers; + SCR_INT WantedLevelFlags; + SCR_ARRAY PAD_0201; + SCR_INT HairdoShopIndex; + SCR_INT PAD_0204; + PLAYER_STATS PlayerStats; + SCR_INT PAD_265; + SCR_INT Mood; + PROPERTY_DATA PropertyData; + uint64_t PAD_0779[4]; // TODO + uint64_t PAD_0783[12]; // no clue what it does but it looks rather interesting + SCR_INT AssistedKillFlags; + NETWORK_INDEX UnkNetworkId; + SCR_BOOL SpawningUnkVehicle; + SCR_BOOL MeltdownComplete; // yes, the singleplayer mission "Meltdown" (michael4) + SCR_INT UNK_0799; + SCR_INT GangAttackTarget; // triggers unique dialog from some phone NPCs + SCR_INT ActivePVSlot; + PLAYER_INDEX PAD_0802; + SCR_INT PAD_0803; + SCR_ARRAY ActiveAmbientWeaponPickups; + SCR_ARRAY OfficeMapMarkers; + SCR_INT OfficeLargestMoneyThresholdIndex; + SCR_ARRAY EnabledOfficeCashPiles; + SCR_ARRAY EnabledClubhouseCashPiles; + BIKER_CONTRACTS BikerContracts; + SCR_INT CasinoWonBitset; // can be used to tamper with the casino PA system + uint64_t PAD_0829[2]; + SCR_BOOL CameraPositionOverriden; + SCR_VEC3 OverrideCameraPosition; + SCR_INT PAD_0835; + SCR_INT HeliRappelFlags; + SCR_INT PAD_0837; // some more aircraft flags + SCR_BOOL RespawningToPreviousCheckpoint; + NIGHTCLUB_SALE NightclubSale; + uint64_t PAD_844[11]; // unused, all of them + SCR_INT SeatingIndex; + ARENA_WAR_DATA ArenaWarData; + uint64_t PAD_0859[2]; + SCR_INT ApartmentEnterFlags; +}; +static_assert(sizeof(GPBD_FM_Entry) == 862 * 8); + +struct GPBD_FM +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GPBD_FM) == 27585 * 8); diff --git a/script/globals/GPBD_FM_3.hpp b/script/globals/GPBD_FM_3.hpp new file mode 100644 index 0000000..be0ac63 --- /dev/null +++ b/script/globals/GPBD_FM_3.hpp @@ -0,0 +1,365 @@ +#pragma once +#include "../types.hpp" +#include "../Timer.hpp" +#include "../HudColor.hpp" + +enum class eActivityType +{ + HeistPrep = 233, + Gunrunning = 180, + Sightseer = 142, + HeadHunter = 166, + BuySpecialCargo = 167, + SellSpecialCargo = 168, + DefendSpecialCargo = 169, + StealVehicle = 178, + ExportVehicle = 188, + Gunrunning2 = 225, + GunrunningSell = 226, + GunrunningDefend = 227, + BikerSell = 190, + BikerDefend = 191, + BusinessResupply = 192, + Survival = 3, + Darts = 14, + ArmWresling = 15, + GangAttack = 6, + PilotSchool = 122, + Golf = 11, + ShootingRange = 13, + Tennis = 12, + BaseJump = 8, + Deathmatch = 1, + ImpromptuDeathmatch = 5, + Mission = 0, + Race = 2, + ExecutiveDeathmatch = 148, + MarkedForDeath = 151, + PiracyPrevention = 152, + MostWanted = 153, + AssetRecovery = 157, + HostileTakeover = 159, + Point2Point = 162, + AmphibiousAssault = 216, + Velocity = 219, + GunsForHire = 185, + ByThePound = 182, + RippingItUp = 194, + RaceToPoint = 189, + HitAndRide = 193, + CriminalMischief = 205, + WeaponOfChoice = 186, + FragileGoods = 207, + Torched = 208, + Outrider = 209, + WheelieRider = 210, + POW = 183, + ExecutiveSearch = 199, + StandYourGround = 201, + AutoBuyout = 163, + DueDiligence = 160, + MarketManipulation = 154, + CourierService = 155, + Skydive = 267 +}; + +enum class eBossGoonFlags +{ + kOneOnOneDM = 4, + kJoinSuccess = 7, + kJoinFail = 8, + kSpectating = 24 +}; + +enum class eGoonInviteType +{ + DEBUG, + NEARBY, + FRIENDS, + CREW, + INDIVIDUAL, + LOOKING_FOR_WORK +}; + +enum class eBossVehicleState +{ + NONE, + SPAWNED, + DESTROYED = 3 +}; + +enum class eMCRole +{ + PROSPECT = -1, + VICE_PRESIDENT, + ROAD_CAPTAIN, + SERGEANT_IN_ARMS, + ENFORCER +}; + +enum class eClubhouseActivity +{ + NONE = -1, + DARTS, + ARM_WRESTLING +}; + +struct MP_SCRIPT_DATA +{ + SCR_INT Index; // this is an enum + uint64_t Args[15]; + SCR_INT InstanceId; + uint64_t MoreArgs[4]; +}; +static_assert(sizeof(MP_SCRIPT_DATA) == 21 * 8); + +struct MC_STYLE +{ + SCR_BOOL Enabled; + SCR_INT BossOutfitType; + SCR_INT GoonOutfitType; + SCR_ARRAY GoonOutfitIndices; // one outfit for each goon, size is 7 instead of 8 for some reason + SCR_ARRAY GoonOutfitIndicesOverride; + SCR_INT PAD_0019; + SCR_BOOL HeadgearEnabled; + SCR_BOOL EmblemEnabled; +}; +static_assert(sizeof(MC_STYLE) == 22 * 8); + +struct VEHICLE_EXPORT +{ + SCR_ARRAY SellingVehicleIndices; + SCR_INT PAD_0005; // this is set to zero in all export scripts and never read +}; +static_assert(sizeof(VEHICLE_EXPORT) == 6 * 8); + +struct HANGAR_CARGO +{ + SCR_INT PAD_0000; // unused? + SCR_ARRAY DeliverableTypes; + SCR_INT CargoType; +}; +static_assert(sizeof(HANGAR_CARGO) == 23 * 8); + +struct CASINO_HEIST_PREP +{ + SCR_INT PrepIndex; + SCR_INT SupportCrewMemberIndex; // only set on preps 1 through 3 + SCR_INT LoadoutIndex; // only set on prep 1 and 2 +}; +static_assert(sizeof(CASINO_HEIST_PREP) == 3 * 8); + +struct LEAVE_IN_HELI +{ + SCR_INT Flags; + PLAYER_INDEX Owner; + SCR_INT SeatIndex; +}; +static_assert(sizeof(LEAVE_IN_HELI) == 3 * 8); + +struct BOSS_GOON +{ + PLAYER_INDEX Boss; // leader of CEO/MC + SCR_INT TimeBecameBoss; + SCR_INT TimeBecameGoon; + SCR_INT LastPayTime; + SCR_BITSET Flags; + SCR_INT Flags2; // TODO + SCR_INT Flags3; // TODO + SCR_INT TotalBossGoonTime; + SCR_ARRAY BossGoonUUID; + SCR_ARRAY Goons; + SCR_INT GoonsRequestingJoin; // bitset + SCR_INT PayGrade; + SCR_INT InvitesByBosses; // bitset + SCR_INT TransitionBossPersistanceStage; + SCR_INT EndBeingGoonReason; + SCR_INT PAD_0025; // TODO + PLAYER_INDEX JoiningBoss; + alignas(8) eGoonInviteType JoinedInviteType; + SCR_INT NumBossDeathsSinceLastPay; + SCR_VEC3 PAD_0029; // TODO + alignas(8) eActivityType UnkActivity; + alignas(8) eActivityType CurrentActivity; + PLAYER_INDEX JoustTarget; + PLAYER_INDEX ExecutiveDeathmatchTarget; + MP_SCRIPT_DATA ActiveScript; + PLAYER_INDEX PAD_0057; + PLAYER_INDEX PAD_0058; + alignas(8) eBossVehicleState BossVehicleState; + SCR_INT BossVehicleSpawnState; + PLAYER_INDEX PlayerInsideBossVehicle; + SCR_HASH BossVehicleModel; + TIMER LastBossVehicleSpawnTimer; + TIMER BossVehicleInvincibleTimer; + SCR_VEC3 BossVehicleSpawnedPosition; + alignas(8) HudColor BossVehicleHudColor; + TEXT_LABEL_15 BossVehicleTextLabel; + SCR_INT BossVehicleNetId; + MC_STYLE MCStyle; + uint64_t PAD_0098[3]; // unused + SCR_INT FriendlyFireDisabledPlayers; + SCR_INT PiracyPreventionYachtIndex; // not used by the scripts + SCR_INT BossGoonMissionLaunchState; + SCR_INT ColorSlot; + TEXT_LABEL_63 MCName; + SCR_INT Language; // can be used to get the system language of player + SCR_INT SpawnableBossVehicles; + SCR_INT AutoBuyoutDeliveryLocationIndex; + SCR_INT AutoBuyoutDeliveryLocationSubIndex; + SCR_INT PAD_0125; // unused + SCR_ARRAY PAD_0126; // TODO + SCR_ARRAY ContrabandPositions; // positions of cargo used to notify players to destroy them when they get near + SCR_HASH ContrabandPickupModel; + PLAYER_INDEX StealingContrabandVehiclePlayerIndex; + SCR_INT PAD_0178; // TODO + SCR_HASH ContrabandPickupModel2; + SCR_BOOL DestroyedCargo; + SCR_INT VIPGameplayDisabledTimer; + SCR_INT SettingUpBusiness; + uint64_t PAD_0183[4]; // TODO some unknown contraband struct + VEHICLE_EXPORT VehicleExport; + uint64_t PAD_0193[12]; // TODO + SCR_ARRAY ActiveFreemodeEvents; // force thunder + uint64_t PAD_0212[22]; // I'm not even going to bother with this one + HANGAR_CARGO HangarCargo; + uint64_t PAD_0236[23]; // not going to bother with this one either + SCR_ARRAY CasinoDeliverables; + SCR_INT CasinoLimoDestination; + SCR_BOOL CasinoLimoActive; + SCR_BOOL CasinoLuxuryCarActive; + SCR_HASH CasinoLuxuryCarModel; + CASINO_HEIST_PREP CasinoHeistPrep; + SCR_INT CayoPrepIndex; + SCR_INT CompanySUVDestination; + SCR_BOOL CompanySUVActive; + SCR_ARRAY ContrabandIndices; // type of selling cargo + SCR_ARRAY VehicleExportIndices; // not sure what this is + SCR_INT VehicleExportMissionType; // valid range is 2000 to 2010, 2000 = 0, 2001 = 1 etc + SCR_ARRAY VehicleExportSellingIndices; + SCR_BOOL PAD_0337; // TODO + TEXT_LABEL_63 GangName; // CEO Name + TEXT_LABEL_63 ClubhouseName; // cut content? + SCR_INT SourcingContrabandType; + SCR_INT FragileGoodsMissionType; + SCR_INT SalvageMissionType; + SCR_INT DoomsdayPrepIndex; + SCR_INT VehicleExportIndex; // another one... + SCR_INT PAD_0375; // unused + SCR_INT BunkerSourceIndex; // check gb_gunrunning func_1540 + SCR_ARRAY BunkerCargoIndices; + uint64_t PAD_0386[5]; + uint64_t PAD_0391[2]; // unused + uint64_t PAD_0393[15]; // smuggler data + SCR_INT LastBossWorkTime; // seconds since epoch + uint64_t PAD_0409[19]; + SCR_BOOL IsMC; + alignas(8) eMCRole MCRole; // applies to goons only, boss is always the MC president + SCR_BOOL FormationFlyingAssist; + SCR_INT PAD_0431; // always set to zero and not read + SCR_BOOL MCFormationActive; + SCR_BOOL MCFormationHelpShown; + TIMER MCFormationHealthBonusTimer; + TIMER MCFormationLastHealthBonusTimer; + TIMER MCFormationBreakTimer; + SCR_INT PAD_0440; // unused + SCR_BOOL MCFormationAssist; + SCR_BOOL MCRidingStyleRelaxed; + SCR_FLOAT PAD_0443; // set from a tunable + SCR_FLOAT PAD_0444; // set from a tunable + uint64_t PAD_0445[16]; // somewhat unused, a few fields are accessed in the business battle script + SCR_INT ClothingValue; // total value of equipped clothing used by criminal damage + PLAYER_INDEX Adversary; // for common adversary calculations? + SCR_HASH ContrabandType; // unknown HASH_ENUM + SCR_INT HitAndRideGangType; + SCR_BOOL IsMC2; + SCR_INT BossGoonVersion; + SCR_INT MCTotalContributionPoints; + SCR_INT MCContributionPoints; + SCR_INT FavoriteBikeStyle; // not read by the scripts + SCR_INT GreatestFormationTimeIndex; + SCR_INT FormationTime; + SCR_BOOL RidingFavoriteMotorcycle; + SCR_INT ContrabandSellLocation; + SCR_INT BusinessBattleType; + SCR_INT PAD_0475; + SCR_INT NightclubMissionIndex; + SCR_INT NightclubDefendMissionIndex; + uint64_t PAD_0478[18]; // TODO + SCR_BOOL DoubleActionCacheLocationRevealed; +}; +static_assert(sizeof(BOSS_GOON) == 497 * 8); + +struct MC_STATS +{ + SCR_INT FormationTime0; + SCR_INT FormationTime1; + SCR_INT FormationTime2; + SCR_INT FormationTime3; + SCR_INT MembersMarkedForDeath; + SCR_INT MCKills; + SCR_INT MCDeaths; + SCR_INT RivalPresidentKills; + SCR_INT RivalCEOAndVIPKills; + SCR_INT MeleeKills; + SCR_INT ClubhouseContractsComplete; + SCR_INT ClubhouseContractEarnings; + SCR_INT ClubworkCompleted; + SCR_INT ClubChallengesCompleted; + SCR_INT MemberChallengesCompleted; +}; +static_assert(sizeof(MC_STATS) == 15 * 8); + + +struct GBPD_FM_3_Entry +{ + alignas(8) eActivityType CurrentActivity; // enum is outdated + SCR_INT Flags; // TODO + alignas(8) eActivityType CurrentFreemodeActivity; // subset of CurrentActivity + SCR_INT SeatingFlags; + SCR_VEC3 CurrentFreemodeActivityObjectivePosition; + SCR_INT VehiclesNearbyActivityObjective; // only used by challenges and checkpoints + SCR_BOOL PassiveMode; + SCR_BOOL TimeTrialActive; // verify + BOSS_GOON BossGoon; + uint64_t PAD_507[3]; // unused + SCR_INT ScriptEventReplayProtectionCounter; + TIMER CoronaForcedLaunchTimer; + LEAVE_IN_HELI LeaveInHeli; + SCR_INT OfficeDesktopFlags; // bit 0 -> login, bit 1 -> map + uint64_t PAD_514[8]; // some IE stuff, most of it is unused + SCR_INT IlluminatedClothingState; + SCR_INT MatchHistoryId1; // used for telemetry + SCR_INT MatchHistoryId2; + alignas(8) eClubhouseActivity ClubhouseActivity; + SCR_INT ClubhouseFont; + SCR_INT ClubhouseColor; + SCR_INT ClubhouseEmblem; + SCR_BOOL ClubhouseHideSignage; + uint64_t PAD_0533[2]; // facility exit + uint64_t PAD_0535[6]; // no clue what this is + MC_STATS MCStats; + uint64_t PAD_0556[29]; + SCR_HASH ForcedWeapon; + SCR_INT HangarCargoMissionLocationIndex; + SCR_VEC3 AvengerPosition; + SCR_VEC3 TerrorbytePosition; + SCR_VEC3 AcidLabPosition; + PLAYER_INDEX DeliveringExportVehicleOwner; + uint64_t PAD_0597[2]; // TODO + SCR_INT BountyAmount; // values above 10000 will prevent payout + PLAYER_INDEX BountyPlacedBy; + SCR_INT PAD_0601; // unused, set to -1 by business_battles_sell and never read + SCR_INT CurrentlyUsingArenaTurretIndex; // works similar to the vars found in GlobalPlayerBD + SCR_INT CurrentlyUsingArenaTurretActivatedTime; + SCR_INT CasinoStoryProgress; + SCR_INT CasinoFlowProgress; + SCR_ARRAY DailyObjectiveFlags; +}; +static_assert(sizeof(GBPD_FM_3_Entry) == 608 * 8); + +struct GPBD_FM_3 +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GPBD_FM_3) == 19457 * 8); \ No newline at end of file diff --git a/script/globals/GPBD_Kicking.hpp b/script/globals/GPBD_Kicking.hpp new file mode 100644 index 0000000..d926d33 --- /dev/null +++ b/script/globals/GPBD_Kicking.hpp @@ -0,0 +1,17 @@ +#pragma once +#include "../types.hpp" + +struct GPBD_KickingEntry +{ + SCR_ARRAY KickVotes; // players you are voting to kick (array of bool) + SCR_ARRAY KickWarningsShown; + SCR_BOOL WillBeKickedSoon; + SCR_ARRAY PlayersToBeKickedSoon; +}; +static_assert(sizeof(GPBD_KickingEntry) == 100 * 8); + +struct GPBD_Kicking +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GPBD_Kicking) == 3201 * 8); \ No newline at end of file diff --git a/script/globals/GPBD_MissionName.hpp b/script/globals/GPBD_MissionName.hpp new file mode 100644 index 0000000..22bb3f4 --- /dev/null +++ b/script/globals/GPBD_MissionName.hpp @@ -0,0 +1,8 @@ +#pragma once +#include "../types.hpp" + +struct GPBD_MissionName +{ + SCR_ARRAY MissionNames; +}; +static_assert(sizeof(GPBD_MissionName) == 513 * 8); \ No newline at end of file diff --git a/script/globals/GSBD_Kicking.hpp b/script/globals/GSBD_Kicking.hpp new file mode 100644 index 0000000..93d4367 --- /dev/null +++ b/script/globals/GSBD_Kicking.hpp @@ -0,0 +1,8 @@ +#pragma once +#include "../types.hpp" + +struct GSBD_Kicking +{ + SCR_ARRAY KickedPlayers; +}; +static_assert(sizeof(GSBD_Kicking) == 33 * 8); \ No newline at end of file diff --git a/script/globals/GSBD_PropertyInstances.hpp b/script/globals/GSBD_PropertyInstances.hpp new file mode 100644 index 0000000..1c44137 --- /dev/null +++ b/script/globals/GSBD_PropertyInstances.hpp @@ -0,0 +1,11 @@ +#pragma once +#include "../types.hpp" + +// this is why your apartment generally takes years to load +struct GSBD_PropertyInstances +{ + SCR_ARRAY PropertyOwners; + uint64_t PAD_0417[14]; // unused + SCR_ARRAY PropertyOwnerInstances; +}; +static_assert(sizeof(GSBD_PropertyInstances) == 464 * 8); \ No newline at end of file diff --git a/script/globals/GlobalPlayerBD.hpp b/script/globals/GlobalPlayerBD.hpp new file mode 100644 index 0000000..f4982f2 --- /dev/null +++ b/script/globals/GlobalPlayerBD.hpp @@ -0,0 +1,564 @@ +#pragma once +#include "../types.hpp" + +enum class eFreemodeState +{ + NONE = 0, + UNK_2 = 2, + RUNNING = 4, + CLOSING = 5, + UNK_10 = 10, + UNK_11 = 11 +}; + +enum class eMissionType +{ + NONE, + MISSION, + HEIST, + UNK_3, + ADVERSARY_MODE, + LAST_TEAM_STANDING, + CAPTURE, + HEIST_SETUP, + UNK_8, // FMMC_RSTAR_MCP + UNKNOWN // everything else +}; + +enum class eAnimationBitset +{ + kCashRainActive = 12, + kChampagneSprayActive = 13 +}; + +enum class eBlipFlags +{ + kVisibleOnCutscene = 1, + kFlashMinimapDisplay = 2, + kSkipTutorialSessionChecks = 5, + kHideOnMinimap = 6, // needs testing + kHideOnMinimapWhenInterior = 6, // needs testing + kHideOnMinimapWhenBigMapActive = 9, // needs testing + kDontUsePassiveBlip = 21, + kUseRampageBlip = 24, + kHideWhenFading = 25 +}; + +enum class ePlayerStateFlags +{ + kScreenFadingOut = 0, + kScreenFadedOut = 1, + kCinematicNewsChannelActive = 2, + kPlayerSwitchState1 = 5, + kPlayerSwitchState2 = 6, + kPlayerSwitchState3 = 7, + kPlayerSwitchState4 = 8, + kModshopActive = 9, + kModshopExitingVehicle = 10, + kPlayerInSCTV = 31 +}; + +enum class eActivityFlags +{ + kWatchingMovie = 0, + kInGangAttack = 1, + kImpromptuRace = 2, + kCrateDrop = 4, // tf is this? "~s~A plane is on its way to drop a Crate ~HUD_COLOUR_GREEN~~BLIP_CRATEDROP~ ~s~which contains useful equipment. Be the first to collect it." + kDeliveringSimeonVehicle = 6, + kInLapDance = 7, + kHoldUpTutorial = 8, + kJoyrider = 9, // uh what is this? + kCarModTutorial = 10, + kMissionLauncher = 11, // ??? + kLesterCutsceneActive = 12, + kTrevorCutsceneActive = 13, + kHeistIntro = 14, + kPlaneTakedown = 15, // not sure what this is + kDistractCops = 16, // "Great. Thank you for your help. Now some horrible criminals are in jail for a crime they did commit and it's all your fault!!" ??? + kDestroyVehicle = 17, // ??? + kPartakingInHotTarget = 18, + kPartakingInKillList = 19, + kTimeTrialStarted = 21, + kPartakingInCheckpoints = 22, + kPartakingInChallenge = 23, + kPennedInActive = 24, + kRCTimeTrialStarted = 25, + kPartakingInHotProperty = 27, + kPartakingInKingOfTheCastle = 29, + kPartakingInCriminalDamage = 30, + kLowriderIntro = 31 +}; + +enum class eGamerTagFlags +{ + kShowPackageCount = 13, + kFadeOutGamerTag = 17, + kGangCEO = 19, + kGangBiker = 20 +}; // TODO! + +enum class eOrbitalBitset +{ + kOrbitalCannonActive = 0, + kWatchingMovie = 1, // not a typo, the orbital cannon script needs to know if you are inside a movie theater for some strange reason + kCutsceneOrInterior = 2, + kTransactionPending = 3 +}; + +enum class eArcadeGameBitset +{ + kArcadeMachineActivated = 0, + kLoveMeterActivated = 1, + kLoveMeterAnimationGenderDecided = 2 +}; + +enum class eOutOfSightFlags +{ + kOutOfSightEnabled = 0, + kOutOfSightActive = 1, // this controls whether you appear on radar or not + kHelpDisplayed = 2, + kDamagedPlayerOutsideOrganization = 3 +}; + +enum class eSimpleInteriorIndex +{ + SIMPLE_INTERIOR_INVALID = -1, + SIMPLE_INTERIOR_WAREHOUSE_1, + SIMPLE_INTERIOR_WAREHOUSE_2, + SIMPLE_INTERIOR_WAREHOUSE_3, + SIMPLE_INTERIOR_WAREHOUSE_4, + SIMPLE_INTERIOR_WAREHOUSE_5, + SIMPLE_INTERIOR_WAREHOUSE_6, + SIMPLE_INTERIOR_WAREHOUSE_7, + SIMPLE_INTERIOR_WAREHOUSE_8, + SIMPLE_INTERIOR_WAREHOUSE_9, + SIMPLE_INTERIOR_WAREHOUSE_10, + SIMPLE_INTERIOR_WAREHOUSE_11, + SIMPLE_INTERIOR_WAREHOUSE_12, + SIMPLE_INTERIOR_WAREHOUSE_13, + SIMPLE_INTERIOR_WAREHOUSE_14, + SIMPLE_INTERIOR_WAREHOUSE_15, + SIMPLE_INTERIOR_WAREHOUSE_16, + SIMPLE_INTERIOR_WAREHOUSE_17, + SIMPLE_INTERIOR_WAREHOUSE_18, + SIMPLE_INTERIOR_WAREHOUSE_19, + SIMPLE_INTERIOR_WAREHOUSE_20, + SIMPLE_INTERIOR_WAREHOUSE_21, + SIMPLE_INTERIOR_WAREHOUSE_22, + SIMPLE_INTERIOR_FACTORY_METH_1, + SIMPLE_INTERIOR_FACTORY_WEED_1, + SIMPLE_INTERIOR_FACTORY_CRACK_1, + SIMPLE_INTERIOR_FACTORY_MONEY_1, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_1, + SIMPLE_INTERIOR_FACTORY_METH_2, + SIMPLE_INTERIOR_FACTORY_WEED_2, + SIMPLE_INTERIOR_FACTORY_CRACK_2, + SIMPLE_INTERIOR_FACTORY_MONEY_2, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_2, + SIMPLE_INTERIOR_FACTORY_METH_3, + SIMPLE_INTERIOR_FACTORY_WEED_3, + SIMPLE_INTERIOR_FACTORY_CRACK_3, + SIMPLE_INTERIOR_FACTORY_MONEY_3, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_3, + SIMPLE_INTERIOR_FACTORY_METH_4, + SIMPLE_INTERIOR_FACTORY_WEED_4, + SIMPLE_INTERIOR_FACTORY_CRACK_4, + SIMPLE_INTERIOR_FACTORY_MONEY_4, + SIMPLE_INTERIOR_FACTORY_DOCUMENTS_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_POLICE_STATION, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MC_CLUBHOUSE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ROCKFORD, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PILLBOX, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ALTA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_BURTON, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PALETO, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_GRAND_SENORA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_CHUMASH, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ROCKCLUB, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_3, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FARMHOUSE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HEIST_YACHT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_RECYCLING_PLANT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB, + SIMPLE_INTERIOR_IE_WAREHOUSE_1, + SIMPLE_INTERIOR_IE_WAREHOUSE_2, + SIMPLE_INTERIOR_IE_WAREHOUSE_3, + SIMPLE_INTERIOR_IE_WAREHOUSE_4, + SIMPLE_INTERIOR_IE_WAREHOUSE_5, + SIMPLE_INTERIOR_IE_WAREHOUSE_6, + SIMPLE_INTERIOR_IE_WAREHOUSE_7, + SIMPLE_INTERIOR_IE_WAREHOUSE_8, + SIMPLE_INTERIOR_IE_WAREHOUSE_9, + SIMPLE_INTERIOR_IE_WAREHOUSE_10, + SIMPLE_INTERIOR_BUNKER_1, + SIMPLE_INTERIOR_BUNKER_2, + SIMPLE_INTERIOR_BUNKER_3, + SIMPLE_INTERIOR_BUNKER_4, + SIMPLE_INTERIOR_BUNKER_5, + SIMPLE_INTERIOR_BUNKER_6, + SIMPLE_INTERIOR_BUNKER_7, + SIMPLE_INTERIOR_BUNKER_9, + SIMPLE_INTERIOR_BUNKER_10, + SIMPLE_INTERIOR_BUNKER_11, + SIMPLE_INTERIOR_BUNKER_12, + SIMPLE_INTERIOR_ARMORY_TRUCK_1, + SIMPLE_INTERIOR_CREATOR_TRAILER_1, + SIMPLE_INTERIOR_HANGAR_1, + SIMPLE_INTERIOR_HANGAR_2, + SIMPLE_INTERIOR_HANGAR_3, + SIMPLE_INTERIOR_HANGAR_4, + SIMPLE_INTERIOR_HANGAR_5, + SIMPLE_INTERIOR_ARMORY_AIRCRAFT_1, + SIMPLE_INTERIOR_DEFUNCT_BASE_1, + SIMPLE_INTERIOR_DEFUNCT_BASE_2, + SIMPLE_INTERIOR_DEFUNCT_BASE_3, + SIMPLE_INTERIOR_DEFUNCT_BASE_4, + SIMPLE_INTERIOR_DEFUNCT_BASE_6, + SIMPLE_INTERIOR_DEFUNCT_BASE_7, + SIMPLE_INTERIOR_DEFUNCT_BASE_8, + SIMPLE_INTERIOR_DEFUNCT_BASE_9, + SIMPLE_INTERIOR_DEFUNCT_BASE_10, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MEDIUM_GARAGE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LOWEND_STUDIO, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MIDEND_APARTMENT, + SIMPLE_INTERIOR_CREATOR_AIRCRAFT_1, + SIMPLE_INTERIOR_HUB_LA_MESA, + SIMPLE_INTERIOR_HUB_MISSION_ROW, + SIMPLE_INTERIOR_HUB_STRAWBERRY_WAREHOUSE, + SIMPLE_INTERIOR_HUB_WEST_VINEWOOD, + SIMPLE_INTERIOR_HUB_CYPRESS_FLATS, + SIMPLE_INTERIOR_HUB_LSIA_WAREHOUSE, + SIMPLE_INTERIOR_HUB_ELYSIAN_ISLAND, + SIMPLE_INTERIOR_HUB_DOWNTOWN_VINEWOOD, + SIMPLE_INTERIOR_HUB_DEL_PERRO_BUILDING, + SIMPLE_INTERIOR_HUB_VESPUCCI_CANALS, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_UNION_DEPOSITORY_CARPARK, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SIMEON_SHOWROOM, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ABATTOIR, + SIMPLE_INTERIOR_HACKER_TRUCK, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_JEWEL_STORE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LIFE_INVADER, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_DJ_YACHT, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MELANOMA_GARAGE, + SIMPLE_INTERIOR_ARENA_GARAGE_1, + SIMPLE_INTERIOR_CASINO, + SIMPLE_INTERIOR_CASINO_APT, + SIMPLE_INTERIOR_CASINO_VAL_GARAGE, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HAYES_AUTOS, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_METH_LAB, + SIMPLE_INTERIOR_ARCADE_PALETO_BAY, + SIMPLE_INTERIOR_ARCADE_GRAPESEED, + SIMPLE_INTERIOR_ARCADE_DAVIS, + SIMPLE_INTERIOR_ARCADE_WEST_VINEWOOD, + SIMPLE_INTERIOR_ARCADE_ROCKFORD_HILLS, + SIMPLE_INTERIOR_ARCADE_LA_MESA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FIB_BUILDING, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB_AND_TUNNEL, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FOUNDRY, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MAX_RENDA, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_2, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_3, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_4, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_5, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_6, + SIMPLE_INTERIOR_RESTRICTED_INTERIOR_OMEGA, + SIMPLE_INTERIOR_SOLOMONS_OFFICE, + SIMPLE_INTERIOR_CASINO_NIGHTCLUB, + SIMPLE_INTERIOR_SUBMARINE, + SIMPLE_INTERIOR_MUSIC_STUDIO, + SIMPLE_INTERIOR_AUTO_SHOP_LA_MESA, + SIMPLE_INTERIOR_AUTO_SHOP_STRAWBERRY, + SIMPLE_INTERIOR_AUTO_SHOP_BURTON, + SIMPLE_INTERIOR_AUTO_SHOP_RANCHO, + SIMPLE_INTERIOR_AUTO_SHOP_MISSION_ROW, + SIMPLE_INTERIOR_CAR_MEET, + SIMPLE_INTERIOR_FIXER_HQ_HAWICK, + SIMPLE_INTERIOR_FIXER_HQ_ROCKFORD, + SIMPLE_INTERIOR_FIXER_HQ_SEOUL, + SIMPLE_INTERIOR_FIXER_HQ_VESPUCCI, + SIMPLE_INTERIOR_ACID_LAB, + SIMPLE_INTERIOR_JUGGALO_HIDEOUT, + SIMPLE_INTERIOR_MULTISTOREY_GARAGE +}; + +struct JOB_STATS +{ + SCR_INT Wins; + SCR_INT Losses; + SCR_INT Kills; + SCR_INT Deaths; + SCR_INT PAD_0004; // unused +}; + +struct JOB_BET +{ + SCR_INT PAD_0000; // TODO + SCR_INT Amount; +}; + +struct MISSION_BETS +{ + SCR_INT Identifier; // a random integer between 100 and 10000000 + JOB_STATS Stats; + SCR_ARRAY PlacedBets; + SCR_BOOL CancelBetting; +}; +static_assert(sizeof(MISSION_BETS) == 72 * 8); + +struct PLAYER_BLIP +{ + SCR_INT PAD_0000; + SCR_INT NumPassengersInVehicle; + SCR_BITSET BlipFlags; + SCR_INT PlayerVehicleBlipType; // can be used to spoof your blip as a tank, oppressor etc + SCR_INT IdleDurationUntilBlipIsVisible; + SCR_INT BlipVisibleDuration; + SCR_INT MissionInteriorIndex; // can be used to spoof blip position + SCR_VEC3 MissionInteriorBlipLocation; + SCR_FLOAT MissionInteriorBlipRotation; + SCR_BOOL UnknownOverride; // can also be used to spoof position + SCR_VEC3 UnknownOverridePosition; +}; +static_assert(sizeof(PLAYER_BLIP) == 15 * 8); + +struct YACHT_APPEARANCE +{ + SCR_INT PAD_0000; // TODO + SCR_INT PAD_0001; + SCR_INT PAD_0002; + SCR_INT PAD_0003; + SCR_INT PAD_0004; + TEXT_LABEL_63 Name; + SCR_HASH NameHash; +}; +static_assert(sizeof(YACHT_APPEARANCE) == 22 * 8); + +struct YACHT_DATA +{ + SCR_BOOL HasYacht; + SCR_VEC3 Position; + SCR_INT TravelStage; + SCR_BOOL TravelInProgress; + SCR_ARRAY VehicleNetIds; // the heli and the boats that spawn near the yacht + SCR_INT YachtIndexPlayerIsIn; // owned or unowned + SCR_INT UnkYachtIndex; // TODO + SCR_INT YachtIndexPlayerIsInCouldBeDriving; + SCR_ARRAY NearbyYachts; + SCR_INT ClosestYachtIndex; + SCR_INT TurbulenceState; // controls random camera shakes when on a yacht + SCR_INT DefenseSetting; + YACHT_APPEARANCE Appearance; + SCR_BOOL RemoveClothingWhileInHotTub; + SCR_HASH MissionYachtOwnerHandleHash; // always -1 or NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) + SCR_BOOL SpawnAccess; // "spawn access"? + SCR_INT MissionYachtIndex; +}; +static_assert(sizeof(YACHT_DATA) == 49 * 8); + +struct SMPL_INTERIOR_DATA +{ + SCR_INT Flags; // TODO!!! + SCR_INT Flags2; + SCR_INT Flags3; + SCR_INT Flags4; + SCR_INT Flags5; + SCR_INT Flags6; + SCR_INT Flags7; + alignas(8) eSimpleInteriorIndex Index; + SCR_INT InstanceId; + SCR_INT AllowedGoons; + PLAYER_INDEX Owner; + PLAYER_INDEX VehicleOwner; + SCR_VEC3 SpecialVehicleSpawnPosition; + SCR_FLOAT SpecialVehicleSpawnHeading; + SCR_INT EnteringSimpleInteriorIndex; + SCR_INT SpecialVehicleSimpleInteriorIndex; // MOC, Terrorbyte etc + alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex; + alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex2; + SCR_VEC3 AvengerPosition; + SCR_VEC3 AvengerPosition2; // not sure how this is different from the field above + SCR_FLOAT AvengerHeading; + SCR_INT MissionSpawnSimpleInteriorIndex; + SCR_INT InteriorSubtype; // nightclub vs nightclub garage etc +}; +static_assert(sizeof(SMPL_INTERIOR_DATA) == 29 * 8); + +// yes there's a struct for leaving your clubhouse +struct LEAVE_CLUBHOUSE +{ + SCR_BOOL Active; + SCR_BOOL Active2; + SCR_INT Identifier; + SCR_INT ExitLocation; + SCR_ARRAY ParticipantHashes; +}; +static_assert(sizeof(LEAVE_CLUBHOUSE) == 37 * 8); + +struct ARCADE_GAME +{ + SCR_BITSET Bits; + SCR_INT CabinetIndex; + SCR_INT PAD_0002; // The only valid value is 0 so idk + SCR_INT CabinetGame; // TODO + SCR_INT GameStage; +}; +static_assert(sizeof(ARCADE_GAME) == 5 * 8); + +struct GlobalPlayerBDEntry +{ + alignas(8) eFreemodeState FreemodeState; + uint64_t PAD_0001[32]; // TODO + SCR_INT PlayersVisible; + SCR_INT PlayersTracked; + SCR_BITSET AnimationBitset; + SCR_INT NumSuccessfulHoldups; // resets every 12 minutes + SCR_INT PAD_0037; + SCR_INT PersonalVehicleNetId; + SCR_INT UnkVehicleNetId; + SCR_INT UnkVehicleNetId2; + SCR_ARRAY UnkVehicleNetIds; + SCR_INT DeliveryMechanicNetId; + SCR_INT DeliveryMechanicNetId2; + SCR_INT SpawningVehicleLiveryIndex; + SCR_INT SpawningVehiclePrimaryColor; + SCR_INT SpawningVehicleSecondaryColor; + SCR_INT AvengerNetId; + SCR_INT DeliveryMechanicNetId3; // wtf is this? + SCR_INT TerrorbyteNetId; // or is it the MOC? + SCR_INT SubmarineNetId; + SCR_INT DinghyNetId; + SCR_INT DeliveryMechanicNetId4; // another one... + SCR_INT AcidLabNetId; + SCR_INT DeliveryBikeNetId; // this is a guess, verify + SCR_BOOL PAD_0057; + uint64_t PAD_0058[15]; // confirmed these are not used by PC scripts + PLAYER_BLIP PlayerBlip; + SCR_BOOL NeedToPopulateSessionStartTime; // the session start time is unused + uint64_t PAD_0089[32]; // TODO + alignas(8) eMissionType MissionType; + SCR_BOOL SpawningVehicle; + uint64_t PAD_0123[3]; // confirmed these are not used by PC scripts + MISSION_BETS MissionBets; + SCR_BOOL RadarBlipVisibliltyMechanicEnabled; + SCR_BITSET PlayerStateFlags; + SCR_INT PlayerStateFlags2; // TODO + SCR_INT PlayerStateFlags3; // TODO + SCR_INT CarMeetModShopSlotPreTakeover; + PLAYER_INDEX CurrentCarMeetSlotOwnerIndex; // can be player or player's CEO/MC leader + SCR_INT CarMeetModShopSlotPostTakeover; + SCR_HASH CarMeetModdingVehicleModel; + PLAYER_INDEX CarMeetCurrentlySeatedVehicleOwner; + SCR_VEC3 PlayerPosition; // updates every two seconds, used by spectate + SCR_BOOL OffRadarActive; + SCR_BOOL PassengerOfVehicleWithOffRadarDriver; + SCR_BOOL GoonOfBossWithOffRadar; + SCR_BOOL RevealPlayersActive; + PLAYER_INDEX RemoteWantedLevelPlayer; // cut content but still works + SCR_INT RemoteWantedLevelAmount; + PLAYER_INDEX RemoteWantedLevelRemovePlayer; // doesn't work at all + SCR_INT UnkTeleportStage; + SCR_BITSET ActivityFlags; + SCR_INT NumReservedMissionPeds; + SCR_INT NumReservedMissionVehicles; + SCR_INT NumReservedMissionObjects; + SCR_INT TransitionSessionState; // TODO reverse enum + SCR_VEC3 TransitionReturningPosition; // TODO + TEXT_LABEL_23 TransitionContentIDToLaunch; + SCR_INT RespawnState; + SCR_INT LastRespawnTime; + SCR_BOOL CollisionLoaded; + SCR_BOOL CommitingSuicide; + SCR_BOOL RespawningInVehicleAsDriver; + SCR_BOOL RespawningInVehicle; + SCR_BOOL PAD_0238; // this value is set but not read at all by any PC scripts + SCR_BITSET GamerTagFlags; + SCR_BOOL IsMale; + SCR_INT ArmwrestlingLocationFlags; + SCR_INT PAD_0242; // TODO + SCR_BOOL GamerTagShowArrow; + SCR_BOOL CarWashInProgress; + INTERIOR_INDEX CurrentInteriorIndex; + SCR_INT PAD_0246; // TODO + SCR_INT CurrentStoreIndex; // the stores in the map which can be held up + SCR_BOOL ShopActive; // any shop + SCR_BOOL InTaxi; + SCR_INT Haircut; + SCR_INT PrimaryHairColor; + SCR_INT SecondaryHairColor; + SCR_INT FriendlyPlayers; // bitset of player team relgroups that obtain a Respect relationship with player + SCR_BOOL KilledByPlayer; // verify + SCR_BOOL InImpromptuDeathmatch; + SCR_VEC3 ImpromptuDeatmatchStartPosition; + SCR_INT PAD_0569; // not read by scripts, impromptu DM related + SCR_INT MissionLoseAnimType; + SCR_INT MissionWinAnimType; // verify + SCR_INT MissionCrewAnimType; + SCR_INT RallyRaceAnim; + SCR_BOOL IsRallyRace; + SCR_BOOL JustGetsPulledOutWhenElectrocuted; + SCR_INT HeistCutSelectionStage; // the only valid values seem to be 6 and 7 + SCR_BOOL IsBadsport; + SCR_FLOAT MentalState; + SCR_BOOL IsRockstarDev; // dev dlc check and not the CNetGamePlayer flag so can be used to detect YimMenu + SCR_BOOL ScreenFadedOut; + SCR_BOOL TimeTrialActive; + YACHT_DATA YachtData; + SMPL_INTERIOR_DATA SimpleInteriorData; + SCR_BOOL PAD_0350; // TODO + SCR_INT PAD_0351; // unused vehicle/interior stuff + SCR_BOOL ShowMOCBlip; + SCR_BOOL ShowAvengerBlip; + SCR_BOOL ShowTerrorbyteBlip; + SCR_BOOL ShowSubmarineBlip; + SCR_BOOL ShowDinghyBlip; + SCR_BOOL ShowDeliveryBikeBlip; + SCR_BOOL ShowAcidLabBlip; + LEAVE_CLUBHOUSE LeaveClubhouse; + SCR_INT Friends; // bitset of players that are friends + SCR_VEC3 InteriorVehiclePosition; // for terrorbyte and MOC, used to fake player blip position on map + SCR_FLOAT InteriorVehicleHeading; + SCR_VEC3 AcidLabPosition; // not read by the scripts + SCR_FLOAT AcidLabHeading; + SCR_INT VehicleTurretsActive; // bitset + SCR_ARRAY VehicleTurretsCameraPosition; + SCR_INT PAD_0416; // TODO + SCR_BOOL DozerDetected; // very shady stuff, anticheat? + SCR_ARRAY MissionTurretParticipants; + SCR_INT PAD_0425; // some seat index + SCR_INT MissionTurretSlot; + SCR_BITSET OrbitalBitset; + SCR_BOOL FacilityIntroCutsceneInProgress; + SCR_BOOL FacilityIntroCutsceneStarted; // like above but is enabled 2 stages earlier + SCR_BOOL PAD_0430; // todo + SCR_BOOL BeingSolicitedByProstitute; // why tf is this used by the orbital cannon? + SCR_VEC3 DronePosition; // updates every second + SCR_FLOAT DroneHeading; + SCR_INT OrbitalBitset2; // ugh + SCR_INT CurrentlyUsingArenaTrapIndex; + SCR_INT CurrentlyUsingArenaTrapActivatedTime; + ARCADE_GAME ArcadeGame; + SCR_INT DancePartner; + SCR_INT PAD_0445; + SCR_INT BeachPartyFlags; + uint64_t PAD_0477[10]; // I don't think we'll ever be able to figure out what this does + SCR_INT ThreeCardPokerStyle; + SCR_INT BlackjackStyle; + SCR_BITSET OutOfSightFlags; + SCR_VEC3 OutOfSightArea; + SCR_INT AmmunationWeaponPartFlags; + PLAYER_INDEX LastKilledBy; + SCR_BOOL CanSpawnGunVan; +}; +static_assert(sizeof(GlobalPlayerBDEntry) == 466 * 8); + +struct GlobalPlayerBD +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GlobalPlayerBD) == 14913 * 8); \ No newline at end of file diff --git a/script/globals/g_AMC_playerBD.hpp b/script/globals/g_AMC_playerBD.hpp new file mode 100644 index 0000000..27912ad --- /dev/null +++ b/script/globals/g_AMC_playerBD.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "../types.hpp" +#include "../Timer.hpp" + +struct g_AMC_playerBD_Entry +{ + SCR_ARRAY UsedContactServicesTimer; // only index 2 (mugger) is actually used by the scripts. the rest is just a waste of bandwidth + SCR_ARRAY ContactServiceCooldowns; // same as above +}; +static_assert(sizeof(g_AMC_playerBD_Entry) == 239 * 8); + +struct g_AMC_playerBD +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(g_AMC_playerBD) == 7649 * 8); \ No newline at end of file diff --git a/script/scrVector.hpp b/script/scrVector.hpp new file mode 100644 index 0000000..8301c4d --- /dev/null +++ b/script/scrVector.hpp @@ -0,0 +1,93 @@ +#pragma once +#include "../rage/vector.hpp" + +namespace rage +{ + class scrVector + { + public: + scrVector() = default; + + scrVector(rage::fvector3 vec) : + x(vec.x), y(vec.y), z(vec.z) + { + } + + scrVector(float x, float y, float z) : + x(x), y(y), z(z) + { + } + + scrVector operator+(const scrVector& other) + { + scrVector vec; + vec.x = this->x + other.x; + vec.y = this->y + other.y; + vec.z = this->z + other.z; + return vec; + } + + scrVector operator-(const scrVector& other) + { + scrVector vec; + vec.x = this->x - other.x; + vec.y = this->y - other.y; + vec.z = this->z - other.z; + return vec; + } + + scrVector operator*(const scrVector& other) + { + scrVector vec; + vec.x = this->x * other.x; + vec.y = this->y * other.y; + vec.z = this->z * other.z; + return vec; + } + + scrVector operator*(const float& other) + { + scrVector vec; + vec.x = this->x * other; + vec.y = this->y * other; + vec.z = this->z * other; + return vec; + } + + alignas(8) float x{}; + alignas(8) float y{}; + alignas(8) float z{}; + }; +} + +class Vector2 final +{ +public: + Vector2() = default; + + Vector2(float x, float y) + : x(x), y(y) + { + } + +public: + alignas(8) float x; + alignas(8) float y; +}; + +class Vector4 final +{ +public: + Vector4() = default; + + Vector4(float x, float y, float z, float w) + : x(x), y(y), z(z), w(w) + { + } + +public: + alignas(8) float x; + alignas(8) float y; + alignas(8) float z; + alignas(8) float w; +}; diff --git a/script/types.hpp b/script/types.hpp new file mode 100644 index 0000000..d04b8f5 --- /dev/null +++ b/script/types.hpp @@ -0,0 +1,102 @@ +#pragma once +#include +#include +#include "scrVector.hpp" + +#ifndef BOOL +#define BOOL int +#endif + +using Void = void; +using Any = int; +using Hash = std::uint32_t; +using Entity = std::int32_t; +using Player = std::int32_t; +using FireId = std::int32_t; +using Interior = std::int32_t; +using Ped = Entity; +using Vehicle = Entity; +using Cam = std::int32_t; +using Object = Entity; +using Pickup = Object; +using Blip = std::int32_t; +using Camera = Entity; +using ScrHandle = Entity; +using Vector3 = rage::scrVector; + +#define PLAYER_INDEX alignas(8) Player +#define ENTITY_INDEX alignas(8) Entity +#define PED_INDEX alignas(8) Ped +#define VEHICLE_INDEX alignas(8) Vehicle +#define INTERIOR_INDEX alignas(8) Interior +#define NETWORK_INDEX alignas(8) int + +#define SCR_HASH alignas(8) Hash +#define SCR_INT alignas(8) int +#define SCR_BOOL alignas(8) BOOL +#define SCR_FLOAT alignas(8) float +#define SCR_VEC3 Vector3 + +template +struct SCR_TEXT_LABEL +{ + alignas(8) char Data[SIZE]; +private: + alignas(8) char _PAD[SIZE]; +public: + operator char* () { return Data; } +}; + +#define TEXT_LABEL_15 SCR_TEXT_LABEL<16> +#define TEXT_LABEL_23 SCR_TEXT_LABEL<24> +#define TEXT_LABEL_31 SCR_TEXT_LABEL<32> +#define TEXT_LABEL_63 SCR_TEXT_LABEL<64> + +template +struct SCR_ARRAY +{ + SCR_INT Size; + alignas(8) T Data[SIZE]; + + T& operator [](int index) + { + return Data[index]; + } +}; + +template +struct SCR_BITSET +{ + alignas(8) int Value; + + bool IsSet(T val) + { + return Value & (1 << (int)val); + } + + void Set(T val) + { + Value |= (1 << (int)val); + } + + void Clear(T val) + { + Value &= ~(1 << (int)val); + } +}; + +struct Color3 +{ + SCR_INT R; + SCR_INT G; + SCR_INT B; +}; +static_assert(sizeof(Color3) == 3 * 8); + +// serialized bitbuffer data of rage::rlGamerHandle + some padding for last gen compatibility +struct GAMER_HANDLE +{ +private: + uint64_t Data[13]; +}; +static_assert(sizeof(GAMER_HANDLE) == 13 * 8); \ No newline at end of file