feat(globals): add some globals

This commit is contained in:
maybegreat48
2025-03-15 16:26:00 -04:00
parent a1f83597d4
commit b4a83aac3b
15 changed files with 2304 additions and 1 deletions
+222
View File
@@ -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
};
+11
View File
@@ -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);
+9
View File
@@ -0,0 +1,9 @@
#pragma once
#include "types.hpp"
struct TIMER
{
SCR_INT Time;
SCR_BOOL IsInitialized;
};
static_assert(sizeof(TIMER) == 2 * 8);
+695
View File
@@ -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<uint64_t, 31> 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<uint64_t, 40> 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<uint64_t, 8> ProductStocks; // see eBusinessHubProductIndex
SCR_ARRAY<uint64_t, 16> PAD_0017; // have no clue what this is
SCR_ARRAY<uint64_t, 8> 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<uint64_t, 2> 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<uint64_t, 2> 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<uint64_t, NUM_PROPERTY_INTERIORS> PropertyIds;
SCR_BITSET<ePropertyInteriorFlags> 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<uint64_t, 32> RingingPlayersState; // 0 = ringing, 1 = accepted, 2 = denied
GAMER_HANDLE OwnerHandle; // can be used to bypass RID spoofing when player is inside interior
SCR_ARRAY<uint64_t, NUM_PROPERTY_INTERIORS> EclipseTheme;
SCR_INT ApartmentType; // normal vs stilt vs eclipse
SCR_INT OwnerInstance; // same as Instance in most cases
SCR_ARRAY<EXEC_WAREHOUSE_INFO, 5> ExecutiveWarehouseInfos;
SCR_INT OfficeSafeMoneyMultiplier;
SCR_BITSET<eInteriorStyleFlags> 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<FACTORY_INFO, 7> 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<uint64_t, 7> 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<uint64_t, 41> ArcadeMachineSlots;
SCR_INT PAD_0478; // TODO
SUBMARINE_DATA SubmarineData;
AUTOSHOP_DATA AutoShopData;
SALVAGE_YARD_DATA SalvageYardData;
SCR_ARRAY<uint64_t, 2> 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<uint64_t, 4> 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<uint64_t, 2> 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<eTutorialBitset> TutorialBitset;
SCR_BITSET<eGangCallServices> GangCallRequestedServices;
PLAYER_INDEX GangCallTarget; // can be used to send muggers/hit squad
SCR_BITSET<eGangCallServices> 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<uint64_t, 2> 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<uint64_t, 3> ActiveAmbientWeaponPickups; // size 2 -> 3 b3095
SCR_ARRAY<uint64_t, 6> OfficeMapMarkers;
SCR_INT OfficeLargestMoneyThresholdIndex;
SCR_ARRAY<uint64_t, 2> EnabledOfficeCashPiles;
SCR_ARRAY<uint64_t, 2> 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<GPBD_FM_Entry, 32> Entries;
};
static_assert(sizeof(GPBD_FM) == 28545 * 8);
+357
View File
@@ -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<uint64_t, 7> GoonOutfitIndices; // one outfit for each goon
SCR_ARRAY<uint64_t, 7> GoonOutfitIndicesOverride;
SCR_INT PAD_0019;
SCR_BOOL HeadgearEnabled;
SCR_BOOL EmblemEnabled;
};
static_assert(sizeof(MC_STYLE) == 22 * 8);
struct VEHICLE_EXPORT
{
SCR_ARRAY<uint64_t, 4> 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<uint64_t, 20> 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<eBossGoonFlags> Flags;
SCR_INT Flags2; // TODO
SCR_INT Flags3; // TODO
SCR_INT TotalBossGoonTime;
SCR_ARRAY<uint64_t, 2> BossGoonUUID;
SCR_ARRAY<uint64_t, 8> 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<SCR_VEC3, 8> PAD_0126; // TODO
SCR_ARRAY<SCR_VEC3, 8> 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<uint64_t, 9> 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<uint64_t, 20> 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<uint64_t, 8> ContrabandIndices; // type of selling cargo
SCR_ARRAY<uint64_t, 10> VehicleExportIndices; // not sure what this is
SCR_INT VehicleExportMissionType; // valid range is 2000 to 2010, 2000 = 0, 2001 = 1 etc
SCR_ARRAY<uint64_t, 4> 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<uint64_t, 8> 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<uint64_t, 1> DailyObjectiveFlags; // @607 as of 1.67
};
static_assert(sizeof(GBPD_FM_3_Entry) == 611 * 8);
struct GPBD_FM_3
{
SCR_ARRAY<GBPD_FM_3_Entry, 32> Entries;
};
static_assert(sizeof(GPBD_FM_3) == 19553 * 8);
+17
View File
@@ -0,0 +1,17 @@
#pragma once
#include "../types.hpp"
struct GPBD_KickingEntry
{
SCR_ARRAY<uint64_t, 32> KickVotes; // players you are voting to kick (array of bool)
SCR_ARRAY<uint64_t, 32> KickWarningsShown;
SCR_BOOL WillBeKickedSoon;
SCR_ARRAY<uint64_t, 32> PlayersToBeKickedSoon;
};
static_assert(sizeof(GPBD_KickingEntry) == 100 * 8);
struct GPBD_Kicking
{
SCR_ARRAY<GPBD_KickingEntry, 32> Entries;
};
static_assert(sizeof(GPBD_Kicking) == 3201 * 8);
@@ -0,0 +1,8 @@
#pragma once
#include "../types.hpp"
struct GPBD_MissionName
{
SCR_ARRAY<TEXT_LABEL_63, 32> MissionNames;
};
static_assert(sizeof(GPBD_MissionName) == 513 * 8);
+95
View File
@@ -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<uint64_t, 10> CeoColorIndices;
SCR_ARRAY<uint64_t, 32> CeoColorIndices2;
SCR_ARRAY<CEO_COLOR, 10> 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<uint64_t, 32> PlayerInteriorInstances;
SCR_ARRAY<uint64_t, 32> PlayerInteriorIds; // used solely for telemetry
SCR_INT PlayerInteriorCreationRequestBitset;
SCR_ARRAY<uint64_t, 32> PlayerOwnerBitset;
SCR_INT PlayerInteriorRemovalRequestBitset;
SCR_ARRAY<uint64_t, 32> PlayerInteriorCreationTimes;
SCR_ARRAY<uint64_t, 32> PlayerInteriorSimpleInteriorTypes;
SCR_ARRAY<uint64_t, 32> PlayerInteriorIsOwnerless;
SCR_ARRAY<uint64_t, 32> PlayerInteriorOwners;
};
static_assert(sizeof(SMPL_INTERIOR_DATA_SERVER) == 234 * 8);
struct LEAVE_CLUBHOUSE_SERVER
{
SCR_ARRAY<uint64_t, 32> Identifiers;
SCR_ARRAY<uint64_t, 32> ExitLocations;
SCR_ARRAY<uint64_t, 32> 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<IMPOUND_VEHICLE_INFO, 32> ImpoundVehicleInfos;
SCR_ARRAY<SCR_VEC3, 32> SpawnPositions;
SCR_ARRAY<uint64_t, 32> SpawnPositionCreationTimes;
SCR_ARRAY<uint64_t, 32> SpawnPositionsValid;
SCR_ARRAY<uint64_t, 32> PAD_0294;
SCR_ARRAY<uint64_t, 32> SpawnPositionTokens;
SCR_INT SpawnPositionCounter;
SCR_ARRAY<uint64_t, 32> RespawnVehicles;
SCR_ARRAY<uint64_t, 32> RespawnVehicleSeats;
SCR_ARRAY<uint64_t, 32> 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<IE_DELIVERY_INFO, 32> 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);
+96
View File
@@ -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<uint64_t, 18> PAD_0001;
SCR_ARRAY<DELIVERABLE_SCRIPT_INFO, 18> 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<uint64_t, 5> 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<DELIVERABLE, 64> Deliverables;
SCR_ARRAY<UNK_0962, 10> 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<PLAYER_MISSION_INFO, 32> 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<uint64_t, 6> TurretCooldownTimers;
FREEMODE_DELIVERY FreemodeDelivery;
SCR_ARRAY<GLOBAL_CLUB_INFO, 3> GlobalClubInfos;
SCR_ARRAY<uint64_t, 32> CarMeetModShopSlotIndices;
SCR_ARRAY<uint64_t, 32> CarMeetModShopOccupiedGoons;
SCR_ARRAY<SCR_ARRAY<uint64_t, 3>, 32> CarMeetModShopOccupiedVehicleSlots;
};
static_assert(sizeof(GSBD_BlockB) == 2156 * 8);
+67
View File
@@ -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<uint64_t, 96> Indices; // size increased in b3095 (62 -> 95)
// and in b3407 (95 -> 96)
SCR_ARRAY<uint64_t, 96> Owners;
SCR_INT SpawnCounter;
SCR_INT AmmoCount;
};
static_assert(sizeof(WEAPON_PICKUPS) == 200 * 8);
struct BIKER_CONTRACTS_SERVER
{
SCR_ARRAY<uint64_t, 3> ActiveContracts;
SCR_ARRAY<uint64_t, 3> ContractCompleteCount;
SCR_INT CompletedContractBitset;
SCR_INT LastContractRefreshTime;
};
static_assert(sizeof(BIKER_CONTRACTS_SERVER) == 10 * 8);
struct GSBD_FM
{
SCR_ARRAY<uint64_t, 2> ModelSwapBits;
SCR_INT PAD_0003; // unused
SCR_ARRAY<PLAYER_BOUNTY, 32> PlayerBounties;
uint64_t PAD_0101[5]; // unused
SCR_ARRAY<uint64_t, 2> MuggingPlayers; // 0 = mugger, 1 = merryweather mercs
SCR_ARRAY<uint64_t, 2> MuggedPlayers;
uint64_t PAD_0112[4]; // unused
SCR_ARRAY<uint64_t, 62> PAD_0116; // TODO b3407 (61 -> 62)
SCR_INT ShopProcessingBitset;
SCR_ARRAY<uint64_t, NUM_CONTACTS> ActiveContactServiceBitsets;
SCR_ARRAY<ACTIVE_CONTACT_SERVICE, 32> 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<uint64_t, 32> DoubleActionCacheLocationRevealed;
};
static_assert(sizeof(GSBD_FM) == 648 * 8);
@@ -0,0 +1,8 @@
#pragma once
#include "../types.hpp"
struct GSBD_Kicking
{
SCR_ARRAY<uint64_t, 32> KickedPlayers;
};
static_assert(sizeof(GSBD_Kicking) == 33 * 8);
@@ -0,0 +1,11 @@
#pragma once
#include "../types.hpp"
// this is why your apartment generally takes years to load
struct GSBD_PropertyInstances
{
SCR_ARRAY<GAMER_HANDLE, 32> PropertyOwners;
uint64_t PAD_0417[14]; // unused
SCR_ARRAY<uint64_t, 32> PropertyOwnerInstances;
};
static_assert(sizeof(GSBD_PropertyInstances) == 464 * 8);
+690
View File
@@ -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<JOB_BET, 32> PlacedBets;
SCR_BOOL CancelBetting;
};
static_assert(sizeof(MISSION_BETS) == 72 * 8);
struct PLAYER_BLIP
{
SCR_INT PAD_0000;
SCR_INT NumPassengersInVehicle;
SCR_BITSET<eBlipFlags> 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<uint64_t, 7> 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<uint64_t, 2> 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<uint64_t, 32> ParticipantHashes;
};
static_assert(sizeof(LEAVE_CLUBHOUSE) == 37 * 8);
struct ARCADE_GAME
{
SCR_BITSET<eArcadeGameBitset> 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<eAnimationBitset> AnimationBitset;
SCR_INT NumSuccessfulHoldups; // resets every 12 minutes
SCR_INT PAD_0037;
NETWORK_INDEX PersonalVehicleNetId;
NETWORK_INDEX UnkVehicleNetId;
NETWORK_INDEX UnkVehicleNetId2;
SCR_ARRAY<uint64_t, 2> 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<ePlayerStateFlags> PlayerStateFlags;
SCR_BITSET<ePlayerStateFlags2> 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<eActivityFlags> 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<eGamerTagFlags> 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<SCR_VEC3, 4> 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<uint64_t, 6> MissionTurretParticipants;
SCR_INT PAD_0425; // some seat index
SCR_INT MissionTurretSlot;
SCR_BITSET<eOrbitalBitset> 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<eOutOfSightFlags> 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<GlobalPlayerBDEntry, 32> Entries;
};
static_assert(sizeof(GlobalPlayerBD) == 14945 * 8);
@@ -0,0 +1,16 @@
#pragma once
#include "../Timer.hpp"
#include "../types.hpp"
struct g_AMC_playerBD_Entry
{
SCR_ARRAY<TIMER, NUM_CONTACTS> UsedContactServicesTimer; // only index 2 (mugger) is actually used by the scripts. the rest is just a waste of bandwidth
SCR_ARRAY<uint64_t, NUM_CONTACTS> ContactServiceCooldowns; // same as above
};
static_assert(sizeof(g_AMC_playerBD_Entry) == 251 * 8); // -> 251 in b812g9
struct g_AMC_playerBD
{
SCR_ARRAY<g_AMC_playerBD_Entry, 32> Entries;
};
static_assert(sizeof(g_AMC_playerBD) == 8033 * 8);
+2 -1
View File
@@ -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
#define NUM_CONTACTS 83