RDE_CARSERVICE DOCS
RED DRAGON ELITE // ox_core NATIVE

Call your car,
not a taxi.

rde_carservice delivers and stores garage vehicles through ox_core, with a real NPC driver and full property preservation — every modification survives every delivery. Request it from the phone, or fall back to a chat command that works even without one.

$750
Delivery Cost
$500
Pickup Cost
2
Entry Points
01 / Start Here

Overview

rde_carservice is a valet-style delivery/pickup system for ox_core garage vehicles. Request a stored vehicle to your location, or send a vehicle left in the world back to storage — an NPC driver spawns, drives it to you (or away), and every modification, plate, and stored property survives the round trip.

Core Principle The delivery/pickup animation and NPC-driver logic never changed when the phone app was built. The phone triggers the exact same client-side flow the world menu already used — no duplicated logic, no second implementation to keep in sync.
02 / Start Here

Quick Start

server.cfg
ensure ox_core
ensure ox_lib
ensure ox_target
ensure oxmysql
ensure rde_phone
ensure rde_carservice

The phone app appears on the homescreen automatically once rde_carservice starts — no extra setup beyond the dependency order above.

03 / Start Here

Chat Command Fallback

The phone app is the primary way to call this service, but /carservice works independently of it — same underlying lib.registerContext menu the phone triggers, reachable even if rde_phone isn't running.

config.lua
Config.Command = {
    enabled = true,   -- fallback, stays on
    name    = 'carservice',
}
04 / Reference

Configuration

config.lua
Config.DeliveryCost = 750  -- cost to deliver a stored vehicle
Config.PickupCost   = 500  -- cost to collect and store a vehicle
05 / Reference

rde_parking Integration

Delivery fires a vehicleDelivered event that rde_parking listens for directly — no polling, no shared database table between the two resources. Vehicle ownership and stored state stay in one place.

06 / More

Common Pitfalls

The old getVehicles callback used a Wait()-polling workaround

The NPWD-era phone bridge fired a net event and then polled a local variable with Wait() for up to 5 seconds waiting for a server response — a workaround for callback issues that were never actually specific to this data.

Fix: the phone app now calls the existing lib.callback.await('rde_carservice:getVehicles', false) directly — the clean callback already existed for the world menu, the polling detour was unnecessary.

Orphaned server-side push code, dead since the NPWD removal

A pushVehiclesToClient function and two related net events were left over from the exact workaround above — nothing on the client listened for them anymore once the polling was replaced, but they kept running on every player join.

Fix: removed entirely. Always grep for the client-side listener before assuming a server push mechanism is still load-bearing.

07 / More

FAQ

Does the phone app replace the chat command?

No — both call the same underlying menu/callbacks. Neither is more "official" than the other.

What happens if the delivery times out?

The service auto-cancels after Config.ServiceTimeout seconds and refunds nothing already charged mid-delivery — configure this to match your server's typical player density.

08 / More

Changelog

Latest

NPWD/Module Federation removed. Phone app rebuilt on rde_phone's SDK.

Vehicle-list polling workaround replaced with a direct callback. Orphaned server-side push code removed.