144 lines
4.3 KiB
Lua
144 lines
4.3 KiB
Lua
if GetConvarInt('ox_target:defaults', 1) ~= 1 then return end
|
|
|
|
local api = require 'client.api'
|
|
local GetEntityBoneIndexByName = GetEntityBoneIndexByName
|
|
local GetEntityBonePosition_2 = GetEntityBonePosition_2
|
|
local GetVehicleDoorLockStatus = GetVehicleDoorLockStatus
|
|
|
|
local bones = {
|
|
[0] = 'dside_f',
|
|
[1] = 'pside_f',
|
|
[2] = 'dside_r',
|
|
[3] = 'pside_r'
|
|
}
|
|
|
|
---@param vehicle number
|
|
---@param door number
|
|
local function toggleDoor(vehicle, door)
|
|
if GetVehicleDoorLockStatus(vehicle) ~= 2 then
|
|
if GetVehicleDoorAngleRatio(vehicle, door) > 0.0 then
|
|
SetVehicleDoorShut(vehicle, door, false)
|
|
else
|
|
SetVehicleDoorOpen(vehicle, door, false, false)
|
|
end
|
|
end
|
|
end
|
|
|
|
---@param entity number
|
|
---@param coords vector3
|
|
---@param door number
|
|
---@param useOffset boolean?
|
|
---@return boolean?
|
|
local function canInteractWithDoor(entity, coords, door, useOffset)
|
|
if not GetIsDoorValid(entity, door) or GetVehicleDoorLockStatus(entity) > 1 or IsVehicleDoorDamaged(entity, door) or cache.vehicle then return end
|
|
|
|
if useOffset then return true end
|
|
|
|
local boneName = bones[door]
|
|
|
|
if not boneName then return false end
|
|
|
|
local boneId = GetEntityBoneIndexByName(entity, 'door_' .. boneName)
|
|
|
|
if boneId ~= -1 then
|
|
return #(coords - GetEntityBonePosition_2(entity, boneId)) < 0.5 or
|
|
#(coords - GetEntityBonePosition_2(entity, GetEntityBoneIndexByName(entity, 'seat_' .. boneName))) < 0.72
|
|
end
|
|
end
|
|
|
|
local function onSelectDoor(data, door)
|
|
local entity = data.entity
|
|
|
|
if NetworkGetEntityOwner(entity) == cache.playerId then
|
|
return toggleDoor(entity, door)
|
|
end
|
|
|
|
TriggerServerEvent('ox_target:toggleEntityDoor', VehToNet(entity), door)
|
|
end
|
|
|
|
RegisterNetEvent('ox_target:toggleEntityDoor', function(netId, door)
|
|
local entity = NetToVeh(netId)
|
|
toggleDoor(entity, door)
|
|
end)
|
|
|
|
api.addGlobalVehicle({
|
|
{
|
|
name = 'ox_target:driverF',
|
|
icon = 'fa-solid fa-car-side',
|
|
label = locale('toggle_front_driver_door'),
|
|
bones = { 'door_dside_f', 'seat_dside_f' },
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords, name)
|
|
return canInteractWithDoor(entity, coords, 0)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 0)
|
|
end
|
|
},
|
|
{
|
|
name = 'ox_target:passengerF',
|
|
icon = 'fa-solid fa-car-side',
|
|
label = locale('toggle_front_passenger_door'),
|
|
bones = { 'door_pside_f', 'seat_pside_f' },
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords, name)
|
|
return canInteractWithDoor(entity, coords, 1)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 1)
|
|
end
|
|
},
|
|
{
|
|
name = 'ox_target:driverR',
|
|
icon = 'fa-solid fa-car-side',
|
|
label = locale('toggle_rear_driver_door'),
|
|
bones = { 'door_dside_r', 'seat_dside_r' },
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords)
|
|
return canInteractWithDoor(entity, coords, 2)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 2)
|
|
end
|
|
},
|
|
{
|
|
name = 'ox_target:passengerR',
|
|
icon = 'fa-solid fa-car-side',
|
|
label = locale('toggle_rear_passenger_door'),
|
|
bones = { 'door_pside_r', 'seat_pside_r' },
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords)
|
|
return canInteractWithDoor(entity, coords, 3)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 3)
|
|
end
|
|
},
|
|
{
|
|
name = 'ox_target:bonnet',
|
|
icon = 'fa-solid fa-car',
|
|
label = locale('toggle_hood'),
|
|
offset = vec3(0.5, 1, 0.5),
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords)
|
|
return canInteractWithDoor(entity, coords, 4, true)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 4)
|
|
end
|
|
},
|
|
{
|
|
name = 'ox_target:trunk',
|
|
icon = 'fa-solid fa-car-rear',
|
|
label = locale('toggle_trunk'),
|
|
offset = vec3(0.5, 0, 0.5),
|
|
distance = 2,
|
|
canInteract = function(entity, distance, coords, name)
|
|
return canInteractWithDoor(entity, coords, 5, true)
|
|
end,
|
|
onSelect = function(data)
|
|
onSelectDoor(data, 5)
|
|
end
|
|
}
|
|
})
|