monitor/resource/menu/server/sv_vehicle.lua
2025-04-16 22:30:27 +07:00

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)