Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion SSV2/includes/classes/gta/CPlayerInfo.lua
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ end
---@return int64_t
function CPlayerInfo:GetRockstarID()
return self:__safecall(0, function()
return self.m_rl_gamer_info.m_rockstar_id:get_int()
return self.m_rl_gamer_info:GetRockstarID()
end)
end

Expand Down
11 changes: 2 additions & 9 deletions SSV2/includes/classes/gta/phFragInst.lua
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
--------------------------------------
-- Class: phFragInst
--------------------------------------
-- TODO: research this nonsensical thing or remove it.
---@class phFragInst
---@field protected m_ptr pointer
---@field public m_cache_entry pointer
Expand All @@ -18,15 +19,7 @@
---@field public m_obj_matrices pointer<fMatrix44[]> `rage::fMatrix44`
---@field public m_global_matrices pointer<fMatrix44[]> `rage::fMatrix44`
---@overload fun(addr: pointer): phFragInst
local phFragInst = {}
phFragInst.__index = phFragInst
phFragInst.__type = "phFragInst"
---@diagnostic disable-next-line: param-type-mismatch
setmetatable(phFragInst, {
__call = function(cls, ...)
return cls.new(...)
end,
})
local phFragInst = Callable("phFragInst")

---@param ptr pointer
---@return phFragInst|nil
Expand Down
47 changes: 26 additions & 21 deletions SSV2/includes/classes/gta/rlGamerInfo.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,11 @@ local CStructView = require("includes.classes.gta.CStructView")
---@field private m_decimal uint32_t
---@field private m_packed vec4
---@overload fun(n: uint32_t): IPAddress
local IPAddress <const> = {}
IPAddress.__index = IPAddress
---@diagnostic disable-next-line
setmetatable(IPAddress, {
__call = function(t, ...)
return t.new(...)
end
})
local IPAddress <const> = Callable("IPAddress", { ctor = function(t, n) return t:new(n) end })

---@param n uint32_t
---@return IPAddress
function IPAddress.new(n)
function IPAddress:new(n)
local packed = vec4:zero()
if (n ~= 0) then
packed = vec4:new(
Expand All @@ -41,8 +34,7 @@ function IPAddress.new(n)
return setmetatable({
m_decimal = n,
m_packed = packed
---@diagnostic disable-next-line
}, IPAddress)
}, self)
end

---@return string
Expand All @@ -60,14 +52,16 @@ end
-- Class: rlGamerInfo
--------------------------------------
---@class rlGamerInfo : CStructBase<rlGamerInfo>
---@field m_peer_id pointer<uint64_t>
---@field m_rockstar_id pointer<int64_t>
---@field m_external_ip pointer<uint32_t>
---@field m_external_port pointer<uint16_t>
---@field m_internal_ip pointer<uint32_t>
---@field m_internal_port pointer<uint16_t>
---@field m_nat_type pointer<uint32_t>
---@field m_player_name pointer<string> // 0x00DC
---@field private m_peer_id pointer<uint64_t>
---@field private m_rockstar_id pointer<int64_t>
---@field private m_external_ip pointer<uint32_t>
---@field private m_external_port pointer<uint16_t>
---@field private m_internal_ip pointer<uint32_t>
---@field private m_internal_port pointer<uint16_t>
---@field private m_nat_type pointer<uint32_t>
---@field private m_player_name pointer<string> // 0x00DC
---@field private m_cached_extern_ipaddr IPAddress
---@field private m_cached_intern_ipaddr IPAddress
---@overload fun(ptr: pointer): rlGamerInfo
local rlGamerInfo = CStructView("rlGamerInfo", 0x0F90)

Expand All @@ -88,14 +82,25 @@ function rlGamerInfo.new(ptr)
}, rlGamerInfo)
end

---@return int64_t
function rlGamerInfo:GetRockstarID()
return self.m_rockstar_id:get_int()
end

---@return IPAddress
function rlGamerInfo:GetExternalIP()
return IPAddress(self.m_external_ip:get_dword())
if (not self.m_cached_extern_ipaddr) then
self.m_cached_extern_ipaddr = IPAddress(self.m_external_ip:get_dword())
end
return self.m_cached_extern_ipaddr
end

---@return IPAddress
function rlGamerInfo:GetInternalIP()
return IPAddress(self.m_internal_ip:get_dword())
if (not self.m_cached_intern_ipaddr) then
self.m_cached_intern_ipaddr = IPAddress(self.m_internal_ip:get_dword())
end
return self.m_cached_intern_ipaddr
end

