Add global classes (#93)

* feat(Network): add snConnectToPeerTaskData and snConnectToPeerTaskResult
* feat(Script): Add script global structs
* fix(CMake): Try to get includes to work
* chore(Globals): try to fix linux build
* chore(Globals): Actually rename all instances of TIMER
This commit is contained in:
maybegreat48 2023-01-03 12:15:06 +00:00 committed by GitHub
parent eca88a42ef
commit 2bb20aa67f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 2148 additions and 1 deletions

View File

@ -12,7 +12,7 @@ set(CMAKE_REQUIRED_QUIET ON)
set(OK TRUE)
file(GLOB_RECURSE HEADERS "*.hpp")
file(GLOB_RECURSE HEADERS "**.hpp")
message(STATUS "")

View File

@ -0,0 +1,21 @@
#pragma once
#include <cstdint>
namespace rage
{
class snConnectToPeerTaskData
{
public:
int m_unk;
int m_reason;
uint64_t m_session_token;
};
class snConnectToPeerTaskResult
{
public:
char pad[0x10]{};
int m_peer_id;
char pad2[0x400]{};
};
}

View File

@ -0,0 +1,15 @@
#pragma once
#include <cstdint>
namespace rage
{
class rlQueryPresenceAttributesContext
{
public:
char m_presence_attribute_key[64]; //0x0000
char m_presence_attribute_value[256]; //0x0040
uint32_t m_presence_attibute_type; //0x0140
char pad_0144[4]; //0x0144
}; //Size: 0x0148
static_assert(sizeof(rage::rlQueryPresenceAttributesContext) == 0x148);
}

27
rage/rlScHandle.hpp Normal file
View File

@ -0,0 +1,27 @@
#pragma once
#include <cstdint>
namespace rage
{
#pragma pack(push,8)
class rlScHandle
{
public:
uint64_t m_rockstar_id; //0x0000
char m_pad[2];
uint8_t m_platform; //0x000A
uint8_t unk_0009; //0x000B
inline rlScHandle() = default;
inline rlScHandle(uint64_t rockstar_id) :
m_rockstar_id(rockstar_id),
m_platform(3),
unk_0009(0)
{
}
}; //Size: 0x0010
static_assert(sizeof(rlScHandle) == 0x10);
#pragma pack(pop)
}

10
rage/rlTaskStatus.hpp Normal file
View File

@ -0,0 +1,10 @@
#pragma once
namespace rage
{
struct rlTaskStatus
{
int status = 0;
int unk = 0;
};
}

222
script/HudColor.hpp Normal file
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
};

10
script/Timer.hpp Normal file
View File

@ -0,0 +1,10 @@
#pragma once
#include "types.hpp"
// this is named stopwatch in the decompiler but "timer" is probably a better name for it
struct TIMER
{
SCR_INT Time;
SCR_BOOL IsInitialized;
};
static_assert(sizeof(TIMER) == 2 * 8);

658
script/globals/GPBD_FM.hpp Normal file
View File

