6 Commits
1.4 ... 1.6

Author SHA1 Message Date
50ef5ae23d Update package.yml Workflow for Recursive Packaging
All checks were successful
Package BeamNG.drive mod / Build (push) Successful in 5s
2025-12-11 13:15:37 +00:00
8a71e9b816 Add package.yml Workflow
All checks were successful
Package BeamNG.drive mod / Build (push) Successful in 5s
2025-12-11 13:10:44 +00:00
0423e8c03d Allow Retrieve Damaged from Inventory 2025-12-11 12:16:55 +01:00
559135b292 Disable saving when vehicle is already in storage 2025-12-11 09:42:32 +01:00
5ca5ce8bac Fix Vehicle Spawning Rotation & Add Screen Fading 2025-03-15 18:44:41 +01:00
d245d00706 Fix Saving for Multiple Spawned Vehicles 2025-03-06 20:09:16 +01:00
5 changed files with 1611 additions and 35 deletions

View File

@@ -0,0 +1,20 @@
name: Package BeamNG.drive mod
run-name: Package ${{ github.event.repository.name }}.zip for release
on:
push:
tags:
- '*'
jobs:
Build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Compress to zip
run: zip -r ${{ github.event.repository.name }}.zip *
- name: Release
uses: akkuman/gitea-release-action@v1
with:
files: ${{ github.event.repository.name }}.zip

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ M.dependencies = { 'career_modules_inventory', 'freeroam_facilities', "career_ve
"career_modules_permissions", 'career_modules_valueCalculator' }
local career_modules_inventory_removeVehicleObject
local career_modules_inventory_openMenu
local vehicleObjectsToRemove = {}
local function spawnVehicle(inventoryId, callback)
@@ -30,9 +31,9 @@ local function spawnVehicle(inventoryId, callback)
end
local function Retrieve(inventoryId)
career_vehicleSaveSystem.QueueVehicleToSave(inventoryId)
career_vehicleSaveSystem.EnqueueVehicleToSave(inventoryId)
if not career_vehicleSaveSystem.SaveVehicle(inventoryId) then
career_vehicleSaveSystem.QueuedVehicleSaved(inventoryId)
career_vehicleSaveSystem.DequeueVehicleToSave(inventoryId)
end
local vehicleValue = career_modules_valueCalculator.getInventoryVehicleValue(inventoryId, true)
@@ -41,17 +42,11 @@ local function Retrieve(inventoryId)
career_vehicleSaveSystem.CheckSavedAsync(function()
extensions.core_jobsystem.create(
function(job)
spawnVehicle(inventoryId, function()
local veh = be:getObjectByID(career_modules_inventory.getVehicleIdFromInventoryId(inventoryId))
local location = { pos = veh:getPosition(), rot = quat(0, 0, 1, 0) * quat(veh:getRefNodeRotation()) }
local garage = career_modules_inventory.getClosestGarage(location.pos)
career_vehicleSaveSystem.SetFade(true)
job.sleep(1)
if currentVehicleValue < vehicleValue then
career_vehicleSaveSystem.LoadVehicle(inventoryId)
else
log('I', 'retrieval', 'retrieving vehicle ' .. inventoryId .. " in an undamaged state")
end
freeroam_facilities.teleportToGarage(garage.id, veh, false)
spawnVehicle(inventoryId, function()
career_vehicleSaveSystem.TeleportVehicle(inventoryId, false)
career_vehicleSaveSystem.LoadVehicle(inventoryId, currentVehicleValue < vehicleValue)
end)
end
)
@@ -62,9 +57,16 @@ local function onComputerAddFunctions(menuData, computerFunctions)
if menuData.computerFacility.functions["vehicleInventory"] then
local favouriteVehicleId = career_modules_inventory.getFavoriteVehicle()
local vehicleValue = career_modules_valueCalculator.getInventoryVehicleValue(favouriteVehicleId, true)
local currentVehicleValue = career_modules_valueCalculator.getInventoryVehicleValue(favouriteVehicleId)
local function_label = "Retrieve Favourite Vehicle"
if currentVehicleValue < vehicleValue then
function_label = function_label .. " (Damaged)"
end
local computerFunctionData = {
id = "retrieve_damaged",
label = "Retrieve Favourite Damaged",
label = function_label,
callback = function() Retrieve(favouriteVehicleId) end,
order = 1
}
@@ -86,17 +88,34 @@ local function onComputerAddFunctions(menuData, computerFunctions)
end
local function RemoveVehicleObject(inventoryId)
if career_modules_inventory.getVehicleIdFromInventoryId(inventoryId) then
table.insert(vehicleObjectsToRemove, inventoryId)
career_vehicleSaveSystem.QueueVehicleToSave(inventoryId)
career_vehicleSaveSystem.EnqueueVehicleToSave(inventoryId)
career_vehicleSaveSystem.SaveVehicle(inventoryId)
career_vehicleSaveSystem.CheckSavedAsync(function()
career_modules_inventory_removeVehicleObject(inventoryId)
end)
end
end
local function OpenMenu(_chooseButtonsData, header, _buttonsActive)
if _chooseButtonsData then
for _, buttonData in ipairs(_chooseButtonsData) do
if buttonData.buttonText == "Retrieve" then
buttonData.buttonText = "Retrieve"
buttonData.callback = function(inventoryId) Retrieve(inventoryId) end
buttonData.repairRequired = false
end
end
end
career_modules_inventory_openMenu(_chooseButtonsData, header, _buttonsActive)
end
local function onCareerActive()
career_modules_inventory_removeVehicleObject = career_modules_inventory.removeVehicleObject
career_modules_inventory.removeVehicleObject = RemoveVehicleObject
career_modules_inventory_openMenu = career_modules_inventory.openMenu
career_modules_inventory.openMenu = OpenMenu
end
M.onComputerAddFunctions = onComputerAddFunctions

View File

@@ -15,7 +15,8 @@
local M = {}
M.dependencies = { 'career_career', 'career_saveSystem', 'career_modules_inventory' }
M.dependencies = { 'freeroam_facilities', 'ui_fadeScreen', 'career_career', 'career_saveSystem',
'career_modules_inventory' }
local extensionName = "career_vehicleSaveSystem"
local vehicleSaves_temp = "/temp/career/vehicle_saves"
@@ -65,13 +66,50 @@ local function GetVehicleSaveFile(root, inventoryId)
return path .. "/save.json"
end
local function QueueVehicleToSave(inventoryId)
local function EnqueueVehicleToSave(inventoryId)
log("I", "saving", "enqueued vehicle " .. inventoryId)
M.queuedVehicleSaves[inventoryId] = true
end
local function QueuedVehicleSaved(inventoryId)
log("I", "saving", "saved vehicle " .. inventoryId)
table.remove(M.queuedVehicleSaves, inventoryId)
local function DequeueVehicleToSave(inventoryId)
log("I", "saving", "dequeued vehicle " .. inventoryId)
M.queuedVehicleSaves[inventoryId] = nil
end
local function TeleportVehicle(inventoryId, delayed, callback)
log("I", "loading", "teleporting vehicle " .. inventoryId)
local veh = be:getObjectByID(career_modules_inventory.getVehicleIdFromInventoryId(inventoryId))
local location = { pos = veh:getPosition(), rot = quat(0, 0, 1, 0) * quat(veh:getRefNodeRotation()) }
local garage = career_modules_inventory.getClosestGarage(location.pos)
extensions.core_jobsystem.create(function(job)
if delayed then
job.sleep(1)
end
freeroam_facilities.teleportToGarage(garage.id, veh, false)
if callback then
callback()
end
end)
end
local fadeInProgress = false
local function SetFade(fade)
if fadeInProgress and fade then
return
end
if not fadeInProgress and not fade then
return
end
if fade then
ui_fadeScreen.start(0.5)
fadeInProgress = true
else
ui_fadeScreen.stop(0.5)
fadeInProgress = false
end
end
local function VehiclesSaved()
@@ -108,24 +146,51 @@ local function SaveVehicle(inventoryId)
local object = be:getObjectByID(vehicleId)
object:queueLuaCommand("beamstate.save(\"" ..
saveFile ..
"\"); obj:queueGameEngineLua('career_vehicleSaveSystem.QueuedVehicleSaved(\"" .. inventoryId .. "\")');")
"\"); obj:queueGameEngineLua('career_vehicleSaveSystem.DequeueVehicleToSave(" .. inventoryId .. ")');")
return true
else
log('I', 'saving', 'vehicle ' .. inventoryId .. " not spawned")
return false
end
end
local function LoadVehicle(inventoryId)
local function FinishedLoading(inventoryId)
M.SetFade(false)
local veh = be:getObjectByID(career_modules_inventory.getVehicleIdFromInventoryId(inventoryId))
local pos, _ = freeroam_facilities.getGaragePosRot(career_modules_inventory.getClosestGarage(), veh)
career_modules_playerDriving.showPosition(pos)
end
local function LoadVehicle(inventoryId, loadDamaged)
local saveFile = GetVehicleSaveFile(vehicleSaves_temp, inventoryId)
local vehicleId = career_modules_inventory.getVehicleIdFromInventoryId(inventoryId)
if vehicleId then
log("I", "loading", "loading vehicle from " .. saveFile)
if loadDamaged then
local object = be:getObjectByID(vehicleId)
object:queueLuaCommand("beamstate.load(\"" ..
saveFile .. "\");" ..
"for key, value in pairs(v.data.controller) do if value['fileName'] == 'advancedCouplerControl' then local c = controller.getController(value['name']) if c['reset'] then c['reset']() end end end"
object:queueLuaCommand(
"beamstate.load(\"" .. saveFile .. "\"); " ..
"for key, value in pairs(v.data.controller) do " ..
" if value['fileName'] == 'advancedCouplerControl' then " ..
" local c = controller.getController(value['name']) " ..
" if c['reset'] then " ..
" c['reset']() " ..
" end " ..
" end " ..
" end; " ..
" obj:queueGameEngineLua(' " ..
" career_vehicleSaveSystem.TeleportVehicle( " ..
" " .. inventoryId .. ", " ..
" true, " ..
" function() " ..
" career_vehicleSaveSystem.FinishedLoading(" .. inventoryId .. ")" ..
" end) " ..
" ');"
)
else
FinishedLoading(inventoryId)
end
end
end
@@ -137,12 +202,12 @@ local function onSaveCurrentSaveSlot(currentSavePath, oldSaveDate, vehiclesThumb
local vehicles = career_modules_inventory.getVehicles()
for id, _ in pairs(vehicles) do
QueueVehicleToSave(id)
EnqueueVehicleToSave(id)
end
for id, _ in pairs(M.queuedVehicleSaves) do
if not SaveVehicle(id) then
QueuedVehicleSaved(id)
DequeueVehicleToSave(id)
end
end
CheckSavedAsync(function()
@@ -165,11 +230,16 @@ M.queuedVehicleSaves = {}
M.SaveVehicle = SaveVehicle
M.LoadVehicle = LoadVehicle
M.FinishedLoading = FinishedLoading
M.TeleportVehicle = TeleportVehicle
M.SetFade = SetFade
M.CheckSavedAsync = CheckSavedAsync
M.QueueVehicleToSave = QueueVehicleToSave
M.QueuedVehicleSaved = QueuedVehicleSaved
M.EnqueueVehicleToSave = EnqueueVehicleToSave
M.DequeueVehicleToSave = DequeueVehicleToSave
M.onSaveCurrentSaveSlotAsyncStart = onSaveCurrentSaveSlotAsyncStart
M.onSaveCurrentSaveSlot = onSaveCurrentSaveSlot

View File

@@ -19,6 +19,7 @@ M.dependencies = { 'career_career' }
extensions.load("career_vehicleSaveSystem")
extensions.load("career_vehicleRetrieval")
extensions.load("career_modules_inventory")
M.onInit = function()
setExtensionUnloadMode(M, "manual")