---@return string
Expand Down
22 changes: 22 additions & 0 deletions SSV2/includes/data/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ local Config <const> = {
subwoofer = false,
horn_beams = false,
fast_vehicles = false,
fast_vehicles_speed = 10,
auto_brake_lights = false,
iv_exit = false,
no_wheel_recenter = false,
Expand All @@ -205,6 +206,7 @@ local Config <const> = {
auto_lock_doors = false,
cobra_maneuver = false,
fast_jets = false,
fast_jets_speed = 150.0,
no_jet_stall = false,
no_turbulence = false,
aircraft_mg = {
Expand Down Expand Up @@ -340,6 +342,26 @@ local Config <const> = {
sy_disable_rob_weekly_cd = false,
sy_disable_tow_cd = false,
unsafe_feats_enabled = false,
office_clutter = {
auto_disable = false,
items = {
cash = false,
Swag_Silver = false,
Swag_Pills = false,
Swag_Med = false,
Swag_JewelWatch = false,
Swag_Ivory = false,
Swag_Guns = false,
Swag_Gems = false,
Swag_Furcoats = false,
Swag_electronic = false,
Swag_DrugStatue = false,
Swag_DrugBags = false,
Swag_Counterfeit = false,
Swag_Booze_cigs = false,
Swag_Art = false,
}
}
},
yim_actions = {
auto_close_ped_window = false,
Expand Down
19 changes: 12 additions & 7 deletions SSV2/includes/features/Speedometer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

local gui_registered = false
local last_engine_state = true
local last_captured_top_spd = 0.0
local RUNTIME_COLORS <const> = {
INDICATOR_RED = Color(1.0, 0.215, 0.215, 1.0):AsU32(),
INDICATOR_GREEN = Color(0.1, 0.91, 0.0, 1.0):AsU32(),
Expand Down Expand Up @@ -88,21 +89,25 @@ local Speedometer = {
}; Speedometer.__index = Speedometer

---@public
function Speedometer:UpdateState()
---@param PV PlayerVehicle
function Speedometer:UpdateState(PV)
local state = self._state
local PV = LocalPlayer:GetVehicle()
if not (PV and PV:IsValid()) then
state.should_draw = false
return
end

local speed_modifier = Match(GVars.features.speedometer.speed_unit, UNIT_MULTIPLIERS)
local fast_vehicles = GVars.features.vehicle.fast_vehicles
local IsEngineOn = PV:IsEngineOn()
local speed_modifier = Match(GVars.features.speedometer.speed_unit, UNIT_MULTIPLIERS)
local IsEngineOn = PV:IsEngineOn()
local IsNosActive = PV:IsNOSActive()
if (not IsNosActive) then
last_captured_top_spd = PV:GetMaxSpeed()
end

state.PV = PV
state.speed_modifier = speed_modifier
state.CurrentSpeed = PV:GetSpeed() * speed_modifier
state.MaxSpeed = math.floor((PV:GetDefaultMaxSpeed() * (fast_vehicles and 1.8 or 1)) * speed_modifier)
state.MaxSpeed = math.floor(last_captured_top_spd * speed_modifier)
state.CurrentAltitude = PV:GetHeightAboveGround()
state.Manufacturer = PV:GetManufacturerName()
state.IsEngineOn = IsEngineOn
Expand All @@ -111,7 +116,7 @@ function Speedometer:UpdateState()
state.IsABSEngaged = PV:IsABSEngaged()
state.IsESCEngaged = PV:IsESCEngaged()
state.IsESCDisabled = get_is_tc_esc_dsabled(PV)
state.IsNOSActive = PV:IsNOSActive()
state.IsNOSActive = IsNosActive
state.IsAircraft = PV:IsPlane() or PV:IsHeli()
state.IsSports = PV:IsSportsOrSuper()
state.IsShootingFlares = PV.m_is_shooting_flares
Expand Down
17 changes: 14 additions & 3 deletions SSV2/includes/features/online/yim_resupplier/YimResupplierV3.lua
Original file line number Diff line number Diff line change
Expand Up @@ -130,25 +130,36 @@ function YRV3:Reset(disable, reason)
self.m_last_autosell_check_time = 0
self.m_last_income_check_time = 0
self.m_last_business_update_time = 0
self.m_businesses = { safes = {} }
self.m_boss_types_avail = { { name = "GB_BOSS" --[[VIP]], id = 0 } }
self.m_sell_script_running = false
self.m_initial_data_done = false
self.m_data_initialized = false
self.m_autosell_state = Enums.eAutoSellState.NONE
self.m_state = disable and Enums.eYRState.ERROR or Enums.eYRState.IDLE

for _, business in self:BusinessIter() do
local reset = business.Reset
if (reset) then
---@diagnostic disable-next-line
reset(business)
end
end; self.m_businesses = { safes = {} }

if (disable) then
self:SetLastError(reason or "Unhandled Exception.")
end
end

function YRV3:Reload()
if (self.m_state == Enums.eYRState.RELOADING) then
return
end

self.m_state = Enums.eYRState.RELOADING
ThreadManager:Run(function()
self.m_state = Enums.eYRState.RELOADING
self.m_total_sum = 0
self.m_total_sum_fmt = "$0"
sleep(1500) -- dummy busy wait to give the UI time to refresh
sleep(1500) -- dummy busy wait
self:Reset()
end)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
---@field private m_name string
---@field private m_coords vec3
---@field private m_generic_val_get_func fun(): anyval
---@field private m_generic_val_set_func function
---@field private m_generic_val_set_func fun(...: any)
---@field protected m_is_stale boolean
local BasicBusiness = {}
BasicBusiness.__index = BasicBusiness
Expand Down Expand Up @@ -52,8 +52,8 @@ function BasicBusiness:GetGenericValue()
return self.m_generic_val_get_func()
end

function BasicBusiness:SetGenericValue()
self.m_generic_val_set_func()
function BasicBusiness:SetGenericValue(...)
self.m_generic_val_set_func(...)
end

return BasicBusiness
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ BusinessHub.__index = BusinessHub
---@param opts HubOpts
---@return BusinessHub
function BusinessHub.new(opts)
assert(type(opts.max_units) == "number", "Missing argument: max_units<integer>")
local id = opts.id
assert(type(opts.id) == "number" and math.is_inrange(opts.id, 0, 6), "Invalid Business Hub id.")
assert(type(opts.max_units) == "number", "Missing argument: max_units<integer>")
assert(type(id) == "number" and math.is_inrange(id, 0, 6), "Invalid Business Hub id.")

local base = BusinessBase.new(opts)
local instance = setmetatable(base, BusinessHub) ---@cast instance BusinessHub
Expand Down Expand Up @@ -100,7 +100,7 @@ end
-- Actually wanted to improve UX with tech names using the return index
--
-- but apparently only Yohan has a name. We should probably return a bool instead
---@return integer TechIndex A number between 0 and 5 or -1 if no one is assigned.
---@return integer techIndex A number between 0 and 5 or -1 if no one is assigned.
function BusinessHub:GetAssignedTechIndex()
for i = 0, 5 do
if (self:IsTechAssignedToThis(i)) then
Expand Down Expand Up @@ -192,7 +192,8 @@ end
-- https://www.youtube.com/watch?v=-Gh1lTcwdGY
---@private
function BusinessHub:InstantFillProduction()
self:TriggerProduction(self:GetMaxUnits() - 1)
self:SetProductCount(self:GetMaxUnits() - 1)
self:TriggerProduction()
end

---@return boolean
Expand All @@ -207,6 +208,11 @@ end

---@private
function BusinessHub:LoopProduction()
if (self.m_fast_prod_running) then
return
end

self.m_fast_prod_running = true
ThreadManager:Run(function()
while (self:IsValid() and self.fast_prod_enabled and not self:HasFullProduction()) do
self:TriggerProduction()
Expand All @@ -230,7 +236,6 @@ function BusinessHub:Update()
return
end

self.m_fast_prod_running = true
self:LoopProduction()
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,9 @@ CarWash.__index = CarWash
---@param opts BasicBusinessOpts
---@return CarWash
function CarWash.new(opts)
local base = BasicBusiness.new(opts)
local instance = setmetatable(base, CarWash) ---@cast instance CarWash
local cashSafe = CashSafe.new({
local base = BasicBusiness.new(opts)
local instance = setmetatable(base, CarWash) ---@cast instance CarWash
local cashSafe = CashSafe.new({
name = opts.name,
cash_value_stat = "MPX_CWASH_SAFE_CASH_VALUE",
paytime_stat = "MPX_CWASH_PAY_TIME_LEFT",
Expand All @@ -159,6 +159,7 @@ function CarWash.new(opts)
get_max_cash = function() return tunables.get_int("TYCOON_CAR_WASH_SAFE_MAX_STORAGE_AMOUNT") end,
})


local sgslObj = SGSL:Get(SGSL.data.car_wash_safe_global)
local pidSize = sgslObj:GetOffset(1)
local entryOffset = sgslObj:GetOffset(2)
Expand All @@ -169,16 +170,18 @@ function CarWash.new(opts)
:At(27)
:At(2)

instance.m_safe = cashSafe
instance.m_duffle = CarWashDuffle.new({

instance.m_safe = cashSafe
instance.m_duffle = CarWashDuffle.new({
name = opts.name,
cash_value_stat = "MPX_CAR_WASH_DUFFEL_VALUE",
get_max_cash = function() return tunables.get_int(564305888) end
})

instance.m_subs = {}

local subs = {}
if (stats.get_int("MPX_SB_WEED_SHOP_OWNED") ~= 0) then
table.insert(instance.m_subs, CarWashSubBusiness.new({
table.insert(subs, CarWashSubBusiness.new({
name = Game.GetLabelText("CELL_WSHOP"),
coords = vec3:new(-1162.051147, -1564.757202, 4.410227),
heat_packed_stat = 24925,
Expand All @@ -188,7 +191,7 @@ function CarWash.new(opts)
end

if (stats.get_int("MPX_SB_HELI_TOURS_OWNED") ~= 0) then
table.insert(instance.m_subs, CarWashSubBusiness.new({
table.insert(subs, CarWashSubBusiness.new({
name = Game.GetLabelText("CELL_HELIT"),
coords = vec3:new(-753.524841, -1511.244751, 5.015130),
heat_packed_stat = 24926,
Expand All @@ -197,6 +200,7 @@ function CarWash.new(opts)
}))
end

instance.m_subs = subs
return instance
end

Expand Down
Loading