130 lines
4.2 KiB
Lua
130 lines
4.2 KiB
Lua
-- Prevent running in monitor mode
|
|
if not TX_SERVER_MODE then return end
|
|
-- Prevent running if menu is disabled
|
|
if not TX_MENU_ENABLED then return end
|
|
|
|
-- =============================================
|
|
-- This file is for server side handlers related to
|
|
-- actions defined on Menu's "Main Page"
|
|
-- =============================================
|
|
|
|
RegisterNetEvent('txsv:req:vehicle:fix', function()
|
|
local src = source
|
|
local allow = PlayerHasTxPermission(src, 'menu.vehicle')
|
|
TriggerEvent('txsv:logger:menuEvent', src, 'vehicleRepair', allow)
|
|
if allow then
|
|
TriggerClientEvent('txcl:vehicle:fix', src)
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('txsv:req:vehicle:boost', function()
|
|
local src = source
|
|
local allow = PlayerHasTxPermission(src, 'menu.vehicle')
|
|
TriggerEvent('txsv:logger:menuEvent', src, 'vehicleBoost', allow)
|
|
if allow then
|
|
TriggerClientEvent('txcl:vehicle:boost', src)
|
|
end
|
|
end)
|
|
|
|
---Since we can't spawn it on the server, we just respond to the client and let it handle the spawn
|
|
---@param model string
|
|
RegisterNetEvent('txsv:req:vehicle:spawn:redm', function(model)
|
|
if not IS_REDM then return end
|
|
local src = source
|
|
if type(model) ~= 'string' then return end
|
|
local allow = PlayerHasTxPermission(src, 'menu.vehicle')
|
|
TriggerEvent('txsv:logger:menuEvent', src, 'spawnVehicle', allow, model)
|
|
if allow then
|
|
TriggerClientEvent('txcl:vehicle:spawn:redm', src, model)
|
|
end
|
|
end)
|
|
|
|
--- Spawn a vehicle on the server at the request of a client (fivem)
|
|
---@param model string
|
|
---@param modelType string
|
|
RegisterNetEvent('txsv:req:vehicle:spawn:fivem', function(model, modelType)
|
|
if not IS_FIVEM then return end
|
|
local src = source
|
|
if type(model) ~= 'string' then return end
|
|
if type(modelType) ~= 'string' then return end
|
|
|
|
--check permission
|
|
local allow = PlayerHasTxPermission(src, 'menu.vehicle')
|
|
TriggerEvent('txsv:logger:menuEvent', src, 'spawnVehicle', allow, model)
|
|
if not allow then return end
|
|
|
|
--resolve source ped
|
|
local ped = GetPlayerPed(src)
|
|
local coords = GetEntityCoords(ped)
|
|
local heading = GetEntityHeading(ped)
|
|
local sourceBucket = GetPlayerRoutingBucket(src)
|
|
|
|
--collect data from old current vehicle (if any)
|
|
local seatsToPlace = {}
|
|
local oldVeh = GetVehiclePedIsIn(ped, false)
|
|
local oldVehVelocity
|
|
if oldVeh and oldVeh > 0 then
|
|
oldVehVelocity = GetEntityVelocity(oldVeh)
|
|
|
|
--for each seat
|
|
for i = 6, -1, -1 do
|
|
local pedInSeat = GetPedInVehicleSeat(oldVeh, i)
|
|
if pedInSeat > 0 then
|
|
seatsToPlace[i] = pedInSeat
|
|
end
|
|
end
|
|
DeleteEntity(oldVeh)
|
|
else
|
|
seatsToPlace[-1] = ped
|
|
end
|
|
|
|
--spawn new vehicle
|
|
local newVeh = CreateVehicleServerSetter(model, modelType, coords.x, coords.y, coords.z, heading)
|
|
local attemptsCounter = 0
|
|
local attemptsLimit = 400 -- 400*5 = 2s
|
|
while not DoesEntityExist(newVeh) do
|
|
Wait(5)
|
|
attemptsCounter = attemptsCounter + 1
|
|
if attemptsCounter > attemptsLimit then
|
|
return debugPrint('Failed to spawn vehicle entity')
|
|
end
|
|
end
|
|
SetEntityRoutingBucket(newVeh, sourceBucket)
|
|
SetEntityVelocity(newVeh, oldVehVelocity)
|
|
|
|
local vehNetId = NetworkGetNetworkIdFromEntity(newVeh)
|
|
debugPrint(string.format(
|
|
"spawn vehicle (src=^3%d^0, model=^4%s^0, modelType=^4%s^0, vehNetId=^3%s^0)",
|
|
src, model, modelType, vehNetId
|
|
))
|
|
|
|
--Moving peds to new vehicle and deleting old one
|
|
--creating a ped/netid map
|
|
local players = GetPlayers()
|
|
local pedNetIdMap = {}
|
|
for _, id in pairs(players) do
|
|
local pedId = GetPlayerPed(id)
|
|
pedNetIdMap[pedId] = id
|
|
end
|
|
--sending seatInVehicle event to each client
|
|
for seatIndex, seatPed in pairs(seatsToPlace) do
|
|
local targetSrc = pedNetIdMap[seatPed]
|
|
if type(targetSrc) == 'string' then
|
|
debugPrint(("setting netid %d (ped %d) into seat index %d"):format(targetSrc, seatPed, seatIndex))
|
|
TriggerClientEvent('txcl:seatInVehicle', targetSrc, vehNetId, seatIndex, oldVehVelocity)
|
|
end
|
|
end
|
|
end)
|
|
|
|
--- Deletes the vehicle the player is currently in
|
|
--- @param vehNetId number
|
|
RegisterNetEvent('txsv:req:vehicle:delete', function(vehNetId)
|
|
local src = source
|
|
local allow = PlayerHasTxPermission(src, 'menu.vehicle')
|
|
TriggerEvent('txsv:logger:menuEvent', src, 'deleteVehicle', allow)
|
|
if allow then
|
|
local vehicle = NetworkGetEntityFromNetworkId(vehNetId)
|
|
DeleteEntity(vehicle)
|
|
end
|
|
end)
|