@ -0,0 +1,658 @@
#pragma once
#include "../types.hpp"
#include "../Timer.hpp"
enum class eMissionDataFlags
{
kMissionLaunched = 0,
kJobDownloaded = 2,
kStartingJob = 3,
kRequestingScript = 4,
kLaunchedScript = 6, // should be set if kMissionLaunched is set
kAutoStartOnProximity = 7, // used by gang attack
kNJVSQuickMatch = 8,
kVoteLiked = 10,
kVoteDisliked = 11,
kNoVote = 25
}; // TODO
enum class eTutorialBitset
{
kInTutorialRace = 0,
kTutorialRaceActive = 2,
kShowCredits = 4,
kNeedFreeVehicle = 6
};
enum class eGangCallServices
{
kMugger = 0,
kMercenary = 1
};
enum class eVehicleSelectionState
{
NONE,
SELECTING,
SELECTED
};
enum class eStatState
{
NONE,
LETHARGIC,
OUT_OF_SHAPE,
HEALTHY,
ATHLETE,
TRI_ATHLETE,
UNTRAINED,
SPRAY_AND_PRAY,
POLICE_TRAINING,
MILITARY_TRAINING,
DEAD_EYE,
FRAGILE,
WEAK,
AVERAGE,
TOUGH,
BODYBUILDER,
CLUMSY,
LOUD,
SNEAKY,
HUNTER,
NINJA,
DANGEROUS,
RC_PILOT,
COMMERCIAL_PILOT,
FIGHTER_PILOT,
ACE,
UNLICENSED,
SUNDAY_DRIVER,
COMMUTER,
STREET_RACER,
PRO_RACER,
NORMAL,
UNSTABLE,
DERANGED,
MANIAC,
PSYCHOPATH,
DRUNK
};
enum class ePropertyInteriorFlags
{
kOwnerOfInterior = 0,
kVisitorOfInterior = 1, // mutually exclusive with above flag
kConcealWhenDead = 12,
kRenovatingProperty = 19,
kPreviewingDecor = 20,
kRenovatingClubhouse = 21,
kUsingYachtRmBath1 = 22,
kUsingYachtRmBath3 = 23,
kUsingYachtRmWeeBathroom = 25,
kGunLockerOpen = 27,
kOfficeSafeOpen = 28,
kOfficeAssistantMale = 29
};
enum class eInteriorStyleFlags
{
kGunLockerShowPumpShotgun = 0,
kGunLockerShowMicroSMG = 1,
kGunLockerShowC4 = 2, // proximity or sticky
kGunLockerShowGrenade = 3,
kGunLockerShowCombatMG = 4,
kGunLockerShowMarksmanRifle = 5,
kPurchasedSnacks = 6,
kPurchasedInteriorRenovations = 7,
kForceOfficeAssistantSpawn = 8,
kAssistantAnimationOver = 9,
kChangeInteriorDecorOfficeHelpShown = 11,
kChangeInteriorDecorApartmentHelpShown = 12,
kOwnsOfficeBedroom = 13,
kOwnsClubhouseBikeShop = 16,
kOwnsOfficeGunLocker = 17,
KOwnsClubhouseWalls = 18, // ???
kOwnsClubhouseFurnishings = 19,
kOwnsClubhouseDecors = 20
};
enum class eBusinessHubProductIndex
{
CARGO,
WEAPONS,
COCAINE,
METH,
WEED,
FORGED_DOCUMENTS,
COUNTERFEIT_CASH
};
struct PLAYLIST_DATA
{
PLAYER_INDEX Host;
SCR_INT Flags;
SCR_BOOL PAD_0002;
SCR_INT CurrentMission;
SCR_INT TotalMissions;
PLAYER_INDEX PAD_0006;
};
static_assert(sizeof(PLAYLIST_DATA) == 6 * 8);
struct MISSION_DATA
{
SCR_INT PAD_0000; // unused
SCR_INT ScriptId; // TODO: add enum
SCR_INT InstanceId;
uint64_t PAD_0003[7]; // unused
SCR_VEC3 TriggerPosition;
uint64_t PAD_0013[3]; // unused
SCR_INT InstanceIdForPresence;
SCR_INT PAD_0017; // unused
SCR_BITSET<eMissionDataFlags> Flags;
};
static_assert(sizeof(MISSION_DATA) == 19 * 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; // real name leak when playing inside track
SCR_INT BetHorseID;
SCR_INT BetChips;
};
static_assert(sizeof(INSIDE_TRACK) == 18 * 8);
// casino penthouse
struct CASINO_APARTMENT_DATA
{
SCR_INT Index; // always one for obvious reasons
SCR_INT PAD_0001; // unused
SCR_INT AppearanceBitset;
SCR_INT AppearanceBitset2;
uint64_t PAD_0005[2];
INSIDE_TRACK InsideTrack;
};
static_assert(sizeof(CASINO_APARTMENT_DATA) == 24 * 8);
struct ARCADE_DATA
{
SCR_INT Index;
SCR_INT AppearanceBitset;
SCR_INT AppearanceBitset2;
SCR_INT AppearanceBitset3;
SCR_INT SafeCashValue;
SCR_INT PAD_0005; // unused
};
static_assert(sizeof(ARCADE_DATA) == 6 * 8);
struct ARCADE_MACHINES
{
SCR_INT OrderedMachinesBitset;
SCR_INT ArrivedMachinesBitset;
};
static_assert(sizeof(ARCADE_MACHINES) == 2 * 8);
struct SUBMARINE_DATA
{
SCR_INT AppearanceBitset;
SCR_HASH Model; // not read by the scripts, always set to HASH("kosatka")
SCR_INT Color; // "PACKED_MP_INT_KOSATKA_COLOUR"
SCR_INT Flag; // "PACKED_MP_INT_KOSATKA_FLAG"
SCR_INT LastGuidedMissileUseTime;
SCR_INT PAD_0005; // unused
};
static_assert(sizeof(SUBMARINE_DATA) == 6 * 8);
struct AUTOSHOP_DATA
{
SCR_INT Index;
SCR_INT AccessSetting;
SCR_INT AppearanceBitset;
SCR_INT AppearanceBitset2;
SCR_INT PAD_0004;
SCR_ARRAY<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 (currently unreleased)
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 PROPERTY_DATA
{
SCR_ARRAY<uint64_t, 30> 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, 30> EclipseTheme; // not sure why this is an array of 30 yet
SCR_INT ApartmentType; // normal vs stilt vs eclipse
SCR_INT OwnerInstance; // same as Instance in most cases
SCR_ARRAY<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 PAD_0288;
SCR_INT MOCColor; // bitset for some reason
uint64_t PAD_0290[2]; // unused
SCR_INT GunShopFlags;
HANGAR_DATA HangarData;
SCR_INT PAD_0299;
DEFUNCT_BASE_DATA DefunctBaseData;
SCR_INT AvengerInteriorDecorFlags; // "PACKED_MP_INT_ARMORY_AIRCRAFT_INTERIOR_v0"
uint64_t PAD_0308[2];
BUSINESS_HUB_DATA BusinessHubData;
NIGHTCLUB_DATA NightclubData;
SCR_INT PAD_0365;
SCR_INT TerrorbyteDesign;
SCR_INT PAD_0367;
SCR_INT AcidLabRadio;
SCR_INT TerrorbyteRadio;
SCR_INT NanoDroneCooldown;
PLAYER_INDEX HostOfInteriorScript;
ARENA_GARAGE_DATA ArenaGarageData;
SCR_INT ArcadeJukeboxStation; // for simple interior type 17
SCR_INT JukeboxFavoritePlaylist;
SCR_INT ClubhouseBarCashAmount;
SCR_INT DefaultJukeboxStation;
SCR_INT FreakshopJukeboxStation;
SCR_INT PAD_0386; // TODO
SCR_HASH MOCModel; // used by the bunker script to detect exits with MOC
SCR_INT PAD_0388; // unused
SCR_HASH TerrorbyteModel;
SCR_ARRAY<uint64_t, 7> PAD_0390; // some property interior stuff
uint64_t PAD_0398[4];
SCR_INT OfficeGarageModdingVehicleSlot;
SCR_INT CurrentOfficeGarageFloor;
CASINO_APARTMENT_DATA CasinoApartmentData;
ARCADE_DATA ArcadeData;
ARCADE_MACHINES ArcadeMachines;
SCR_ARRAY<uint64_t, 41> ArcadeMachineSlots;
SCR_INT PAD_0478; // TODO
SUBMARINE_DATA SubmarineData;
AUTOSHOP_DATA AutoShopData;
SCR_ARRAY<uint64_t, 2> AutoShopArcadeMachineSlots;
CAR_CLUB_DATA CarClubData;
FIXER_HQ_DATA FixerHQData;
SCR_INT PAD_0503; // not read by the scripts
VEHICLE_INDEX CurrentlyModdingVehicleFixerHQ;
MULTI_STOREY_GARAGE_DATA MultiStoreyGarageData;
SCR_INT FreakshopBits; // 0: has weapon workshop, 1: radio enabled
};
static_assert(sizeof(PROPERTY_DATA) == 512 * 8);
struct BIKER_CONTRACTS
{
SCR_ARRAY<uint64_t, 4> ActiveContractMissions;
SCR_INT SelectedContractMission;
SCR_BOOL Enabled;
};
static_assert(sizeof(BIKER_CONTRACTS) == 7 * 8);
struct NIGHTCLUB_SALE
{
SCR_INT BuyerIndex;
SCR_INT NumSoldItems;
SCR_INT SaleAmount;
uint64_t PAD_0003[2];
};
static_assert(sizeof(NIGHTCLUB_SALE) == 5 * 8);
struct ARENA_WAR_DATA
{
SCR_INT PointsTier;
SCR_INT SkillLevel;
SCR_INT TrinketBitset; // MP_STAT_ARN_BS_TRINKET_SAVED
};
static_assert(sizeof(ARENA_WAR_DATA) == 3 * 8);
struct GPBD_FM_Entry
{
SCR_INT CurrentActivity;
SCR_INT MissionScriptInstance;
SCR_INT PAD_0002; // TODO
SCR_INT NumFreeSpectatorSlots;
SCR_INT NumPlayersInTransition; // not really
SCR_INT NJVSVoteState; // voting screen shown after a mission ends
SCR_INT NJVSVoteContentBitset;
SCR_BOOL NJVSChoiceMade;
SCR_INT NJVSLeaveState; // network error or quit
SCR_INT JobPoints; // can be spoofed to change the "JP" value in the player list
PLAYER_INDEX NextHost; // transfer transition host when joining next job
PLAYLIST_DATA PlaylistData;
TEXT_LABEL_63 JobName;
SCR_ARRAY<uint64_t, 2> ActiveGunRange; // this should have really been an enum lol
MISSION_DATA MissionData;
uint64_t PAD_0055[2]; // unused
JOB_SETTINGS JobSettings;
SCR_INT FMMCLauncherState;
VEHICLE_SELECTION VehicleSelection;
SCR_INT JobStartCloudTime; // this is a struct but too lazy to create one
SCR_INT ContentHash;
SCR_BOOL PAD_0138; // unused
SCR_BITSET<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;
uint64_t PAD_0779[4]; // TODO
uint64_t PAD_0783[12]; // no clue what it does but it looks rather interesting
SCR_INT AssistedKillFlags;
NETWORK_INDEX UnkNetworkId;
SCR_BOOL SpawningUnkVehicle;
SCR_BOOL MeltdownComplete; // yes, the singleplayer mission "Meltdown" (michael4)
SCR_INT UNK_0799;
SCR_INT GangAttackTarget; // triggers unique dialog from some phone NPCs
SCR_INT ActivePVSlot;
PLAYER_INDEX PAD_0802;
SCR_INT PAD_0803;
SCR_ARRAY<uint64_t, 2> ActiveAmbientWeaponPickups;
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;
uint64_t PAD_844[11]; // unused, all of them
SCR_INT SeatingIndex;
ARENA_WAR_DATA ArenaWarData;
uint64_t PAD_0859[2];
SCR_INT ApartmentEnterFlags;
};
static_assert(sizeof(GPBD_FM_Entry) == 862 * 8);
struct GPBD_FM
{
SCR_ARRAY<GPBD_FM_Entry, 32> Entries;
};
static_assert(sizeof(GPBD_FM) == 27585 * 8);

View File

@ -0,0 +1,365 @@
#pragma once
#include "../types.hpp"
#include "../Timer.hpp"
#include "../HudColor.hpp"
enum class eActivityType
{
HeistPrep = 233,
Gunrunning = 180,
Sightseer = 142,
HeadHunter = 166,
BuySpecialCargo = 167,
SellSpecialCargo = 168,
DefendSpecialCargo = 169,
StealVehicle = 178,
ExportVehicle = 188,
Gunrunning2 = 225,
GunrunningSell = 226,
GunrunningDefend = 227,
BikerSell = 190,
BikerDefend = 191,
BusinessResupply = 192,
Survival = 3,
Darts = 14,
ArmWresling = 15,
GangAttack = 6,
PilotSchool = 122,
Golf = 11,
ShootingRange = 13,
Tennis = 12,
BaseJump = 8,
Deathmatch = 1,
ImpromptuDeathmatch = 5,
Mission = 0,
Race = 2,
ExecutiveDeathmatch = 148,
MarkedForDeath = 151,
PiracyPrevention = 152,
MostWanted = 153,
AssetRecovery = 157,
HostileTakeover = 159,
Point2Point = 162,
AmphibiousAssault = 216,
Velocity = 219,
GunsForHire = 185,
ByThePound = 182,
RippingItUp = 194,
RaceToPoint = 189,
HitAndRide = 193,
CriminalMischief = 205,
WeaponOfChoice = 186,
FragileGoods = 207,
Torched = 208,
Outrider = 209,
WheelieRider = 210,
POW = 183,
ExecutiveSearch = 199,
StandYourGround = 201,
AutoBuyout = 163,
DueDiligence = 160,
MarketManipulation = 154,
CourierService = 155,
Skydive = 267
};
enum class eBossGoonFlags
{
kOneOnOneDM = 4,
kJoinSuccess = 7,
kJoinFail = 8,
kSpectating = 24
};
enum class eGoonInviteType
{
DEBUG,
NEARBY,
FRIENDS,
CREW,
INDIVIDUAL,
LOOKING_FOR_WORK
};
enum class eBossVehicleState
{
NONE,
SPAWNED,
DESTROYED = 3
};
enum class eMCRole
{
PROSPECT = -1,
VICE_PRESIDENT,
ROAD_CAPTAIN,
SERGEANT_IN_ARMS,
ENFORCER
};
enum class eClubhouseActivity
{
NONE = -1,
DARTS,
ARM_WRESTLING
};
struct MP_SCRIPT_DATA
{
SCR_INT Index; // this is an enum
uint64_t Args[15];
SCR_INT InstanceId;
uint64_t MoreArgs[4];
};
static_assert(sizeof(MP_SCRIPT_DATA) == 21 * 8);
struct MC_STYLE
{
SCR_BOOL Enabled;
SCR_INT BossOutfitType;
SCR_INT GoonOutfitType;
SCR_ARRAY<uint64_t, 7> GoonOutfitIndices; // one outfit for each goon, size is 7 instead of 8 for some reason
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;
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, 6> ActiveFreemodeEvents; // force thunder
uint64_t PAD_0212[22]; // I'm not even going to bother with this one
HANGAR_CARGO HangarCargo;
uint64_t PAD_0236[23]; // not going to bother with this one either
SCR_ARRAY<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) == 497 * 8);
struct MC_STATS
{
SCR_INT FormationTime0;
SCR_INT FormationTime1;
SCR_INT FormationTime2;
SCR_INT FormationTime3;
SCR_INT MembersMarkedForDeath;
SCR_INT MCKills;
SCR_INT MCDeaths;
SCR_INT RivalPresidentKills;
SCR_INT RivalCEOAndVIPKills;
SCR_INT MeleeKills;
SCR_INT ClubhouseContractsComplete;
SCR_INT ClubhouseContractEarnings;
SCR_INT ClubworkCompleted;
SCR_INT ClubChallengesCompleted;
SCR_INT MemberChallengesCompleted;
};
static_assert(sizeof(MC_STATS) == 15 * 8);
struct GBPD_FM_3_Entry
{
alignas(8) eActivityType CurrentActivity; // enum is outdated
SCR_INT Flags; // TODO
alignas(8) eActivityType CurrentFreemodeActivity; // subset of CurrentActivity
SCR_INT SeatingFlags;
SCR_VEC3 CurrentFreemodeActivityObjectivePosition;
SCR_INT VehiclesNearbyActivityObjective; // only used by challenges and checkpoints
SCR_BOOL PassiveMode;
SCR_BOOL TimeTrialActive; // verify
BOSS_GOON BossGoon;
uint64_t PAD_507[3]; // unused
SCR_INT ScriptEventReplayProtectionCounter;
TIMER CoronaForcedLaunchTimer;
LEAVE_IN_HELI LeaveInHeli;
SCR_INT OfficeDesktopFlags; // bit 0 -> login, bit 1 -> map
uint64_t PAD_514[8]; // some IE stuff, most of it is unused
SCR_INT IlluminatedClothingState;
SCR_INT MatchHistoryId1; // used for telemetry
SCR_INT MatchHistoryId2;
alignas(8) eClubhouseActivity ClubhouseActivity;
SCR_INT ClubhouseFont;
SCR_INT ClubhouseColor;
SCR_INT ClubhouseEmblem;
SCR_BOOL ClubhouseHideSignage;
uint64_t PAD_0533[2]; // facility exit
uint64_t PAD_0535[6]; // no clue what this is
MC_STATS MCStats;
uint64_t PAD_0556[29];
SCR_HASH ForcedWeapon;
SCR_INT HangarCargoMissionLocationIndex;
SCR_VEC3 AvengerPosition;
SCR_VEC3 TerrorbytePosition;
SCR_VEC3 AcidLabPosition;
PLAYER_INDEX DeliveringExportVehicleOwner;
uint64_t PAD_0597[2]; // TODO
SCR_INT BountyAmount; // values above 10000 will prevent payout
PLAYER_INDEX BountyPlacedBy;
SCR_INT PAD_0601; // unused, set to -1 by business_battles_sell and never read
SCR_INT CurrentlyUsingArenaTurretIndex; // works similar to the vars found in GlobalPlayerBD
SCR_INT CurrentlyUsingArenaTurretActivatedTime;
SCR_INT CasinoStoryProgress;
SCR_INT CasinoFlowProgress;
SCR_ARRAY<uint64_t, 1> DailyObjectiveFlags;
};
static_assert(sizeof(GBPD_FM_3_Entry) == 608 * 8);
struct GPBD_FM_3
{
SCR_ARRAY<GBPD_FM_3_Entry, 32> Entries;
};
static_assert(sizeof(GPBD_FM_3) == 19457 * 8);

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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -0,0 +1,564 @@
#pragma once
#include "../types.hpp"
enum class eFreemodeState
{
NONE = 0,
UNK_2 = 2,
RUNNING = 4,
CLOSING = 5,
UNK_10 = 10,
UNK_11 = 11
};
enum class eMissionType
{
NONE,
MISSION,
HEIST,
UNK_3,
ADVERSARY_MODE,
LAST_TEAM_STANDING,
CAPTURE,
HEIST_SETUP,
UNK_8, // FMMC_RSTAR_MCP
UNKNOWN // everything else
};
enum class eAnimationBitset
{
kCashRainActive = 12,
kChampagneSprayActive = 13
};
enum class eBlipFlags
{
kVisibleOnCutscene = 1,
kFlashMinimapDisplay = 2,
kSkipTutorialSessionChecks = 5,
kHideOnMinimap = 6, // needs testing
kHideOnMinimapWhenInterior = 6, // needs testing
kHideOnMinimapWhenBigMapActive = 9, // needs testing
kDontUsePassiveBlip = 21,
kUseRampageBlip = 24,
kHideWhenFading = 25
};
enum class ePlayerStateFlags
{
kScreenFadingOut = 0,
kScreenFadedOut = 1,
kCinematicNewsChannelActive = 2,
kPlayerSwitchState1 = 5,
kPlayerSwitchState2 = 6,
kPlayerSwitchState3 = 7,
kPlayerSwitchState4 = 8,
kModshopActive = 9,
kModshopExitingVehicle = 10,
kPlayerInSCTV = 31
};
enum class eActivityFlags
{
kWatchingMovie = 0,
kInGangAttack = 1,
kImpromptuRace = 2,
kCrateDrop = 4, // tf is this? "~s~A plane is on its way to drop a Crate ~HUD_COLOUR_GREEN~~BLIP_CRATEDROP~ ~s~which contains useful equipment. Be the first to collect it."
kDeliveringSimeonVehicle = 6,
kInLapDance = 7,
kHoldUpTutorial = 8,
kJoyrider = 9, // uh what is this?
kCarModTutorial = 10,
kMissionLauncher = 11, // ???
kLesterCutsceneActive = 12,
kTrevorCutsceneActive = 13,
kHeistIntro = 14,
kPlaneTakedown = 15, // not sure what this is
kDistractCops = 16, // "Great. Thank you for your help. Now some horrible criminals are in jail for a crime they did commit and it's all your fault!!" ???
kDestroyVehicle = 17, // ???
kPartakingInHotTarget = 18,
kPartakingInKillList = 19,
kTimeTrialStarted = 21,
kPartakingInCheckpoints = 22,
kPartakingInChallenge = 23,
kPennedInActive = 24,
kRCTimeTrialStarted = 25,
kPartakingInHotProperty = 27,
kPartakingInKingOfTheCastle = 29,
kPartakingInCriminalDamage = 30,
kLowriderIntro = 31
};
enum class eGamerTagFlags
{
kShowPackageCount = 13,
kFadeOutGamerTag = 17,
kGangCEO = 19,
kGangBiker = 20
}; // TODO!
enum class eOrbitalBitset
{
kOrbitalCannonActive = 0,
kWatchingMovie = 1, // not a typo, the orbital cannon script needs to know if you are inside a movie theater for some strange reason
kCutsceneOrInterior = 2,
kTransactionPending = 3
};
enum class eArcadeGameBitset
{
kArcadeMachineActivated = 0,
kLoveMeterActivated = 1,
kLoveMeterAnimationGenderDecided = 2
};
enum class eOutOfSightFlags
{
kOutOfSightEnabled = 0,
kOutOfSightActive = 1, // this controls whether you appear on radar or not
kHelpDisplayed = 2,
kDamagedPlayerOutsideOrganization = 3
};
enum class eSimpleInteriorIndex
{
SIMPLE_INTERIOR_INVALID = -1,
SIMPLE_INTERIOR_WAREHOUSE_1,
SIMPLE_INTERIOR_WAREHOUSE_2,
SIMPLE_INTERIOR_WAREHOUSE_3,
SIMPLE_INTERIOR_WAREHOUSE_4,
SIMPLE_INTERIOR_WAREHOUSE_5,
SIMPLE_INTERIOR_WAREHOUSE_6,
SIMPLE_INTERIOR_WAREHOUSE_7,
SIMPLE_INTERIOR_WAREHOUSE_8,
SIMPLE_INTERIOR_WAREHOUSE_9,
SIMPLE_INTERIOR_WAREHOUSE_10,
SIMPLE_INTERIOR_WAREHOUSE_11,
SIMPLE_INTERIOR_WAREHOUSE_12,
SIMPLE_INTERIOR_WAREHOUSE_13,
SIMPLE_INTERIOR_WAREHOUSE_14,
SIMPLE_INTERIOR_WAREHOUSE_15,
SIMPLE_INTERIOR_WAREHOUSE_16,
SIMPLE_INTERIOR_WAREHOUSE_17,
SIMPLE_INTERIOR_WAREHOUSE_18,
SIMPLE_INTERIOR_WAREHOUSE_19,
SIMPLE_INTERIOR_WAREHOUSE_20,
SIMPLE_INTERIOR_WAREHOUSE_21,
SIMPLE_INTERIOR_WAREHOUSE_22,
SIMPLE_INTERIOR_FACTORY_METH_1,
SIMPLE_INTERIOR_FACTORY_WEED_1,
SIMPLE_INTERIOR_FACTORY_CRACK_1,
SIMPLE_INTERIOR_FACTORY_MONEY_1,
SIMPLE_INTERIOR_FACTORY_DOCUMENTS_1,
SIMPLE_INTERIOR_FACTORY_METH_2,
SIMPLE_INTERIOR_FACTORY_WEED_2,
SIMPLE_INTERIOR_FACTORY_CRACK_2,
SIMPLE_INTERIOR_FACTORY_MONEY_2,
SIMPLE_INTERIOR_FACTORY_DOCUMENTS_2,
SIMPLE_INTERIOR_FACTORY_METH_3,
SIMPLE_INTERIOR_FACTORY_WEED_3,
SIMPLE_INTERIOR_FACTORY_CRACK_3,
SIMPLE_INTERIOR_FACTORY_MONEY_3,
SIMPLE_INTERIOR_FACTORY_DOCUMENTS_3,
SIMPLE_INTERIOR_FACTORY_METH_4,
SIMPLE_INTERIOR_FACTORY_WEED_4,
SIMPLE_INTERIOR_FACTORY_CRACK_4,
SIMPLE_INTERIOR_FACTORY_MONEY_4,
SIMPLE_INTERIOR_FACTORY_DOCUMENTS_4,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_POLICE_STATION,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MC_CLUBHOUSE,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ROCKFORD,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PILLBOX,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_ALTA,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_BURTON,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_PALETO,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_GRAND_SENORA,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BANK_CHUMASH,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ROCKCLUB,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_2,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_3,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_CHICKEN_FACTORY_PART_4,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FARMHOUSE,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HEIST_YACHT,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_RECYCLING_PLANT,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB,
SIMPLE_INTERIOR_IE_WAREHOUSE_1,
SIMPLE_INTERIOR_IE_WAREHOUSE_2,
SIMPLE_INTERIOR_IE_WAREHOUSE_3,
SIMPLE_INTERIOR_IE_WAREHOUSE_4,
SIMPLE_INTERIOR_IE_WAREHOUSE_5,
SIMPLE_INTERIOR_IE_WAREHOUSE_6,
SIMPLE_INTERIOR_IE_WAREHOUSE_7,
SIMPLE_INTERIOR_IE_WAREHOUSE_8,
SIMPLE_INTERIOR_IE_WAREHOUSE_9,
SIMPLE_INTERIOR_IE_WAREHOUSE_10,
SIMPLE_INTERIOR_BUNKER_1,
SIMPLE_INTERIOR_BUNKER_2,
SIMPLE_INTERIOR_BUNKER_3,
SIMPLE_INTERIOR_BUNKER_4,
SIMPLE_INTERIOR_BUNKER_5,
SIMPLE_INTERIOR_BUNKER_6,
SIMPLE_INTERIOR_BUNKER_7,
SIMPLE_INTERIOR_BUNKER_9,
SIMPLE_INTERIOR_BUNKER_10,
SIMPLE_INTERIOR_BUNKER_11,
SIMPLE_INTERIOR_BUNKER_12,
SIMPLE_INTERIOR_ARMORY_TRUCK_1,
SIMPLE_INTERIOR_CREATOR_TRAILER_1,
SIMPLE_INTERIOR_HANGAR_1,
SIMPLE_INTERIOR_HANGAR_2,
SIMPLE_INTERIOR_HANGAR_3,
SIMPLE_INTERIOR_HANGAR_4,
SIMPLE_INTERIOR_HANGAR_5,
SIMPLE_INTERIOR_ARMORY_AIRCRAFT_1,
SIMPLE_INTERIOR_DEFUNCT_BASE_1,
SIMPLE_INTERIOR_DEFUNCT_BASE_2,
SIMPLE_INTERIOR_DEFUNCT_BASE_3,
SIMPLE_INTERIOR_DEFUNCT_BASE_4,
SIMPLE_INTERIOR_DEFUNCT_BASE_6,
SIMPLE_INTERIOR_DEFUNCT_BASE_7,
SIMPLE_INTERIOR_DEFUNCT_BASE_8,
SIMPLE_INTERIOR_DEFUNCT_BASE_9,
SIMPLE_INTERIOR_DEFUNCT_BASE_10,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MEDIUM_GARAGE,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LOWEND_STUDIO,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MIDEND_APARTMENT,
SIMPLE_INTERIOR_CREATOR_AIRCRAFT_1,
SIMPLE_INTERIOR_HUB_LA_MESA,
SIMPLE_INTERIOR_HUB_MISSION_ROW,
SIMPLE_INTERIOR_HUB_STRAWBERRY_WAREHOUSE,
SIMPLE_INTERIOR_HUB_WEST_VINEWOOD,
SIMPLE_INTERIOR_HUB_CYPRESS_FLATS,
SIMPLE_INTERIOR_HUB_LSIA_WAREHOUSE,
SIMPLE_INTERIOR_HUB_ELYSIAN_ISLAND,
SIMPLE_INTERIOR_HUB_DOWNTOWN_VINEWOOD,
SIMPLE_INTERIOR_HUB_DEL_PERRO_BUILDING,
SIMPLE_INTERIOR_HUB_VESPUCCI_CANALS,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SHERIFF2,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_UNION_DEPOSITORY_CARPARK,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_SIMEON_SHOWROOM,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_ABATTOIR,
SIMPLE_INTERIOR_HACKER_TRUCK,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_JEWEL_STORE,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_LIFE_INVADER,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_DJ_YACHT,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MELANOMA_GARAGE,
SIMPLE_INTERIOR_ARENA_GARAGE_1,
SIMPLE_INTERIOR_CASINO,
SIMPLE_INTERIOR_CASINO_APT,
SIMPLE_INTERIOR_CASINO_VAL_GARAGE,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_HAYES_AUTOS,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_METH_LAB,
SIMPLE_INTERIOR_ARCADE_PALETO_BAY,
SIMPLE_INTERIOR_ARCADE_GRAPESEED,
SIMPLE_INTERIOR_ARCADE_DAVIS,
SIMPLE_INTERIOR_ARCADE_WEST_VINEWOOD,
SIMPLE_INTERIOR_ARCADE_ROCKFORD_HILLS,
SIMPLE_INTERIOR_ARCADE_LA_MESA,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FIB_BUILDING,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_BIOLAB_AND_TUNNEL,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_FOUNDRY,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_MAX_RENDA,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_2,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_3,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_4,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_5,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_AIRCRAFT_CARRIER_PART_6,
SIMPLE_INTERIOR_RESTRICTED_INTERIOR_OMEGA,
SIMPLE_INTERIOR_SOLOMONS_OFFICE,
SIMPLE_INTERIOR_CASINO_NIGHTCLUB,
SIMPLE_INTERIOR_SUBMARINE,
SIMPLE_INTERIOR_MUSIC_STUDIO,
SIMPLE_INTERIOR_AUTO_SHOP_LA_MESA,
SIMPLE_INTERIOR_AUTO_SHOP_STRAWBERRY,
SIMPLE_INTERIOR_AUTO_SHOP_BURTON,
SIMPLE_INTERIOR_AUTO_SHOP_RANCHO,
SIMPLE_INTERIOR_AUTO_SHOP_MISSION_ROW,
SIMPLE_INTERIOR_CAR_MEET,
SIMPLE_INTERIOR_FIXER_HQ_HAWICK,
SIMPLE_INTERIOR_FIXER_HQ_ROCKFORD,
SIMPLE_INTERIOR_FIXER_HQ_SEOUL,
SIMPLE_INTERIOR_FIXER_HQ_VESPUCCI,
SIMPLE_INTERIOR_ACID_LAB,
SIMPLE_INTERIOR_JUGGALO_HIDEOUT,
SIMPLE_INTERIOR_MULTISTOREY_GARAGE
};
struct JOB_STATS
{
SCR_INT Wins;
SCR_INT Losses;
SCR_INT Kills;
SCR_INT Deaths;
SCR_INT PAD_0004; // unused
};
struct JOB_BET
{
SCR_INT PAD_0000; // TODO
SCR_INT Amount;
};
struct MISSION_BETS
{
SCR_INT Identifier; // a random integer between 100 and 10000000
JOB_STATS Stats;
SCR_ARRAY<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;
SCR_INT PlayerVehicleBlipType; // can be used to spoof your blip as a tank, oppressor etc
SCR_INT IdleDurationUntilBlipIsVisible;
SCR_INT BlipVisibleDuration;
SCR_INT MissionInteriorIndex; // can be used to spoof blip position
SCR_VEC3 MissionInteriorBlipLocation;
SCR_FLOAT MissionInteriorBlipRotation;
SCR_BOOL UnknownOverride; // can also be used to spoof position
SCR_VEC3 UnknownOverridePosition;
};
static_assert(sizeof(PLAYER_BLIP) == 15 * 8);
struct YACHT_APPEARANCE
{
SCR_INT PAD_0000; // TODO
SCR_INT PAD_0001;
SCR_INT PAD_0002;
SCR_INT PAD_0003;
SCR_INT PAD_0004;
TEXT_LABEL_63 Name;
SCR_HASH NameHash;
};
static_assert(sizeof(YACHT_APPEARANCE) == 22 * 8);
struct YACHT_DATA
{
SCR_BOOL HasYacht;
SCR_VEC3 Position;
SCR_INT TravelStage;
SCR_BOOL TravelInProgress;
SCR_ARRAY<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;
alignas(8) eSimpleInteriorIndex Index;
SCR_INT InstanceId;
SCR_INT AllowedGoons;
PLAYER_INDEX Owner;
PLAYER_INDEX VehicleOwner;
SCR_VEC3 SpecialVehicleSpawnPosition;
SCR_FLOAT SpecialVehicleSpawnHeading;
SCR_INT EnteringSimpleInteriorIndex;
SCR_INT SpecialVehicleSimpleInteriorIndex; // MOC, Terrorbyte etc
alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex;
alignas(8) eSimpleInteriorIndex UnkSimpleInteriorIndex2;
SCR_VEC3 AvengerPosition;
SCR_VEC3 AvengerPosition2; // not sure how this is different from the field above
SCR_FLOAT AvengerHeading;
SCR_INT MissionSpawnSimpleInteriorIndex;
SCR_INT InteriorSubtype; // nightclub vs nightclub garage etc
};
static_assert(sizeof(SMPL_INTERIOR_DATA) == 29 * 8);
// yes there's a struct for leaving your clubhouse
struct LEAVE_CLUBHOUSE
{
SCR_BOOL Active;
SCR_BOOL Active2;
SCR_INT Identifier;
SCR_INT ExitLocation;
SCR_ARRAY<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;
uint64_t PAD_0001[32]; // TODO
SCR_INT PlayersVisible;
SCR_INT PlayersTracked;
SCR_BITSET<eAnimationBitset> AnimationBitset;
SCR_INT NumSuccessfulHoldups; // resets every 12 minutes
SCR_INT PAD_0037;
SCR_INT PersonalVehicleNetId;
SCR_INT UnkVehicleNetId;
SCR_INT UnkVehicleNetId2;
SCR_ARRAY<uint64_t, 2> UnkVehicleNetIds;
SCR_INT DeliveryMechanicNetId;
SCR_INT DeliveryMechanicNetId2;
SCR_INT SpawningVehicleLiveryIndex;
SCR_INT SpawningVehiclePrimaryColor;
SCR_INT SpawningVehicleSecondaryColor;
SCR_INT AvengerNetId;
SCR_INT DeliveryMechanicNetId3; // wtf is this?
SCR_INT TerrorbyteNetId; // or is it the MOC?
SCR_INT SubmarineNetId;
SCR_INT DinghyNetId;
SCR_INT DeliveryMechanicNetId4; // another one...
SCR_INT AcidLabNetId;
SCR_INT DeliveryBikeNetId; // this is a guess, verify
SCR_BOOL PAD_0057;
uint64_t PAD_0058[15]; // confirmed these are not used by PC scripts
PLAYER_BLIP PlayerBlip;
SCR_BOOL NeedToPopulateSessionStartTime; // the session start time is unused
uint64_t PAD_0089[32]; // TODO
alignas(8) eMissionType MissionType;
SCR_BOOL SpawningVehicle;
uint64_t PAD_0123[3]; // confirmed these are not used by PC scripts
MISSION_BETS MissionBets;
SCR_BOOL RadarBlipVisibliltyMechanicEnabled;
SCR_BITSET<ePlayerStateFlags> PlayerStateFlags;
SCR_INT PlayerStateFlags2; // TODO
SCR_INT PlayerStateFlags3; // TODO
SCR_INT CarMeetModShopSlotPreTakeover;
PLAYER_INDEX CurrentCarMeetSlotOwnerIndex; // can be player or player's CEO/MC leader
SCR_INT CarMeetModShopSlotPostTakeover;
SCR_HASH CarMeetModdingVehicleModel;
PLAYER_INDEX CarMeetCurrentlySeatedVehicleOwner;
SCR_VEC3 PlayerPosition; // updates every two seconds, used by spectate
SCR_BOOL OffRadarActive;
SCR_BOOL PassengerOfVehicleWithOffRadarDriver;
SCR_BOOL GoonOfBossWithOffRadar;
SCR_BOOL RevealPlayersActive;
PLAYER_INDEX RemoteWantedLevelPlayer; // cut content but still works
SCR_INT RemoteWantedLevelAmount;
PLAYER_INDEX RemoteWantedLevelRemovePlayer; // doesn't work at all
SCR_INT UnkTeleportStage;
SCR_BITSET<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 PAD_0246; // TODO
SCR_INT CurrentStoreIndex; // the stores in the map which can be held up
SCR_BOOL ShopActive; // any shop
SCR_BOOL InTaxi;
SCR_INT Haircut;
SCR_INT PrimaryHairColor;
SCR_INT SecondaryHairColor;
SCR_INT FriendlyPlayers; // bitset of player team relgroups that obtain a Respect relationship with player
SCR_BOOL KilledByPlayer; // verify
SCR_BOOL InImpromptuDeathmatch;
SCR_VEC3 ImpromptuDeatmatchStartPosition;
SCR_INT PAD_0569; // not read by scripts, impromptu DM related
SCR_INT MissionLoseAnimType;
SCR_INT MissionWinAnimType; // verify
SCR_INT MissionCrewAnimType;
SCR_INT RallyRaceAnim;
SCR_BOOL IsRallyRace;
SCR_BOOL JustGetsPulledOutWhenElectrocuted;
SCR_INT HeistCutSelectionStage; // the only valid values seem to be 6 and 7
SCR_BOOL IsBadsport;
SCR_FLOAT MentalState;
SCR_BOOL IsRockstarDev; // dev dlc check and not the CNetGamePlayer flag so can be used to detect YimMenu
SCR_BOOL ScreenFadedOut;
SCR_BOOL TimeTrialActive;
YACHT_DATA YachtData;
SMPL_INTERIOR_DATA SimpleInteriorData;
SCR_BOOL PAD_0350; // TODO
SCR_INT PAD_0351; // unused vehicle/interior stuff
SCR_BOOL ShowMOCBlip;
SCR_BOOL ShowAvengerBlip;
SCR_BOOL ShowTerrorbyteBlip;
SCR_BOOL ShowSubmarineBlip;
SCR_BOOL ShowDinghyBlip;
SCR_BOOL ShowDeliveryBikeBlip;
SCR_BOOL ShowAcidLabBlip;
LEAVE_CLUBHOUSE LeaveClubhouse;
SCR_INT Friends; // bitset of players that are friends
SCR_VEC3 InteriorVehiclePosition; // for terrorbyte and MOC, used to fake player blip position on map
SCR_FLOAT InteriorVehicleHeading;
SCR_VEC3 AcidLabPosition; // not read by the scripts
SCR_FLOAT AcidLabHeading;
SCR_INT VehicleTurretsActive; // bitset
SCR_ARRAY<SCR_VEC3, 3> VehicleTurretsCameraPosition;
SCR_INT PAD_0416; // TODO
SCR_BOOL DozerDetected; // very shady stuff, anticheat?
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;
SCR_INT OrbitalBitset2; // ugh
SCR_INT CurrentlyUsingArenaTrapIndex;
SCR_INT CurrentlyUsingArenaTrapActivatedTime;
ARCADE_GAME ArcadeGame;
SCR_INT DancePartner;
SCR_INT PAD_0445;
SCR_INT BeachPartyFlags;
uint64_t PAD_0477[10]; // I don't think we'll ever be able to figure out what this does
SCR_INT ThreeCardPokerStyle;
SCR_INT BlackjackStyle;
SCR_BITSET<eOutOfSightFlags> OutOfSightFlags;
SCR_VEC3 OutOfSightArea;
SCR_INT AmmunationWeaponPartFlags;
PLAYER_INDEX LastKilledBy;
SCR_BOOL CanSpawnGunVan;
};
static_assert(sizeof(GlobalPlayerBDEntry) == 466 * 8);
struct GlobalPlayerBD
{
SCR_ARRAY<GlobalPlayerBDEntry, 32> Entries;
};
static_assert(sizeof(GlobalPlayerBD) == 14913 * 8);

