Delivery Mission Example
A complete wc_corndelivery resource — pick up a sack, follow the route, turn it in for cash, optional VORP skill XP, and a Discord log line. See the Creating a Delivery Mission guide for the step-by-step version.
fxmanifest.lua
wc_corndelivery/fxmanifest.lua
fx_version 'adamant'
game 'rdr3'
lua54 'yes'
name 'wc_corndelivery'
dependency 'wc_libs'
shared_scripts { '@wc_libs/init.lua', 'config.lua' }
client_scripts { 'client.lua' }
server_scripts { 'server.lua' }
config.lua
wc_corndelivery/config.lua
Config = {}
Config.Pickup = vector3(2420.0, -2050.0, 28.0)
Config.DropOff = vector3(-315.0, 790.0, 120.0) -- Valentine general store
Config.Reward = 35
Config.TimeoutMs = 480000
Config.WebhookUrl = GetConvar('wc_corndelivery_webhook', '')
client.lua
wc_corndelivery/client.lua
local prompt = wc:CreatePrompt("Load Corn Sacks [G]")
wc:WatchPrompt(prompt, Config.Pickup, 3.0, function()
TriggerServerEvent('wc_corndelivery:start')
end)
RegisterNetEvent('wc_corndelivery:begin', function()
local marker = wc:CreateMissionMarker(Config.DropOff.x, Config.DropOff.y, Config.DropOff.z, "Corn Drop-off", { route = true })
wc:WatchPlayerNear(Config.DropOff, 4.0, function()
marker:Clear()
TriggerServerEvent('wc_corndelivery:turnIn')
end, {
timeoutMs = Config.TimeoutMs,
onCancel = function() marker:Clear() end,
})
end)
server.lua
wc_corndelivery/server.lua
local ActiveDeliveries = {}
RegisterNetEvent('wc_corndelivery:start', function()
local src = source
if ActiveDeliveries[src] then return end
local ok = wc:AddItem(src, 'corn_sack', 1)
if not ok then
wc:Notify(src, { variant = 'fail', title = "No room for the sack." })
return
end
ActiveDeliveries[src] = { reward = Config.Reward, startedAt = os.time() }
TriggerClientEvent('wc_corndelivery:begin', src)
end)
RegisterNetEvent('wc_corndelivery:turnIn', function()
local src = source
local delivery = ActiveDeliveries[src]
if not delivery then return end
if not wc:HasItem(src, 'corn_sack', 1) then
wc:Notify(src, { variant = 'fail', title = "You don't have the sack." })
return
end
if not wc:RemoveItem(src, 'corn_sack', 1) then return end
ActiveDeliveries[src] = nil
wc:AddMoney(src, delivery.reward, 0)
wc:Notify(src, { title = ("Corn delivered — +$%d"):format(delivery.reward), variant = 'avanced' })
if wc:Framework_Is('vorp') then
wc:ApplySkillBonus(src, 'trading', 15, '+15 Trading XP')
end
wc:SendWebhook(src, Config.WebhookUrl, "Corn Delivery", "complete", {
{ "Reward", wc:FormatMoney(delivery.reward) },
})
end)
AddEventHandler('playerDropped', function()
ActiveDeliveries[source] = nil
end)