2026-01-23 23:40:20 -07:00
|
|
|
Locations, Recipes = Locations or {}, Recipes or {}
|
|
|
|
|
|
|
|
|
|
Locations.Deliveries = {
|
|
|
|
|
dropOff = {
|
|
|
|
|
{coords = vector4(282.48, -1814.32, 27.23, 145.11)},
|
|
|
|
|
{coords = vector4(-296.11, -1300.65, 31.31, 270.87)},
|
|
|
|
|
{coords = vector4(-36.64, -1492.04, 31.22, 151.91)},
|
|
|
|
|
{coords = vector4(282.48, -1814.32, 27.23, 232.19)},
|
|
|
|
|
{coords = vector4(54.54, -1873.22, 22.81, 131.47)},
|
|
|
|
|
{coords = vector4(-269.34, -2437.25, 6.40, 252.67)},
|
|
|
|
|
{coords = vector4(269.19, -3248.55, 5.79, 252.67)},
|
|
|
|
|
{coords = vector4(632.94, -3015.44, 7.34, 3.44)},
|
|
|
|
|
{coords = vector4(1049.55, -2427.88, 30.30, 79.52)},
|
|
|
|
|
{coords = vector4(853.16, -2207.32, 30.68, 284.88)},
|
|
|
|
|
{coords = vector4(903.10, -1721.98, 32.25, 168.71)},
|
|
|
|
|
{coords = vector4(1289.30, -1710.49, 55.48, 208.57)},
|
|
|
|
|
{coords = vector4(1412.01, -1490.53, 60.66, 132.46)},
|
|
|
|
|
{coords = vector4(734.26, -1311.26, 27.01, 102.99)},
|
|
|
|
|
{coords = vector4(1231.60, -1083.06, 38.53, 102.99)},
|
|
|
|
|
{coords = vector4(1143.55, -1000.19, 45.32, 257.05)},
|
|
|
|
|
{coords = vector4(1264.82, -702.87, 64.72, 257.05)},
|
|
|
|
|
{coords = vector4(1119.65, -639.76, 56.81, 284.53)},
|
|
|
|
|
{coords = vector4(1129.59, -462.59, 66.49, 79.23)},
|
|
|
|
|
{coords = vector4(42.80, -811.45, 31.43, 79.23)},
|
|
|
|
|
{coords = vector4(-509.48, -1001.66, 23.55, 79.23)},
|
|
|
|
|
{coords = vector4(-830.97, -862.41, 20.69, 13.72)},
|
|
|
|
|
{coords = vector4(-1320.26, -1177.34, 4.89, 74.29)},
|
|
|
|
|
{coords = vector4(-1097.63, -1673.24, 8.40, 136.51)},
|
|
|
|
|
{coords = vector4(-1147.61, -1452.10, 4.60, 51.50)},
|
|
|
|
|
{coords = vector4(-1241.69, -1208.39, 8.52, 107.56)},
|
|
|
|
|
{coords = vector4(-1876.92, -584.44, 11.85, 329.54)},
|
|
|
|
|
{coords = vector4(-1303.94, -441.39, 35.22, 128.73)},
|
|
|
|
|
{coords = vector4(-1705.48, -433.46, 42.17, 128.73)},
|
|
|
|
|
{coords = vector4(-1305.99, 336.35, 65.50, 35.13)},
|
|
|
|
|
{coords = vector4(-741.80, 484.84, 109.47, 110.85)},
|
|
|
|
|
{coords = vector4(-409.57, 341.49, 108.91, 270.45)},
|
|
|
|
|
{coords = vector4(-126.44, 588.18, 204.71, 8.12)},
|
|
|
|
|
{coords = vector4(211.42, -101.42, 73.28, 174.10)},
|
|
|
|
|
{coords = vector4(490.61, -95.04, 66.44, 273.57)},
|
|
|
|
|
{coords = vector4(387.19, -993.59, 29.42, 273.57)},
|
|
|
|
|
{coords = vector4(-500.47, -712.37, 33.21, 273.57)},
|
|
|
|
|
{coords = vector4(2572.20, 479.97, 108.68, 80.27)},
|
|
|
|
|
{coords = vector4(-430.10, 1205.41, 325.76, 169.25)},
|
|
|
|
|
{coords = vector4(-126.06, 1896.58, 197.33, 169.25)},
|
|
|
|
|
{coords = vector4(-2521.08, 2310.31, 33.22, 276.87)},
|
|
|
|
|
{coords = vector4(1129.01, 2125.14, 55.55, 276.87)},
|
|
|
|
|
{coords = vector4(1546.64, 2166.56, 78.72, 100.37)},
|
|
|
|
|
{coords = vector4(404.34, 2584.54, 43.52, 100.37)},
|
|
|
|
|
{coords = vector4(180.15, 2792.99, 45.66, 283.04)},
|
|
|
|
|
{coords = vector4(287.67, 2843.89, 44.70, 118.41)},
|
|
|
|
|
{coords = vector4(2030.23, 3184.42, 45.13, 146.06)},
|
|
|
|
|
{coords = vector4(2175.33, 3321.92, 46.13, 214.53)},
|
|
|
|
|
{coords = vector4(2389.61, 3340.98, 47.34, 214.52)},
|
|
|
|
|
{coords = vector4(1716.25, 3295.08, 41.26, 196.21)},
|
|
|
|
|
{coords = vector4(1779.38, 3640.83, 34.50, 24.16)},
|
|
|
|
|
{coords = vector4(1894.59, 3715.34, 32.75, 127.89)},
|
|
|
|
|
{coords = vector4(1861.90, 3857.15, 36.27, 293.45)},
|
|
|
|
|
{coords = vector4(996.38, 3575.07, 34.61, 328.30)},
|
|
|
|
|
{coords = vector4(387.45, 3584.73, 33.29, 351.41)},
|
|
|
|
|
{coords = vector4(68.08, 3693.22, 40.66, 63.98)},
|
|
|
|
|
{coords = vector4(15.55, 3688.70, 39.81, 230.89)},
|
|
|
|
|
{coords = vector4(2566.59, 4283.34, 41.97, 348.53)},
|
|
|
|
|
{coords = vector4(2570.82, 4667.95, 34.08, 135.30)},
|
|
|
|
|
{coords = vector4(2882.05, 4511.72, 48.02, 66.58)},
|
|
|
|
|
{coords = vector4(2243.78, 5154.02, 57.89, 139.42)},
|
|
|
|
|
{coords = vector4(1642.91, 4846.08, 45.51, 109.83)},
|
|
|
|
|
{coords = vector4(1308.87, 4362.17, 41.55, 256.01)},
|
|
|
|
|
{coords = vector4(-1090.27, 4940.57, 214.13, 256.01)},
|
|
|
|
|
{coords = vector4(-552.37, 5348.37, 74.76, 62.18)},
|
|
|
|
|
{coords = vector4(-679.02, 5834.27, 17.33, 137.18)},
|
|
|
|
|
{coords = vector4(-481.97, 6276.93, 13.35, 323.16)},
|
|
|
|
|
{coords = vector4(-24.92, 6472.60, 31.49, 144.42)},
|
|
|
|
|
{coords = vector4(36.03, 6549.18, 31.43, 287.85)},
|
|
|
|
|
{coords = vector4(406.08, 6526.43, 27.75, 97.45)},
|
|
|
|
|
{coords = vector4(1522.39, 6329.23, 24.61, 331.71)},
|
|
|
|
|
{coords = vector4(1741.39, 6419.62, 35.04, 331.71)},
|
|
|
|
|
{coords = vector4(3426.72, 5174.42, 7.40, 112.64)},
|
|
|
|
|
{coords = vector4(2525.99, 2586.62, 38.94, 257.02)},
|
|
|
|
|
{coords = vector4(2696.29, 1664.44, 24.52, 70.12)},
|
|
|
|
|
{coords = vector4(106.24, -1280.32, 29.24, 350.89)},
|
|
|
|
|
{coords = vector4(223.98, 121.53, 102.76, 259.68)},
|
|
|
|
|
{coords = vector4(102.19, -255.02, 50.05, 83.59)},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Recipes.Deliveries = {
|
|
|
|
|
{name = "weed_whitewidow_seed", price = 15, amount = 150, minrep = 0},
|
|
|
|
|
{name = "weed_skunk_seed", price = 15, amount = 150, minrep = 0},
|
|
|
|
|
{name = "weed_purplehaze_seed", price = 15, amount = 150, minrep = 0},
|
|
|
|
|
{name = "weed_ogkush_seed", price = 15, amount = 150, minrep = 0},
|
|
|
|
|
{name = "weed_amnesia_seed", price = 15, amount = 150, minrep = 0},
|
|
|
|
|
}
|
|
|
|
|
GlobalState.MDDrugsRecipes = Recipes
|
|
|
|
|
|
|
|
|
|
local drugDeliveryItem = {
|
|
|
|
|
{item = 'coke_brick', amount = 1},
|
|
|
|
|
{item = 'weed_brick', amount = 1},
|
|
|
|
|
}
|
|
|
|
|
local Dealers = {}
|
|
|
|
|
|
|
|
|
|
CreateThread(function()
|
|
|
|
|
local dealers = MySQL.query.await('SELECT * FROM dealers', {})
|
|
|
|
|
if #dealers > 0 then
|
|
|
|
|
for i = 1, #dealers do
|
|
|
|
|
local coords = json.decode(dealers[i].coords)
|
|
|
|
|
Dealers[#Dealers + 1] = {
|
|
|
|
|
coords = vector4(coords.x, coords.y, coords.z, coords.w),
|
|
|
|
|
model = dealers[i].model or 'a_m_m_skater_01',
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
Locations.Deliveries.dealers = Dealers
|
|
|
|
|
GlobalState.MDDrugsLocations = Locations
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
RegisterCommand('newdealer', function(source, args, rawCommand)
|
|
|
|
|
local src = source
|
|
|
|
|
if not IsPlayerAceAllowed(src, "command") then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local model = args[1] or 'a_m_m_skater_01'
|
|
|
|
|
local coords, heading = GetEntityCoords(GetPlayerPed(src)), GetEntityHeading(GetPlayerPed(src))
|
|
|
|
|
local vec = vector4(coords.x, coords.y, coords.z, heading)
|
|
|
|
|
MySQL.query.await('INSERT INTO dealers (model, coords, createdby) VALUES (?, ?, ?)', {model, json.encode(vec), Bridge.Framework.GetPlayerIdentifier(src)})
|
|
|
|
|
Dealers[#Dealers + 1] = {
|
|
|
|
|
coords = vec,
|
|
|
|
|
model = model,
|
|
|
|
|
}
|
|
|
|
|
Locations.Deliveries.dealers = Dealers
|
|
|
|
|
GlobalState.MDDrugsLocations = Locations
|
|
|
|
|
Wait(1000)
|
|
|
|
|
TriggerClientEvent('md-drugs:client:RefreshDealers', -1)
|
|
|
|
|
end, false)
|
|
|
|
|
|
|
|
|
|
TriggerClientEvent('chat:addSuggestion', -1, '/newdealer', 'Spawns a new delivery dealer at your location.', {
|
|
|
|
|
{ name="model", help="Ped model to use (optional)." }
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
RegisterNetEvent('md-drugs:server:buyItemDealer', function(item, dealerId)
|
|
|
|
|
local src = source
|
|
|
|
|
if not Dealers[dealerId] then return end
|
|
|
|
|
if not checkDistance(src, Dealers[dealerId].coords, 5.0, 'md-drugs:server:buyItemDealer') then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local itemExists = Recipes.Deliveries[item]
|
|
|
|
|
|
|
|
|
|
if not itemExists then
|
|
|
|
|
Bridge.Prints.Warn(Bridge.Language.Locale('Deliveries.itemDoesntExist', Bridge.Framework.GetPlayerIdentifier(src), item))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if Bridge.Framework.RemoveAccountBalance(src, 'cash', itemExists.price) then
|
|
|
|
|
Bridge.Inventory.AddItem(src, itemExists.name, 1)
|
|
|
|
|
else
|
|
|
|
|
Bridge.Notify.Error(src, Bridge.Language.Locale('Deliveries.purchase_fail_funds'))
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
local active = {}
|
|
|
|
|
CreateThread(function()
|
|
|
|
|
local deliveries = MySQL.query.await('SELECT * FROM deliveriesdealer', {})
|
|
|
|
|
if deliveries and #deliveries > 0 then
|
|
|
|
|
for i = 1, #deliveries do
|
|
|
|
|
local itemdata = json.decode(deliveries[i].itemdata)
|
|
|
|
|
local location = json.decode(deliveries[i].location)
|
|
|
|
|
active[deliveries[i].cid] = {
|
|
|
|
|
coords = vector4(location.x, location.y, location.z, location.w or 180.0),
|
|
|
|
|
item = itemdata.item,
|
|
|
|
|
amount = itemdata.amount,
|
|
|
|
|
timestop = deliveries[i].maxtime,
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
RegisterNetEvent('md-drugs:server:requestDelivery', function(dealerId)
|
|
|
|
|
local src = source
|
|
|
|
|
if not Dealers[dealerId] then return end
|
|
|
|
|
if not checkDistance(src, Dealers[dealerId].coords, 5.0, 'md-drugs:server:requestDelivery') then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local id = Bridge.Framework.GetPlayerIdentifier(src)
|
|
|
|
|
if active[id] then
|
|
|
|
|
local currentTime = os.time()
|
|
|
|
|
if currentTime > active[id].timestop then
|
|
|
|
|
Bridge.Notify.SendNotify(src, Bridge.Language.Locale('Deliveries.slowAf'), 'error')
|
|
|
|
|
active[id] = nil
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
Bridge.Notify.SendNotify(src, Bridge.Language.Locale('Deliveries.alreadyDelivering'), 'error')
|
|
|
|
|
TriggerClientEvent('md-drugs:client:setLocation', src, active[id])
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local deliveryLoc = Locations.Deliveries.dropOff[math.random(1, #Locations.Deliveries.dropOff)]
|
|
|
|
|
local item = drugDeliveryItem[math.random(1, #drugDeliveryItem)]
|
|
|
|
|
active[id] = {
|
|
|
|
|
coords = deliveryLoc.coords,
|
|
|
|
|
item = item.item,
|
|
|
|
|
amount = item.amount,
|
|
|
|
|
timestop = os.time() + (15 * 60),
|
|
|
|
|
}
|
|
|
|
|
MySQL.query.await('INSERT INTO deliveriesdealer (cid, itemdata, maxtime, location) VALUES (?, ?, ?, ?)', {
|
|
|
|
|
id,
|
|
|
|
|
json.encode({item = item.item, amount = item.amount}),
|
|
|
|
|
active[id].timestop,
|
|
|
|
|
json.encode({x = deliveryLoc.coords.x, y = deliveryLoc.coords.y, z = deliveryLoc.coords.z, w = deliveryLoc.coords.w or 180.0}),
|
|
|
|
|
})
|
|
|
|
|
Bridge.Inventory.AddItem(src, item.item, item.amount)
|
|
|
|
|
TriggerClientEvent('md-drugs:client:setLocation', src, active[id])
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
RegisterNetEvent('md-drugs:server:giveDeliveryItems', function(pedID)
|
|
|
|
|
local src = source
|
|
|
|
|
local id = Bridge.Framework.GetPlayerIdentifier(src)
|
|
|
|
|
if not active[id] then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if not checkDistance(src, active[id].coords, 5.0, 'md-drugs:server:giveDeliveryItems') then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not Bridge.Inventory.RemoveItem(src, active[id].item, active[id].amount) then
|
|
|
|
|
Bridge.Notify.Error(src, Bridge.Language.Locale('Deliveries.deliveryFailed'))
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
Bridge.Notify.SendNotify(src, Bridge.Language.Locale('Deliveries.delivery_success'), 'success')
|
|
|
|
|
AddRep(src, 'dealerrep', 1)
|
|
|
|
|
active[id] = nil
|
|
|
|
|
MySQL.query.await('DELETE FROM deliveriesdealer WHERE cid = ?', {id})
|
|
|
|
|
end)
|