View File

@ -0,0 +1,16 @@
#pragma once
#include "../types.hpp"
#include "../Timer.hpp"
struct g_AMC_playerBD_Entry
{
SCR_ARRAY<TIMER, 79> UsedContactServicesTimer; // only index 2 (mugger) is actually used by the scripts. the rest is just a waste of bandwidth
SCR_ARRAY<uint64_t, 79> ContactServiceCooldowns; // same as above
};
static_assert(sizeof(g_AMC_playerBD_Entry) == 239 * 8);
struct g_AMC_playerBD
{
SCR_ARRAY<g_AMC_playerBD_Entry, 32> Entries;
};
static_assert(sizeof(g_AMC_playerBD) == 7649 * 8);

93
script/scrVector.hpp Normal file
View File

@ -0,0 +1,93 @@
#pragma once
#include "../rage/vector.hpp"
namespace rage
{
class scrVector
{
public:
scrVector() = default;
scrVector(rage::fvector3 vec) :
x(vec.x), y(vec.y), z(vec.z)
{
}
scrVector(float x, float y, float z) :
x(x), y(y), z(z)
{
}
scrVector operator+(const scrVector& other)
{
scrVector vec;
vec.x = this->x + other.x;
vec.y = this->y + other.y;
vec.z = this->z + other.z;
return vec;
}
scrVector operator-(const scrVector& other)
{
scrVector vec;
vec.x = this->x - other.x;
vec.y = this->y - other.y;
vec.z = this->z - other.z;
return vec;
}
scrVector operator*(const scrVector& other)
{
scrVector vec;
vec.x = this->x * other.x;
vec.y = this->y * other.y;
vec.z = this->z * other.z;
return vec;
}
scrVector operator*(const float& other)
{
scrVector vec;
vec.x = this->x * other;
vec.y = this->y * other;
vec.z = this->z * other;
return vec;
}
alignas(8) float x{};
alignas(8) float y{};
alignas(8) float z{};
};
}
class Vector2 final
{
public:
Vector2() = default;
Vector2(float x, float y)
: x(x), y(y)
{
}
public:
alignas(8) float x;
alignas(8) float y;
};
class Vector4 final
{
public:
Vector4() = default;
Vector4(float x, float y, float z, float w)
: x(x), y(y), z(z), w(w)
{
}
public:
alignas(8) float x;
alignas(8) float y;
alignas(8) float z;
alignas(8) float w;
};

