alle
This commit is contained in:
parent
f9b8f9ccad
commit
495d74e4dc
3 changed files with 113 additions and 59 deletions
|
|
@ -2,6 +2,7 @@ local positions = {}
|
|||
local presets = {}
|
||||
local positionsFile = 'positions.json'
|
||||
local presetsFile = 'presets.json'
|
||||
local attachedWeapons = {}
|
||||
|
||||
-- Load saved positions from JSON file
|
||||
local function LoadPositions()
|
||||
|
|
@ -29,19 +30,44 @@ local function SavePresets()
|
|||
SaveResourceFile(GetCurrentResourceName(), 'json/' .. presetsFile, json.encode(presets), -1)
|
||||
end
|
||||
|
||||
-- Überprüfe ob ein Spieler eine Waffe besitzt
|
||||
local function DoesPlayerHaveWeapon(source, weaponName)
|
||||
if Config.Framework.name == "qbcore" then
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
if Player then
|
||||
for _, item in pairs(Player.PlayerData.items) do
|
||||
if item.name == weaponName then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif Config.Framework.name == "esx" then
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
if xPlayer then
|
||||
local hasWeapon = xPlayer.hasWeapon(weaponName)
|
||||
return hasWeapon
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Load data when resource starts
|
||||
CreateThread(function()
|
||||
LoadPositions()
|
||||
LoadPresets()
|
||||
end)
|
||||
|
||||
-- Weapon sync
|
||||
local attachedWeapons = {}
|
||||
|
||||
-- Weapon sync with verification
|
||||
RegisterNetEvent('force-sling:server:syncWeapons')
|
||||
AddEventHandler('force-sling:server:syncWeapons', function(weaponData, action)
|
||||
local src = source
|
||||
|
||||
if action == 'attach' then
|
||||
-- Überprüfe ob der Spieler die Waffe besitzt
|
||||
if not DoesPlayerHaveWeapon(src, weaponData.weaponName) then
|
||||
return
|
||||
end
|
||||
|
||||
attachedWeapons[src] = attachedWeapons[src] or {}
|
||||
attachedWeapons[src][weaponData.weaponName] = weaponData
|
||||
elseif action == 'detach' then
|
||||
|
|
@ -55,7 +81,17 @@ end)
|
|||
|
||||
-- Callbacks
|
||||
lib.callback.register('force-sling:callback:getCachedPositions', function(source)
|
||||
return positions
|
||||
local src = source
|
||||
local playerPositions = {}
|
||||
|
||||
-- Filtere nur die Positionen für Waffen, die der Spieler besitzt
|
||||
for weaponName, posData in pairs(positions) do
|
||||
if DoesPlayerHaveWeapon(src, weaponName) then
|
||||
playerPositions[weaponName] = posData
|
||||
end
|
||||
end
|
||||
|
||||
return playerPositions
|
||||
end)
|
||||
|
||||
lib.callback.register('force-sling:callback:getCachedPresets', function(source)
|
||||
|
|
@ -64,23 +100,34 @@ end)
|
|||
|
||||
lib.callback.register('force-sling:callback:isPlayerAdmin', function(source)
|
||||
local src = source
|
||||
-- Add your admin check logic here
|
||||
-- Example for QBCore:
|
||||
-- local Player = QBCore.Functions.GetPlayer(src)
|
||||
-- return Player.PlayerData.admin or false
|
||||
|
||||
-- For testing, returning true
|
||||
return {isAdmin = true}
|
||||
if Config.Framework.name == "qbcore" then
|
||||
local Player = QBCore.Functions.GetPlayer(src)
|
||||
return Player and Player.PlayerData.admin or false
|
||||
elseif Config.Framework.name == "esx" then
|
||||
local xPlayer = ESX.GetPlayerFromId(src)
|
||||
return xPlayer and xPlayer.getGroup() == 'admin' or false
|
||||
end
|
||||
return false
|
||||
end)
|
||||
|
||||
lib.callback.register('force-sling:callback:resetWeaponPositions', function(source, weapon)
|
||||
local src = source
|
||||
if weapon then
|
||||
positions[weapon] = nil
|
||||
if DoesPlayerHaveWeapon(src, weapon) then
|
||||
positions[weapon] = nil
|
||||
SavePositions()
|
||||
end
|
||||
else
|
||||
positions = {}
|
||||
-- Beim kompletten Reset nur die Positionen der Waffen löschen, die der Spieler besitzt
|
||||
local newPositions = {}
|
||||
for weaponName, posData in pairs(positions) do
|
||||
if not DoesPlayerHaveWeapon(src, weaponName) then
|
||||
newPositions[weaponName] = posData
|
||||
end
|
||||
end
|
||||
positions = newPositions
|
||||
SavePositions()
|
||||
end
|
||||
SavePositions()
|
||||
return positions
|
||||
end)
|
||||
|
||||
|
|
@ -94,11 +141,18 @@ AddEventHandler('force-sling:server:saveWeaponPosition', function(position, rota
|
|||
}
|
||||
|
||||
if isPreset then
|
||||
presets[weaponName] = data
|
||||
SavePresets()
|
||||
-- Nur Admins können Presets speichern
|
||||
local isAdmin = lib.callback.await('force-sling:callback:isPlayerAdmin', src)
|
||||
if isAdmin then
|
||||
presets[weaponName] = data
|
||||
SavePresets()
|
||||
end
|
||||
else
|
||||
positions[weaponName] = data
|
||||
SavePositions()
|
||||
-- Überprüfe ob der Spieler die Waffe besitzt
|
||||
if DoesPlayerHaveWeapon(src, weaponName) then
|
||||
positions[weaponName] = data
|
||||
SavePositions()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
@ -110,3 +164,20 @@ AddEventHandler('playerDropped', function()
|
|||
attachedWeapons[src] = nil
|
||||
end
|
||||
end)
|
||||
|
||||
-- Periodische Überprüfung der angehängten Waffen
|
||||
CreateThread(function()
|
||||
while true do
|
||||
for playerId, weapons in pairs(attachedWeapons) do
|
||||
for weaponName, _ in pairs(weapons) do
|
||||
if not DoesPlayerHaveWeapon(playerId, weaponName) then
|
||||
-- Spieler hat die Waffe nicht mehr, entferne sie
|
||||
TriggerClientEvent('force-sling:client:syncWeapons', -1, playerId, {weaponName = weaponName}, 'detach')
|
||||
attachedWeapons[playerId][weaponName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
Wait(5000) -- Alle 5 Sekunden überprüfen
|
||||
end
|
||||
end)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue