返回博客
Tutorial2 分钟阅读

FiveM 车辆调校店:正确编写 LS Customs 脚本

在您的 FiveM 服务器上运营一家正规的改装店。轮毂、发动机升级、喷漆以及适用于 QBCore 和 ESX 的最佳定制 LS Customs 脚本。

Agency Scripts

Agency Scripts 创始人兼首席开发者

角色扮演中的车辆调校

车辆定制是任何FiveM角色扮演服务器上最受欢迎的功能之一。玩家投入大量时间和金钱在他们的车辆上,调校店让他们能够通过性能升级、视觉修改、自定义喷漆和售后零件来个性化他们的座驾。一个设计良好的调校系统不仅仅是通过菜单暴露GTA内置的车辆修改原生函数。它创建了一个完整的生态系统,包括玩家运营的机械店、作为经济吸收的定价结构、创造现实等待时间的安装计时器,以及可以从不同供应商以不同质量水平采购零件的零件市场。调校店成为汽车爱好者聚集的社交中心,机械师建立声誉,每辆改装车都讲述着车主的品味和预算故事。

理解GTA车辆改装原生函数

GTA V 通过一系列原生函数暴露车辆改装功能,允许您对特定改装槽应用升级。每辆车都有一组由数字索引标识的改装类型:引擎升级使用索引 11,刹车使用索引 12,变速箱使用索引 13,悬挂使用索引 15,视觉部件如扰流板、保险杠和裙边使用索引 0 到 10。 SetVehicleMod native 应用该车辆模型和改装类型可用选项中的特定改装。并非所有车辆都支持每个改装类别,因此需要使用 GetNumVehicleMods 向玩家展示选项之前。喷漆作业使用诸如 SetVehicleColours 用于主色和辅色, SetVehicleExtraColours 用于珠光和轮毂颜色,以及 SetVehicleCustomPrimaryColour 用于自定义RGB值:

-- Mod type indices reference
local ModTypes = {
    spoiler = 0,
    front_bumper = 1,
    rear_bumper = 2,
    side_skirt = 3,
    exhaust = 4,
    frame = 5,
    grille = 6,
    hood = 7,
    fender = 8,
    right_fender = 9,
    roof = 10,
    engine = 11,
    brakes = 12,
    transmission = 13,
    horns = 14,
    suspension = 15,
    armor = 16,
    turbo = 18,
    xenon = 22,
    front_wheels = 23,
    back_wheels = 24,
    plate_holder = 25,
    vanity_plates = 26,
    trim = 27,
    ornaments = 28,
    dashboard = 29,
    dial = 30,
    door_speaker = 31,
    seats = 32,
    steering_wheel = 33,
    shifter_leavers = 34,
    plaques = 35,
    speakers = 36,
    trunk = 37,
    hydraulics = 38,
    engine_block = 39,
    air_filter = 40,
    struts = 41,
    arch_cover = 42,
    aerials = 43,
    trim2 = 44,
    tank = 45,
    windows = 46,
    livery = 48,
}

function GetAvailableMods(vehicle, modType)
    local count = GetNumVehicleMods(vehicle, modType)
    local mods = {}
    for i = 0, count - 1 do
        table.insert(mods, {
            index = i,
            label = GetModTextLabel(vehicle, modType, i) or ('Option ' .. (i + 1)),
        })
    end
    return mods
end

调校店配置

配置改装店位置及其可用服务、价格乘数和提供的改装类别。并非每家店都需提供所有服务。Vinewood 的高端改装店可能专注于豪华喷漆和高级视觉改装,价格更高但质量更好。南洛圣都的街头车库可能专注于实惠的性能零件和基础车身维修。这种差异化为玩家提供访问不同店铺的理由,支持每个业务的角色扮演身份。每家店需有实体位置和车辆入口,玩家可将车开入,设有改装预览摄像机位置,且可选配车库环境的室内 MLO:

Config.TuningShops = {
    ['benny_motorworks'] = {
        label = "Benny's Original Motor Works",
        coords = vector3(-205.67, -1312.58, 31.30),
        vehicleSpot = vector4(-211.89, -1320.88, 31.09, 178.94),
        camOffset = vector3(0.0, 5.5, 1.5),
        blipSprite = 72,
        categories = {'performance', 'visual', 'paint', 'wheels', 'lights', 'livery'},
        priceMultiplier = 1.0,
        restrictedTo = nil,  -- Open to all
    },
    ['ls_customs'] = {
        label = 'LS Customs - Burton',
        coords = vector3(-347.55, -133.00, 39.01),
        vehicleSpot = vector4(-339.20, -136.73, 39.01, 116.89),
        camOffset = vector3(0.0, 5.0, 1.5),
        blipSprite = 72,
        categories = {'performance', 'visual', 'paint', 'wheels'},
        priceMultiplier = 0.85,
        restrictedTo = nil,
    },
}

Config.ModPrices = {
    engine = {1500, 3500, 6000, 10000},       -- Level 1-4
    brakes = {1000, 2500, 4500, 7500},
    transmission = {1200, 3000, 5500, 9000},
    turbo = {15000},
    suspension = {800, 1500, 2500, 4000},
    armor = {2500, 5000, 10000, 17500, 25000},
    spoiler = 2000,       -- Flat price per option
    front_bumper = 1800,
    rear_bumper = 1500,
    side_skirt = 1200,
    exhaust = 1000,
    hood = 2500,
    roof = 1500,
    paint_standard = 500,
    paint_metallic = 1500,
    paint_custom_rgb = 5000,
    wheels = 3000,
    xenon = 3000,
    livery = 2500,
}