102
script/types.hpp Normal file
View File

@ -0,0 +1,102 @@
#pragma once
#include <cstdint>
#include <cstdbool>
#include "scrVector.hpp"
#ifndef BOOL
#define BOOL int
#endif
using Void = void;
using Any = int;
using Hash = std::uint32_t;
using Entity = std::int32_t;
using Player = std::int32_t;
using FireId = std::int32_t;
using Interior = std::int32_t;
using Ped = Entity;
using Vehicle = Entity;
using Cam = std::int32_t;
using Object = Entity;
using Pickup = Object;
using Blip = std::int32_t;
using Camera = Entity;
using ScrHandle = Entity;
using Vector3 = rage::scrVector;
#define PLAYER_INDEX alignas(8) Player
#define ENTITY_INDEX alignas(8) Entity
#define PED_INDEX alignas(8) Ped
#define VEHICLE_INDEX alignas(8) Vehicle
#define INTERIOR_INDEX alignas(8) Interior
#define NETWORK_INDEX alignas(8) int
#define SCR_HASH alignas(8) Hash
#define SCR_INT alignas(8) int
#define SCR_BOOL alignas(8) BOOL
#define SCR_FLOAT alignas(8) float
#define SCR_VEC3 Vector3
template <int SIZE>
struct SCR_TEXT_LABEL
{
alignas(8) char Data[SIZE];
private:
alignas(8) char _PAD[SIZE];
public:
operator char* () { return Data; }
};
#define TEXT_LABEL_15 SCR_TEXT_LABEL<16>
#define TEXT_LABEL_23 SCR_TEXT_LABEL<24>
#define TEXT_LABEL_31 SCR_TEXT_LABEL<32>
#define TEXT_LABEL_63 SCR_TEXT_LABEL<64>
template <typename T, int SIZE>
struct SCR_ARRAY
{
SCR_INT Size;
alignas(8) T Data[SIZE];
T& operator [](int index)
{
return Data[index];
}
};
template <typename T>
struct SCR_BITSET
{
alignas(8) int Value;
bool IsSet(T val)
{
return Value & (1 << (int)val);
}
void Set(T val)
{
Value |= (1 << (int)val);
}
void Clear(T val)
{
Value &= ~(1 << (int)val);
}
};
struct Color3
{
SCR_INT R;
SCR_INT G;
SCR_INT B;
};
static_assert(sizeof(Color3) == 3 * 8);
// serialized bitbuffer data of rage::rlGamerHandle + some padding for last gen compatibility
struct GAMER_HANDLE
{
private:
uint64_t Data[13];
};
static_assert(sizeof(GAMER_HANDLE) == 13 * 8);