diff --git a/src/types/script/HudColor.hpp b/src/types/script/HudColor.hpp new file mode 100644 index 0000000..b0852ca --- /dev/null +++ b/src/types/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/src/types/script/MPScriptData.hpp b/src/types/script/MPScriptData.hpp new file mode 100644 index 0000000..f5a9bfc --- /dev/null +++ b/src/types/script/MPScriptData.hpp @@ -0,0 +1,11 @@ +#pragma once +#include "types.hpp" + +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); \ No newline at end of file diff --git a/src/types/script/Timer.hpp b/src/types/script/Timer.hpp new file mode 100644 index 0000000..4e2b2b3 --- /dev/null +++ b/src/types/script/Timer.hpp @@ -0,0 +1,9 @@ +#pragma once +#include "types.hpp" + +struct TIMER +{ + SCR_INT Time; + SCR_BOOL IsInitialized; +}; +static_assert(sizeof(TIMER) == 2 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GPBD_FM.hpp b/src/types/script/globals/GPBD_FM.hpp new file mode 100644 index 0000000..3029adb --- /dev/null +++ b/src/types/script/globals/GPBD_FM.hpp @@ -0,0 +1,695 @@ +#pragma once +#include "../MPScriptData.hpp" +#include "../Timer.hpp" +#include "../types.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); + +// 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; + 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 +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 SALVAGE_YARD_DATA +{ + SCR_INT Index; + SCR_INT PAD_0001; + SCR_INT AppearanceBitset; + SCR_INT TowTruckColor; + SCR_INT TowTruckType; // TODO + SCR_INT VehicleRobVehicleIndex; + SCR_INT TotalEarnings; +}; +static_assert(sizeof(SALVAGE_YARD_DATA) == 7 * 8); + +struct BAIL_SHOP_DATA +{ + SCR_INT Index; + uint64_t PAD_0001[11]; // a field was removed in b3407 +}; +static_assert(sizeof(BAIL_SHOP_DATA) == 12 * 8); + +struct HACKER_DEN_DATA +{ + SCR_INT Index; // always one for obvious reasons + SCR_INT Flags; + SCR_INT SafeCashValue; +}; +static_assert(sizeof(HACKER_DEN_DATA) == 3 * 8); + +struct FIELD_HANGAR_DATA +{ + SCR_INT Index; + SCR_INT Flags; +}; +static_assert(sizeof(FIELD_HANGAR_DATA) == 2 * 8); + +#define NUM_PROPERTY_INTERIORS \ + 33 // (30 -> 31) b3095 \ + // (31 -> 32) b3258 \ + // (32 -> 33) b3407 + +struct PROPERTY_DATA +{ + SCR_ARRAY PropertyIds; + SCR_BITSET Flags; // 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; + 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 MOCBitset; + 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[3]; + 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; // @405 as of 1.67 + ARCADE_DATA ArcadeData; + ARCADE_MACHINES ArcadeMachines; + SCR_ARRAY ArcadeMachineSlots; + SCR_INT PAD_0478; // TODO + SUBMARINE_DATA SubmarineData; + AUTOSHOP_DATA AutoShopData; + SALVAGE_YARD_DATA SalvageYardData; + SCR_ARRAY AutoShopArcadeMachineSlots; + CAR_CLUB_DATA CarClubData; + FIXER_HQ_DATA FixerHQData; + SCR_INT PAD_0503; // not read by the scripts + SCR_INT PAD_0504; + VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ; + MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData; // @507 as of 1.67 + SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled + SCR_INT VinewoodGarageBits; // added b812g9, 0 seems to indicate a cutscene + BAIL_SHOP_DATA BailShopData; + HACKER_DEN_DATA HackerDenData; + FIELD_HANGAR_DATA FieldHangarData; +}; +static_assert(sizeof(PROPERTY_DATA) == 545 * 8); + +struct BIKER_CONTRACTS +{ + SCR_ARRAY ActiveContractMissions; + SCR_INT SelectedContractMission; + SCR_BOOL Enabled; +}; +static_assert(sizeof(BIKER_CONTRACTS) == 7 * 8); + +// rewritten b811g9 to integrate GTA+ stuff +struct NIGHTCLUB_SALE +{ + SCR_INT BuyerIndex; // 0 + SCR_INT NumSoldItems; // 1 + SCR_INT SaleAmount; // 2 + SCR_INT SaleAmountWithMembershipModifiers; // 3 + SCR_INT TotalSaleAmountWithMembershipModifers; // 4 + SCR_INT TotalSaleAmount; // 5 + SCR_INT UnkSaleAmount; // 6 some kind of partial sum over certain goods, never read + SCR_INT BuyerIndex2; // 7 min(BuyerIndex, 3) +}; +static_assert(sizeof(NIGHTCLUB_SALE) == 8 * 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 + MP_SCRIPT_DATA MissionScriptData; + SCR_BOOL PAD_0057; // added b3258, some mission thing + 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; // @267 as of b3095 + 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 SpectatingPlayer; + SCR_INT PAD_0803; + SCR_ARRAY ActiveAmbientWeaponPickups; // size 2 -> 3 b3095 + 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; // @874 as of b812g9 + SCR_INT SeatingIndex; + ARENA_WAR_DATA ArenaWarData; // @883 as of b812g9 + uint64_t PAD_0861[2]; + SCR_INT ApartmentEnterFlags; + SCR_VEC3 AvengerMissionStartPosition; +}; +static_assert(sizeof(GPBD_FM_Entry) == 892 * 8); + +struct GPBD_FM +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GPBD_FM) == 28545 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GPBD_FM_3.hpp b/src/types/script/globals/GPBD_FM_3.hpp new file mode 100644 index 0000000..efd2225 --- /dev/null +++ b/src/types/script/globals/GPBD_FM_3.hpp @@ -0,0 +1,357 @@ +#pragma once +#include "../HudColor.hpp" +#include "../MPScriptData.hpp" +#include "../Timer.hpp" +#include "../types.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 MC_STYLE +{ + SCR_BOOL Enabled; + SCR_INT BossOutfitType; + SCR_INT GoonOutfitType; + SCR_ARRAY GoonOutfitIndices; // one outfit for each goon + 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; // @181 as of 1.67 + 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, size 7 -> 8 b3258 + // 8 -> 9 b3407 + 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) == 500 * 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; // @607 as of 1.67 +}; +static_assert(sizeof(GBPD_FM_3_Entry) == 611 * 8); + +struct GPBD_FM_3 +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GPBD_FM_3) == 19553 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GPBD_Kicking.hpp b/src/types/script/globals/GPBD_Kicking.hpp new file mode 100644 index 0000000..86a1c56 --- /dev/null +++ b/src/types/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/src/types/script/globals/GPBD_MissionName.hpp b/src/types/script/globals/GPBD_MissionName.hpp new file mode 100644 index 0000000..954a71f --- /dev/null +++ b/src/types/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/src/types/script/globals/GSBD.hpp b/src/types/script/globals/GSBD.hpp new file mode 100644 index 0000000..88b0361 --- /dev/null +++ b/src/types/script/globals/GSBD.hpp @@ -0,0 +1,95 @@ +#pragma once +#include "../types.hpp" +#include "GlobalPlayerBD.hpp" + +struct IMPOUND_VEHICLE_INFO +{ + SCR_INT ImpoundId; + SCR_BOOL OccupiedCheckDone; + SCR_INT EntityAreaHandle; + SCR_INT TimeCreated; +}; +static_assert(sizeof(IMPOUND_VEHICLE_INFO) == 4 * 8); + +struct CEO_COLOR +{ + PLAYER_INDEX Owner; + SCR_INT Color; +}; +static_assert(sizeof(CEO_COLOR) == 2 * 8); + +// I don't think this class has anything to do with ceo colors at all +struct CEO_COLORS +{ + SCR_ARRAY CeoColorIndices; + SCR_ARRAY CeoColorIndices2; + SCR_ARRAY CeoColors; + SCR_INT PAD_0065; + uint64_t PAD_0066[19]; + SCR_INT PAD_0085; // added b3095 ("Press ~INPUT_CONTEXT~ to contact Jamal and begin stealing bolt cutters for The Cargo Ship Robbery" mission variation) +}; +static_assert(sizeof(CEO_COLORS) == 86 * 8); + +struct SMPL_INTERIOR_DATA_SERVER +{ + SCR_INT PAD_0000; // unused + SCR_ARRAY PlayerInteriorInstances; + SCR_ARRAY PlayerInteriorIds; // used solely for telemetry + SCR_INT PlayerInteriorCreationRequestBitset; + SCR_ARRAY PlayerOwnerBitset; + SCR_INT PlayerInteriorRemovalRequestBitset; + SCR_ARRAY PlayerInteriorCreationTimes; + SCR_ARRAY PlayerInteriorSimpleInteriorTypes; + SCR_ARRAY PlayerInteriorIsOwnerless; + SCR_ARRAY PlayerInteriorOwners; +}; +static_assert(sizeof(SMPL_INTERIOR_DATA_SERVER) == 234 * 8); + +struct LEAVE_CLUBHOUSE_SERVER +{ + SCR_ARRAY Identifiers; + SCR_ARRAY ExitLocations; + SCR_ARRAY ExitLocationSlots; +}; +static_assert(sizeof(LEAVE_CLUBHOUSE_SERVER) == 99 * 8); + +struct IE_DELIVERY_INFO +{ + PLAYER_INDEX Player_; + SCR_HASH VehicleModel; + PLAYER_INDEX ContrabandOwner; + SCR_INT TimeCreated; + SCR_BOOL PAD_0004; +}; +static_assert(sizeof(IE_DELIVERY_INFO) == 5 * 8); + +struct GSBD +{ + alignas(8) eFreemodeState FreemodeState; + SCR_INT SessionToken; // time when freemode had started for the script host + SCR_ARRAY ImpoundVehicleInfos; + SCR_ARRAY SpawnPositions; + SCR_ARRAY SpawnPositionCreationTimes; + SCR_ARRAY SpawnPositionsValid; + SCR_ARRAY PAD_0294; + SCR_ARRAY SpawnPositionTokens; + SCR_INT SpawnPositionCounter; + SCR_ARRAY RespawnVehicles; + SCR_ARRAY RespawnVehicleSeats; + SCR_ARRAY MorsMutualSpawnSlots; + SCR_INT MorsMutualSpawnPlayersBitset; + uint64_t PAD_0461[353]; // TODO + SCR_BOOL CopTimerOn; // cut CnC content + SCR_BOOL CrookTimerOn; + SCR_BOOL PAD_0816; // always set to FALSE + SCR_INT PAD_0817; // unused + CEO_COLORS CeoColors; + SMPL_INTERIOR_DATA_SERVER SimpleInteriorData; + LEAVE_CLUBHOUSE_SERVER LeaveClubhouse; + SCR_ARRAY IEDeliveryInfos; + SCR_INT PAD_1397; + NETWORK_INDEX IAATurretCameraVehicleId; // used by DDH act 1 + uint64_t PAD_1399[97]; + SCR_INT CayoPericoStrandedAnimalChoice; +}; +static_assert(sizeof(GSBD) == 1498 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GSBD_BlockB.hpp b/src/types/script/globals/GSBD_BlockB.hpp new file mode 100644 index 0000000..51a92f5 --- /dev/null +++ b/src/types/script/globals/GSBD_BlockB.hpp @@ -0,0 +1,96 @@ +#pragma once +#include "../types.hpp" + + +enum class eDeliverableState +{ + INVALID = -1, + INITIAL, + DELIVERED +}; + +struct PLAYER_MISSION_INFO +{ + SCR_INT State; + SCR_INT Index; // GSBD_MissionRequest index +}; +static_assert(sizeof(PLAYER_MISSION_INFO) == 2 * 8); + +struct CRATE_DROP +{ + SCR_INT PAD_0000; // unused + SCR_BOOL EnableCrateDrops; // tries to trigger strange last gen stuff unsuccessfully + uint64_t PAD_0003[2]; // unused +}; +static_assert(sizeof(CRATE_DROP) == 4 * 8); + +struct DELIVERABLE_ID +{ + PLAYER_INDEX Owner; + SCR_INT Id; // "FMDeliverableID" +}; +static_assert(sizeof(DELIVERABLE_ID) == 2 * 8); + +struct DELIVERABLE_SCRIPT_INFO +{ + SCR_HASH Hash_; + uint64_t PAD_0001[2]; // unused +}; +static_assert(sizeof(DELIVERABLE_SCRIPT_INFO) == 3 * 8); + +struct UNK_0962 +{ + PLAYER_INDEX PAD_0000; + SCR_ARRAY PAD_0001; + SCR_ARRAY PAD_0020; +}; +static_assert(sizeof(UNK_0962) == 75 * 8); + +struct DELIVERABLE +{ + alignas(8) eDeliverableState State; + DELIVERABLE_ID DeliverableId; + SCR_INT Type; + SCR_INT PAD_0004; // this is always set to zero + SCR_ARRAY DroppedOffLocations; // "activeDropOff is not the same as sctiptDropOff" + DELIVERABLE_SCRIPT_INFO ScriptInfo; + SCR_INT NumDropOffs; +}; +static_assert(sizeof(DELIVERABLE) == 15 * 8); + +// "FREEMODE_DELIVERY_SERVER_ADD_DELIVERABLE_ID" "_FREEMODE_DELIVERY_MAINTAIN_SERVER" +struct FREEMODE_DELIVERY +{ + SCR_BOOL Initialized; + SCR_ARRAY Deliverables; + SCR_ARRAY PAD_0962; // TODO +}; +static_assert(sizeof(FREEMODE_DELIVERY) == 1713 * 8); + +struct GLOBAL_CLUB_INFO +{ + uint64_t PAD_0000[16]; +}; +static_assert(sizeof(GLOBAL_CLUB_INFO) == 16 * 8); + +struct GSBD_BlockB +{ + SCR_INT MissionLauncherInitializedBitset; + PLAYER_INDEX ScriptHost; + SCR_INT PAD_0002; + SCR_BOOL PAD_0003; // forces a team update thingy + SCR_ARRAY PlayerMissionInfos; + SCR_INT HostMigrationCounter; + uint64_t PAD_0080[14]; // unused + CRATE_DROP CrateDrop; + uint64_t PAD_0088[6]; // unused + uint64_t PAD_0094[33]; // ??? + uint64_t PAD_0127[65]; // even more strange stuff (cut content?) + SCR_ARRAY TurretCooldownTimers; + FREEMODE_DELIVERY FreemodeDelivery; + SCR_ARRAY GlobalClubInfos; + SCR_ARRAY CarMeetModShopSlotIndices; + SCR_ARRAY CarMeetModShopOccupiedGoons; + SCR_ARRAY, 32> CarMeetModShopOccupiedVehicleSlots; +}; +static_assert(sizeof(GSBD_BlockB) == 2156 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GSBD_FM.hpp b/src/types/script/globals/GSBD_FM.hpp new file mode 100644 index 0000000..2af73c5 --- /dev/null +++ b/src/types/script/globals/GSBD_FM.hpp @@ -0,0 +1,67 @@ +#pragma once +#include "../types.hpp" + +struct PLAYER_BOUNTY +{ + SCR_BOOL HasBounty; + SCR_INT BountyAmount; + SCR_INT PAD_0002; // unused +}; +static_assert(sizeof(PLAYER_BOUNTY) == 3 * 8); + +struct ACTIVE_CONTACT_SERVICE +{ + SCR_INT Id; + PLAYER_INDEX Target; + SCR_BOOL Bounty; // unknown usage + SCR_INT Flags; +}; +static_assert(sizeof(ACTIVE_CONTACT_SERVICE) == 4 * 8); + +struct WEAPON_PICKUPS +{ + SCR_INT LastUnkWeaponPickupTime; + SCR_INT LastMeleeWeaponPickupTime; + SCR_INT LastProjectilePickupTime; + SCR_INT LastGunPickupTime; + SCR_ARRAY Indices; // size increased in b3095 (62 -> 95) + // and in b3407 (95 -> 96) + SCR_ARRAY Owners; + SCR_INT SpawnCounter; + SCR_INT AmmoCount; +}; +static_assert(sizeof(WEAPON_PICKUPS) == 200 * 8); + +struct BIKER_CONTRACTS_SERVER +{ + SCR_ARRAY ActiveContracts; + SCR_ARRAY ContractCompleteCount; + SCR_INT CompletedContractBitset; + SCR_INT LastContractRefreshTime; +}; +static_assert(sizeof(BIKER_CONTRACTS_SERVER) == 10 * 8); + +struct GSBD_FM +{ + SCR_ARRAY ModelSwapBits; + SCR_INT PAD_0003; // unused + SCR_ARRAY PlayerBounties; + uint64_t PAD_0101[5]; // unused + SCR_ARRAY MuggingPlayers; // 0 = mugger, 1 = merryweather mercs + SCR_ARRAY MuggedPlayers; + uint64_t PAD_0112[4]; // unused + SCR_ARRAY PAD_0116; // TODO b3407 (61 -> 62) + SCR_INT ShopProcessingBitset; + SCR_ARRAY ActiveContactServiceBitsets; + SCR_ARRAY ActiveContactServices; + PLAYER_INDEX SpectatorTVWantedPlayer; + SCR_BOOL SpectatorTVWantedClosing; + SCR_BOOL SpectatorTVWantedActive; + uint64_t PAD_0390[2]; // not read by the scripts + SCR_INT PAD_0392; // TODO + uint64_t PAD_0393[6]; // TODO + WEAPON_PICKUPS WeaponPickups; + BIKER_CONTRACTS_SERVER BikerContracts; + SCR_ARRAY DoubleActionCacheLocationRevealed; +}; +static_assert(sizeof(GSBD_FM) == 648 * 8); \ No newline at end of file diff --git a/src/types/script/globals/GSBD_Kicking.hpp b/src/types/script/globals/GSBD_Kicking.hpp new file mode 100644 index 0000000..31b2441 --- /dev/null +++ b/src/types/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/src/types/script/globals/GSBD_PropertyInstances.hpp b/src/types/script/globals/GSBD_PropertyInstances.hpp new file mode 100644 index 0000000..ca1e2d9 --- /dev/null +++ b/src/types/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/src/types/script/globals/GlobalPlayerBD.hpp b/src/types/script/globals/GlobalPlayerBD.hpp new file mode 100644 index 0000000..f516f3e --- /dev/null +++ b/src/types/script/globals/GlobalPlayerBD.hpp @@ -0,0 +1,690 @@ +#pragma once +#include "../MPScriptData.hpp" +#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 +{ + // 0 is unused + kVisibleOnCutscene = 1, + kFlashMinimapDisplay = 2, + kFlashBlip = 3, + kMicroLightOTRActive = 4, + kSkipTutorialSessionChecks = 5, + kHideOnMinimap = 6, // needs testing + kHideOnMinimapWhenInterior = 7, // needs testing + kHideOnMinimapWhenBigMapActive = 9, // needs testing + kDontUsePassiveBlip = 21, + kUseRampageBlip = 24, + kHideWhenFading = 25 +}; + +enum class eBlipType +{ + ON_FOOT, + TANK, + PLAYER_JET, + PLAYER_PLANE, + PLAYER_HELI, + PLAYER_GUNCAR, + PLAYER_BOAT, + ROCKET_VOLTIC, + TECHNICAL, + RUINER_2000, + DUNE_BUGGY, + PHANTOM_WEDGE, + ARMORED_BOXVILLE, // boxville5 + WASTELANDER, + QUAD, + APC, + OPPRESSOR_MK_1, + HALF_TRACK, + DUNE_FAV, + WEAPONIZED_TAMPA, + AA_TRAILER, + ALPHA_Z1, + BOMBUSHKA, + HAVOK, + HOWARD, + HUNTER, + MICROLIGHT, + MOGUL, + MOLOTOK, + NOKOTA, + PYRO, + ROGUE, + STARLING, + SEABREEZE, + TULA, + STROMBERG, + DELUXO, + THRUSTER, + KHANJALI, + RIOT_VAN, + VOLATOL, + BARRAGE, + AKULA, + CHERNOBOG, + AVENGER, + TURRETED_LIMO, + SEA_SPARROW, + CARACARA, + PARTY_BUS, + TERRORBYTE, + MENACER, + SCRAMJET, + POUNDER_CUSTOM, + MULE_CUSTOM, + SPEEDO_CUSTOM, + OPPRESSOR_MK_2, + STRIKEFORCE, + ARENA_BRUISER, + ARENA_BRUTUS, + ARENA_CERBERUS, + ARENA_DEATHBIKE, + ARENA_DOMINATOR, + ARENA_IMPALER, + ARENA_IMPERATOR, + ARENA_ISSI, + ARENA_SASQUATCH, + ARENA_SCARAB, + ARENA_SLAMVAN, + ARENA_ZR380, + MINI_SUB, + SPARROW, + FOLDING_WING_JET, + GANG_BIKE, + MILITARY_QUAD, + SQUADDIE, // SQUADEE + CAYO_DINGHY, + WINKY, + PATROL_BOAT, + ANNIHILATOR, + KART_RETRO, + KART_MODERN, + MILITARY_TRUCK, + SUBMARINE, + CHAMPION, + BUFFALO_STX, + DEITY, // why does this have a blip? + JUBILEE, + GRANGER_3600LX, + PATRIOT_MILSPEC, + ARMS_DEALING_AIR, // requires some flag to be set + BRICKADE_6X6, + RAIJU, + CONADA2, + STEAMER2, + TOW_TRUCK, +}; + +enum class ePlayerStateFlags +{ + kScreenFadingOut = 0, + kScreenFadedOut = 1, + kCinematicNewsChannelActive = 2, + kRepeatingPreviousCheckpoint = 3, + kCarModIntro = 4, + kPlayerSwitchStateAscent = 5, + kPlayerSwitchStateInClouds = 6, + kPlayerSwitchStatePan = 7, + kPlayerSwitchStateDescent = 8, + kModshopActive = 9, + kModshopExitingVehicle = 10, + kSpectating = 28, + kBeastActive = 29, + kPlayerNotInSCTV = 30, + kPlayerInSCTV = 31 +}; + +enum class ePlayerStateFlags2 +{ + kHasGTAPlusMembership = 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, + SIMPLE_INTERIOR_SALVAGE_YARD_LA_PUERTA, + SIMPLE_INTERIOR_SALVAGE_YARD_MURIETTA_HEIGHTS, + SIMPLE_INTERIOR_SALVAGE_YARD_PALETO_BAY, + SIMPLE_INTERIOR_SALVAGE_YARD_SANDY_SHORES, + SIMPLE_INTERIOR_SALVAGE_YARD_STRAWBERRY, + SIMPLE_INTERIOR_BAIL_OFFICE_DAVIS, + SIMPLE_INTERIOR_BAIL_OFFICE_DEL_PERRO, + SIMPLE_INTERIOR_BAIL_OFFICE_MISSION_ROW, + SIMPLE_INTERIOR_BAIL_OFFICE_PALETO_BAY, + SIMPLE_INTERIOR_BAIL_OFFICE_WEST_VINEWOOD, + SIMPLE_INTERIOR_HACKER_DEN, + SIMPLE_INTERIOR_FIELD_HANGAR, + SIMPLE_INTERIOR_MAX +}; + +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; + alignas(8) eBlipType 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; + SCR_INT Flags8; // added b3258 + 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) == 30 * 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; + MP_SCRIPT_DATA CurrentScript; + uint64_t PAD_0022[11]; // unused + SCR_INT PlayersVisible; + SCR_INT PlayersTracked; + SCR_BITSET AnimationBitset; + SCR_INT NumSuccessfulHoldups; // resets every 12 minutes + SCR_INT PAD_0037; + NETWORK_INDEX PersonalVehicleNetId; + NETWORK_INDEX UnkVehicleNetId; + NETWORK_INDEX UnkVehicleNetId2; + SCR_ARRAY UnkVehicleNetIds; + NETWORK_INDEX DeliveryMechanicNetId; + NETWORK_INDEX DeliveryMechanicNetId2; + SCR_INT SpawningVehicleLiveryIndex; + SCR_INT SpawningVehiclePrimaryColor; + SCR_INT SpawningVehicleSecondaryColor; + NETWORK_INDEX AvengerNetId; + NETWORK_INDEX DeliveryMechanicNetId3; // wtf is this? + NETWORK_INDEX TerrorbyteNetId; // or is it the MOC? + NETWORK_INDEX SubmarineNetId; + NETWORK_INDEX DinghyNetId; + NETWORK_INDEX DeliveryMechanicNetId4; // another one... + NETWORK_INDEX AcidLabNetId; + NETWORK_INDEX DeliveryBikeNetId; + NETWORK_INDEX BountyTransporterNetId; // added b3258 + NETWORK_INDEX FieldDusterNetId; // added b3407 + SCR_BOOL PAD_0057; // (@59 as of b3407) + 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[33]; // TODO (@91 as of b3407) + // 32 -> 33 (new field) b3407 + 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_BITSET 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 CurrentShopIndex; // things like clothing and tattoo stores + SCR_INT CurrentStoreIndex; // the stores in the map which can be held up + SCR_BOOL ShopActive; // any shop + SCR_BOOL InTaxi; + SCR_INT Haircut; // @250 as of 1.67 + SCR_INT PrimaryHairColor; + SCR_INT SecondaryHairColor; + SCR_INT FriendlyPlayers; // bitset of player team relgroups that obtain a Respect relationship with player + SCR_BOOL IsInvisible; + 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_INT BlipShownBitset; + LEAVE_CLUBHOUSE LeaveClubhouse; // @353 as of 1.67 + 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; // 3->4 in 1.67 + SCR_INT PAD_0416; // TODO + SCR_BOOL DozerDetected; // very shady stuff, anticheat? @414 as of 1.67 + 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; // @432 as of 1.67 + SCR_INT OrbitalBitset2; // ugh + SCR_INT CurrentlyUsingArenaTrapIndex; + SCR_INT CurrentlyUsingArenaTrapActivatedTime; + ARCADE_GAME ArcadeGame; + SCR_INT DancePartner; + SCR_INT CayoPericoFlags; + 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; // @461 as of 1.67 + SCR_BOOL CanSpawnGunVan; +}; + +static_assert(sizeof(GlobalPlayerBDEntry) == 467 * 8); + +struct GlobalPlayerBD +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(GlobalPlayerBD) == 14945 * 8); \ No newline at end of file diff --git a/src/types/script/globals/g_AMC_playerBD.hpp b/src/types/script/globals/g_AMC_playerBD.hpp new file mode 100644 index 0000000..1f33cd4 --- /dev/null +++ b/src/types/script/globals/g_AMC_playerBD.hpp @@ -0,0 +1,16 @@ +#pragma once +#include "../Timer.hpp" +#include "../types.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) == 251 * 8); // -> 251 in b812g9 + +struct g_AMC_playerBD +{ + SCR_ARRAY Entries; +}; +static_assert(sizeof(g_AMC_playerBD) == 8033 * 8); \ No newline at end of file diff --git a/src/types/script/types.hpp b/src/types/script/types.hpp index 1e03f61..6b4943b 100644 --- a/src/types/script/types.hpp +++ b/src/types/script/types.hpp @@ -100,6 +100,7 @@ static_assert(sizeof(Color3) == 3 * 8); // serialized bitbuffer data of rage::rlGamerHandle + some padding for last gen compatibility // TODO: is the above statement true in Enhanced? +// seemingly yes struct GAMER_HANDLE { private: @@ -107,4 +108,4 @@ private: }; static_assert(sizeof(GAMER_HANDLE) == 13 * 8); -#define NUM_CONTACTS 82 \ No newline at end of file +#define NUM_CONTACTS 83 \ No newline at end of file