90 lines
2.6 KiB
Lua
90 lines
2.6 KiB
Lua
BTtow = {}
|
|
BTtow.Create = {}
|
|
BTtow.Init = {}
|
|
|
|
local TowbarVariantSize = 24
|
|
local TowbarNormalStart = 0
|
|
local TowbarLargeStart = 24
|
|
local TowbarMaxIndex = TowbarVariantSize - 1
|
|
local VanillaScaleMin = 1.5
|
|
local VanillaScaleMax = 2.0
|
|
|
|
local function getVehicleModelScale(script)
|
|
if not script then return nil end
|
|
|
|
local ok, result = pcall(function()
|
|
return script:getModelScale()
|
|
end)
|
|
if ok and type(result) == "number" then
|
|
return result
|
|
end
|
|
|
|
ok, result = pcall(function()
|
|
local model = script:getModel()
|
|
if model then
|
|
return model:getScale()
|
|
end
|
|
return nil
|
|
end)
|
|
if ok and type(result) == "number" then
|
|
return result
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
local function isVanillaScale(script)
|
|
local modelScale = getVehicleModelScale(script)
|
|
if modelScale == nil then
|
|
return true
|
|
end
|
|
|
|
local configuredMin = TowBarMod and TowBarMod.Config and tonumber(TowBarMod.Config.vanillaTowbarModelScaleMin)
|
|
local configuredMax = TowBarMod and TowBarMod.Config and tonumber(TowBarMod.Config.vanillaTowbarModelScaleMax)
|
|
local minScale = configuredMin or VanillaScaleMin
|
|
local maxScale = configuredMax or VanillaScaleMax
|
|
return modelScale >= minScale and modelScale <= maxScale
|
|
end
|
|
|
|
local function getTowbarIndexVanilla(script)
|
|
local z = script:getPhysicsChassisShape():z() / 2 - 0.1
|
|
local index = math.floor((z * 2 / 3 - 1) * 10)
|
|
return math.max(0, math.min(TowbarMaxIndex, index))
|
|
end
|
|
|
|
local function getTowbarModelSlot(script)
|
|
if not isVanillaScale(script) then
|
|
-- KI5/small-scale vehicles use the normal towbar0 mesh at Z=1.
|
|
return 0
|
|
end
|
|
return getTowbarIndexVanilla(script)
|
|
end
|
|
|
|
function BTtow.Create.towbar(vehicle, part)
|
|
if part == nil then return end
|
|
for j=0, TowbarVariantSize - 1 do
|
|
part:setModelVisible("towbar" .. j, false)
|
|
end
|
|
end
|
|
|
|
function BTtow.Init.towbar(vehicle, part)
|
|
if part == nil then return end
|
|
for j=0, TowbarVariantSize - 1 do
|
|
part:setModelVisible("towbar" .. j, false)
|
|
end
|
|
local modData = vehicle:getModData()
|
|
if modData and modData.towBarModelSwapInProgress then
|
|
return
|
|
end
|
|
if modData and modData["isTowingByTowBar"] and modData["towed"] then
|
|
local script = vehicle:getScript()
|
|
if script then
|
|
local index = getTowbarModelSlot(script)
|
|
local shouldShowOnThisPart = part:getId() == "towbar"
|
|
if shouldShowOnThisPart then
|
|
part:setModelVisible("towbar" .. index, true)
|
|
end
|
|
end
|
|
end
|
|
end
|