实时车辆预览系统。

玩家需要在购买前看到车辆改装效果。实现一个实时预览系统,在玩家浏览选项时临时应用所选改装,若玩家取消则恢复所有更改,确认购买则只应用购买的改装。当玩家进入调校菜单时,保存当前车辆属性快照。浏览不同选项时,使用车辆mod本地函数临时应用每个改装,使变化立即可见。若玩家在同一类别选择不同选项,先恢复之前的临时改装再应用新的。确认购买后,改装永久生效并保存到车辆数据库记录。取消时,恢复车辆到保存的快照状态。预览期间,将游戏摄像机定位为绕车旋转,允许玩家旋转视角,从各角度检查改装:

local originalMods = {}

function SaveVehicleSnapshot(vehicle)
    originalMods = QBCore.Functions.GetVehicleProperties(vehicle)
end

function PreviewMod(vehicle, modType, modIndex)
    SetVehicleMod(vehicle, modType, modIndex, false)
end

function RevertToSnapshot(vehicle)
    if originalMods then
        QBCore.Functions.SetVehicleProperties(vehicle, originalMods)
    end
end

function SetupTuningCamera(vehicle, shopConfig)
    local coords = GetEntityCoords(vehicle)
    local camCoords = coords + shopConfig.camOffset

    tuningCam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
    SetCamCoord(tuningCam, camCoords.x, camCoords.y, camCoords.z)
    PointCamAtEntity(tuningCam, vehicle, 0.0, 0.0, 0.0, true)
    SetCamActive(tuningCam, true)
    RenderScriptCams(true, true, 1000, true, false)
end

机械师职业集成

通过将改装店与机械师职业系统集成,将其从自动菜单转变为玩家驱动的业务。值班机械师可为客户执行车辆改装,创造服务导向的角色扮演互动。当客户将车辆带到店内时,可选择使用自助终端(价格较高)或请求机械师服务(享受折扣)。机械师在平板界面上看到服务请求,接受任务,与客户讨论所需改装并执行工作。安装过程中播放相应动画和粒子效果,模拟机械师工作。添加安装计时器,时间根据改装复杂度变化,发动机更换需数分钟,喷漆时间较短。机械师完成每项工作可获得佣金,激励其提供优质服务并建立客户群。跟踪机械师统计数据,如完成总数、客户满意度评分和专长领域,打造机械师职业进阶系统。

自定义涂装和包裹系统

通过实现带有RGB颜色选择器、金属和哑光饰面、珠光叠加和自定义贴膜的自定义喷漆系统,超越标准GTA调色板。NUI颜色选择器应显示全光谱色轮或HSL滑块,让玩家选择任何想象中的颜色。使用以下方式应用所选颜色 SetVehicleCustomPrimaryColourSetVehicleCustomSecondaryColour 带有拾色器的RGB值。对于车身贴膜效果,使用车辆涂装系统结合自定义纹理替换,将图案、碳纤维纹理或品牌设计应用于车身。提供双色涂装选项,主色和次色车身面板可为不同颜色,创造独特配色。将精确RGB值保存到车辆数据库记录,以保证自定义颜色在会话和服务器重启后保持。自定义喷漆价格高于标准颜色,反映服务的高端性质并提供有效的资金消耗。

性能调校与测功测试

性能改装不仅仅是选择菜单选项并立即生效。实现一个测功测试功能,让玩家可以测试车辆改装前后的性能数据。测功测试模拟车辆全油门运行,显示估算的马力、扭矩、最高速度和加速时间等指标。使用游戏的车辆操控数据,根据安装的改装件计算这些数值。在干净的NUI仪表盘中显示结果,使用条形图或数字读数对比改装前后的数值。这为玩家提供了具体反馈,了解每项升级如何影响车辆性能,使购买决策更明智、更令人满意。为了增加真实感,实施调校芯片或ECU重映射系统,玩家可以通过滑块界面微调油门响应、齿轮比和制动平衡等参数,变化会反映在车辆的实际操控特性中,使用 SetVehicleHandlingFloat natives。

保存和持久化车辆改装

每个应用于玩家车辆的改装必须保存到数据库,以便在会话间保持。大多数FiveM框架将车辆属性作为JSON数据存储在玩家车辆表中。改装完成并支付后,更新存储的车辆属性为新改装值。车辆从车库生成时,使用框架的功能应用所有保存的改装。 SetVehicleProperties function。处理边缘情况,如服务器在改装会话中途崩溃导致部分保存,可能使车辆状态不一致。使用事务模式,将付款处理和改装保存作为单个原子数据库操作。如果任一步骤失败,则回滚两者,防止玩家被收费却未获得改装,或免费获得改装。记录所有改装的时间戳和价格以供管理员审核,并支持发现漏洞时的回滚。

非法改装与街头赛车

通过实施仅通过地下改装店提供的非法改装,增加一层犯罪玩法。氮氧注入提供临时加速,但过度使用会导致引擎过热和损坏。超过合法马力限制的引擎更换会使车辆在被查获时面临警察检查和扣押。移除车牌、超过合法色度的黑色窗户以及液压悬挂改装都会给警察提供交通拦截的合理理由。跟踪车辆上的非法改装,并通过车辆检查机制向警察展示这些信息。警官可以使用手持扫描仪检查车辆的改装状态,揭示需要罚单或扣押的非法部件。这在改装文化和执法之间创造了猫捉老鼠的动态,丰富了服务器的角色扮演生态系统。

准备好开始了吗?

在我们的商店获取脚本,或加入 Discord 获取支持、更新以及新功能预告。