Merge pull request #745 from ESX-Org/revert-737-develop

Revert "pt-PT Translation pt.lua"
This commit is contained in:
Jérémie N'gadi
2020-05-15 18:22:47 +02:00
committed by GitHub
180 changed files with 668 additions and 11546 deletions
+4 -4
View File
@@ -1,9 +1,9 @@
root = true
[*]
indent_size = 2
indent_style = space
end_of_line = lf
indent_size = 4
indent_style = tab
end_of_line = crlf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
insert_final_newline = true
+28 -217
View File
@@ -1,7 +1,4 @@
ESX = {}
ESX.Loops = {}
ESX.LoopsRunning = {}
ESX.Modules = {}
ESX.PlayerData = {}
ESX.PlayerLoaded = false
ESX.CurrentRequestId = 0
@@ -23,71 +20,6 @@ ESX.Scaleform.Utils = {}
ESX.Streaming = {}
ESX.Utils = {}
ESX.Utils.Random = {}
ESX.Utils.Vehicle = {}
ESX.Utils.Random.isLucky = function(percentChance, cb, callCbOnUnlucky)
local hasCallback = cb ~= nil
local callCbOnUnlucky = callCbOnUnlucky ~= nil and callCbOnUnlucky or false
if percentChance <= 0 or percentChance >= 100 then
local result = percentChance >= 100 and true or false
if hasCallback and (callCbOnUnlucky or result) then
cb(result)
else
return result
end
end
-- Force random on each iteration
math.randomseed(GetGameTimer())
local randomNumber = 100 * math.random()
local result = randomNumber <= percentChance
if hasCallback and (callCbOnUnlucky or result) then
cb(result)
else
return result
end
end
ESX.Utils.Random.isUnlucky = ESX.Utils.Random.isLucky
ESX.Utils.Random.inRange = function(min, max)
local min = min ~= nil and min or 0
local max = max ~= nil and max or 100
-- Force random on each iteration
math.randomseed(GetGameTimer())
return math.random(min, max)
end
-- Format [0-9]{2}[A-Z]{3}[0-9]{3}
ESX.Utils.Vehicle.generateRandomPlate = function()
-- Force random on each iteration
math.randomseed(GetGameTimer())
local firstPart = string.format("%02d", math.random(0, 99))
local charTable = {}
local chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for c in chars:gmatch"." do
table.insert(charTable, c)
end
local stringPart = '';
for i = 1, 3 do
stringPart = stringPart .. charTable[math.random(1, #charTable)]
end
local lastPart = string.format("%03d", math.random(0, 999))
return firstPart .. stringPart .. lastPart
end
ESX.SetTimeout = function(msec, cb)
table.insert(ESX.TimeoutCallbacks, {
time = GetGameTimer() + msec,
@@ -100,83 +32,6 @@ ESX.ClearTimeout = function(i)
ESX.TimeoutCallbacks[i] = nil
end
ESX.CreateFrame = function(name, url, visible)
visible = (visible == nil) and true or false
SendNUIMessage({action = 'create_frame', name = name, url = url, visible = visible})
end
ESX.SendFrameMessage = function(name, msg)
SendNUIMessage({target = name, data = msg})
end
ESX.FocusFrame = function(name, cursor)
SendNUIMessage({action = 'focus_frame', name = name})
SetNuiFocus(true, cursor)
end
RegisterNUICallback('nui_ready', function(data, cb)
TriggerEvent('esx:nui_ready')
cb('')
end)
RegisterNUICallback('frame_message', function(data, cb)
TriggerEvent('esx:frame_message', data.name, data.msg, data.cb)
cb('')
end)
ESX.LogError = function(err)
local str = err .. ' ' .. debug.traceback()
print(str)
TriggerServerEvent('esx:error:log', str);
end
ESX.LogScopeError = function(scope, err)
local str = '[esx] error in scope (' .. scope .. ') ' .. err .. ' ' .. debug.traceback()
print(str)
TriggerServerEvent('esx:error:log', str);
end
ESX.LogLoopError = function(loop, err)
local str = '[esx] error in loop (' .. loop .. ') ' .. err .. ' ' .. debug.traceback()
print(str)
TriggerServerEvent('esx:error:log', str);
end
ESX.Loop = function(name, func, wait, conditions)
ESX.Loops[name] = {
func = func,
wait = wait,
conditons = conditions or {},
name = name,
}
end
ESX.Scope = function(name, func)
local status, result = xpcall(func, function(err)
ESX.LogScopeError(name, err)
end)
return result
end
ESX.MakeScope = function(name, func)
return function(...)
local status, result = xpcall(func, ESX.LogError, function(err)
ESX.LogScopeError(name, err)
end)
return result
end
end
ESX.IsPlayerLoaded = function()
return ESX.PlayerLoaded
end
@@ -196,68 +51,32 @@ ESX.ShowNotification = function(msg)
end
ESX.ShowAdvancedNotification = function(sender, subject, msg, textureDict, iconType, flash, saveToBrief, hudColorIndex)
if saveToBrief == nil then
saveToBrief = true
end
BeginTextCommandThefeedPost('STRING')
AddTextComponentSubstringPlayerName(msg)
if hudColorIndex then
ThefeedNextPostBackgroundColor(hudColorIndex)
end
if saveToBrief == nil then saveToBrief = true end
AddTextEntry('esxAdvancedNotification', msg)
BeginTextCommandThefeedPost('esxAdvancedNotification')
if hudColorIndex then ThefeedNextPostBackgroundColor(hudColorIndex) end
EndTextCommandThefeedPostMessagetext(textureDict, textureDict, false, iconType, sender, subject)
EndTextCommandThefeedPostTicker(flash or false, saveToBrief)
EndTextCommandThefeedPostTicker(flash or false, saveToBrief)
end
ESX.ShowHelpNotification = function(msg, thisFrame, beep, duration)
BeginTextCommandDisplayHelp('STRING')
AddTextComponentSubstringPlayerName(msg)
AddTextEntry('esxHelpNotification', msg)
if thisFrame then
DisplayHelpTextThisFrame(msg, false)
DisplayHelpTextThisFrame('esxHelpNotification', false)
else
if beep == nil then beep = true end
BeginTextCommandDisplayHelp('esxHelpNotification')
EndTextCommandDisplayHelp(0, false, beep, duration or -1)
end
end
end
ESX.ShowFloatingHelpNotification = function(msg, coords, timeout)
timeout = timeout or 5000
local start = GetGameTimer()
Citizen.CreateThread(function()
while (GetGameTimer() - start) < timeout do
SetFloatingHelpTextWorldPosition(1, coords.x, coords.y, coords.z)
SetFloatingHelpTextStyle(1, 1, 2, -1, 3, 0)
BeginTextCommandDisplayHelp('STRING')
AddTextComponentSubstringPlayerName(msg)
EndTextCommandDisplayHelp(2, false, true, -1)
Citizen.Wait(0)
end
end)
end
ESX.ShowProgressBar = function(time, text)
SendNUIMessage({
type = "progressbar",
display = true,
time = time,
text = text
})
ESX.ShowFloatingHelpNotification = function(msg, coords)
AddTextEntry('esxFloatingHelpNotification', msg)
SetFloatingHelpTextWorldPosition(1, coords)
SetFloatingHelpTextStyle(1, 1, 2, -1, 3, 0)
BeginTextCommandDisplayHelp('esxFloatingHelpNotification')
EndTextCommandDisplayHelp(2, false, false, -1)
end
ESX.TriggerServerCallback = function(name, cb, ...)
@@ -273,7 +92,7 @@ ESX.TriggerServerCallback = function(name, cb, ...)
end
ESX.UI.HUD.SetDisplay = function(opacity)
ESX.SendFrameMessage('hud', {
SendNUIMessage({
action = 'setHUDDisplay',
opacity = opacity
})
@@ -295,7 +114,7 @@ ESX.UI.HUD.RegisterElement = function(name, index, priority, html, data)
table.insert(ESX.UI.HUD.RegisteredElements, name)
ESX.SendFrameMessage('hud', {
SendNUIMessage({
action = 'insertHUDElement',
name = name,
index = index,
@@ -315,14 +134,14 @@ ESX.UI.HUD.RemoveElement = function(name)
end
end
ESX.SendFrameMessage('hud', {
SendNUIMessage({
action = 'deleteHUDElement',
name = name
})
end
ESX.UI.HUD.UpdateElement = function(name, data)
ESX.SendFrameMessage('hud', {
SendNUIMessage({
action = 'updateHUDElement',
name = name,
data = data
@@ -460,7 +279,7 @@ ESX.UI.Menu.IsOpen = function(type, namespace, name)
end
ESX.UI.ShowInventoryItemNotification = function(add, item, count)
ESX.SendFrameMessage('hud', {
SendNUIMessage({
action = 'inventoryNotification',
add = add,
item = item,
@@ -666,7 +485,7 @@ end
ESX.Game.GetClosestObject = function(coords, modelFilter) return ESX.Game.GetClosestEntity(ESX.Game.GetObjects(), false, coords, modelFilter) end
ESX.Game.GetClosestPed = function(coords, modelFilter) return ESX.Game.GetClosestEntity(ESX.Game.GetPeds(true), false, coords, modelFilter) end
ESX.Game.GetClosestPlayer = function(coords, modelFilter) return ESX.Game.GetClosestEntity(ESX.Game.GetPlayers(true, true), true, coords, modelFilter) end
ESX.Game.GetClosestPlayer = function(coords) return ESX.Game.GetClosestEntity(ESX.Game.GetPlayers(true, true), true, coords, nil) end
ESX.Game.GetClosestVehicle = function(coords, modelFilter) return ESX.Game.GetClosestEntity(ESX.Game.GetVehicles(), false, coords, modelFilter) end
ESX.Game.GetPlayersInArea = function(coords, maxDistance) return EnumerateEntitiesWithinDistance(ESX.Game.GetPlayers(true, true), true, coords, maxDistance) end
ESX.Game.GetVehiclesInArea = function(coords, maxDistance) return EnumerateEntitiesWithinDistance(ESX.Game.GetVehicles(), false, coords, maxDistance) end
@@ -738,6 +557,7 @@ ESX.Game.GetVehicleProperties = function(vehicle)
bodyHealth = ESX.Math.Round(GetVehicleBodyHealth(vehicle), 1),
engineHealth = ESX.Math.Round(GetVehicleEngineHealth(vehicle), 1),
tankHealth = ESX.Math.Round(GetVehiclePetrolTankHealth(vehicle), 1),
fuelLevel = ESX.Math.Round(GetVehicleFuelLevel(vehicle), 1),
dirtLevel = ESX.Math.Round(GetVehicleDirtLevel(vehicle), 1),
@@ -827,6 +647,7 @@ ESX.Game.SetVehicleProperties = function(vehicle, props)
if props.plateIndex then SetVehicleNumberPlateTextIndex(vehicle, props.plateIndex) end
if props.bodyHealth then SetVehicleBodyHealth(vehicle, props.bodyHealth + 0.0) end
if props.engineHealth then SetVehicleEngineHealth(vehicle, props.engineHealth + 0.0) end
if props.tankHealth then SetVehiclePetrolTankHealth(vehicle, props.tankHealth + 0.0) end
if props.fuelLevel then SetVehicleFuelLevel(vehicle, props.fuelLevel + 0.0) end
if props.dirtLevel then SetVehicleDirtLevel(vehicle, props.dirtLevel + 0.0) end
if props.color1 then SetVehicleColours(vehicle, props.color1, colorSecondary) end
@@ -1109,15 +930,10 @@ ESX.ShowInventory = function()
ESX.Streaming.RequestAnimDict(dict)
if type == 'item_weapon' then
menu1.close()
Citizen.CreateThread(function()
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:removeInventoryItem', type, item)
end)
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:removeInventoryItem', type, item)
else
ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'inventory_item_count_remove', {
title = _U('amount')
@@ -1125,16 +941,11 @@ ESX.ShowInventory = function()
local quantity = tonumber(data2.value)
if quantity and quantity > 0 and data.current.count >= quantity then
menu2.close()
menu1.close()
Citizen.CreateThread(function()
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:removeInventoryItem', type, item, quantity)
end)
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:removeInventoryItem', type, item, quantity)
else
ESX.ShowNotification(_U('amount_invalid'))
end
+161 -316
View File
@@ -1,79 +1,4 @@
local isLoadoutLoaded, isPaused, pickups = false, false, {}
Citizen.CreateThread(function()
AddTextEntry('FE_THDR_GTAO', 'ESX')
local logLoopError = function(err)
ESX.LogLoopError(name, err)
end
local runLoop = function(name, loop)
local conditionsMet = true
for j=1, #loop.conditons, 1 do
if not loop.conditons[j]() then
conditionsMet = false
break
end
end
if conditionsMet then
ESX.LoopsRunning[name] = true
Citizen.CreateThread(function()
while true do
local tests = #loop.conditons
for i=1, #loop.conditons, 1 do
if not loop.conditons[i]() then
break
end
tests = tests - 1
end
if tests > 0 then
ESX.LoopsRunning[name] = false
return
end
local status, result = xpcall(loop.func, logLoopError)
if not status then
ESX.Loops[name] = nil
ESX.LoopsRunning[name] = false
return
end
Citizen.Wait(loop.wait)
end
end)
end
end
while true do
for name, loop in pairs(ESX.Loops) do
if ESX.LoopsRunning[name] ~= true then
local status, result = xpcall(runLoop, ESX.LogError, name, loop)
end
end
Citizen.Wait(250)
end
end)
local isPaused, isDead, pickups = false, false, {}
Citizen.CreateThread(function()
while true do
@@ -88,17 +13,35 @@ end)
RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(playerData)
ESX.PlayerLoaded = true
ESX.PlayerLoaded = true
ESX.PlayerData = playerData
local playerPed = PlayerPedId()
-- check if player is coming from loading screen
if GetEntityModel(PlayerPedId()) == GetHashKey('PLAYER_ZERO') then
local defaultModel = GetHashKey('a_m_y_stbla_02')
RequestModel(defaultModel)
if Config.EnablePvP then
SetCanAttackFriendly(playerPed, true, false)
NetworkSetFriendlyFireOption(true)
while not HasModelLoaded(defaultModel) do
Citizen.Wait(10)
end
SetPlayerModel(PlayerId(), defaultModel)
SetPedDefaultComponentVariation(PlayerPedId())
SetPedRandomComponentVariation(PlayerPedId(), true)
SetModelAsNoLongerNeeded(defaultModel)
end
-- freeze the player
FreezeEntityPosition(PlayerPedId(), true)
-- enable PVP
SetCanAttackFriendly(PlayerPedId(), true, false)
NetworkSetFriendlyFireOption(true)
-- disable wanted level
ClearPlayerWantedLevel(PlayerId())
SetMaxWantedLevel(0)
if Config.EnableHud then
for k,v in ipairs(playerData.accounts) do
local accountTpl = '<div><img src="img/accounts/' .. v.name .. '.png"/>&nbsp;{{money}}</div>'
@@ -117,46 +60,42 @@ AddEventHandler('esx:playerLoaded', function(playerData)
})
end
-- Bringing back spawnmanager, see commit of Smallo92 at https://github.com/extendedmode/extendedmode/commit/9979c204f1237091e94fdd46580c9e7ebc79bca7
exports.spawnmanager:spawnPlayer({
x = playerData.coords.x,
y = playerData.coords.y,
z = playerData.coords.z,
heading = playerData.coords.heading,
model = 'mp_m_freemode_01',
skipFade = false
}, function()
ESX.Game.Teleport(PlayerPedId(), {
x = playerData.coords.x,
y = playerData.coords.y,
z = playerData.coords.z + 0.25,
heading = playerData.coords.heading
}, function()
TriggerServerEvent('esx:onPlayerSpawn')
TriggerEvent('esx:onPlayerSpawn')
TriggerEvent('esx:restoreLoadout')
end)
TriggerEvent('playerSpawned') -- compatibility with old scripts, will be removed soon
TriggerEvent('esx:restoreLoadout')
Citizen.Wait(3000)
ShutdownLoadingScreen()
FreezeEntityPosition(PlayerPedId(), false)
DoScreenFadeIn(10000)
StartServerSyncLoops()
end)
end)
RegisterNetEvent('esx:setMaxWeight')
AddEventHandler('esx:setMaxWeight', function(newMaxWeight) ESX.PlayerData.maxWeight = newMaxWeight end)
AddEventHandler('esx:onPlayerSpawn', function() ESX.IsDead = false end)
AddEventHandler('esx:onPlayerDeath', function() ESX.IsDead = true end)
AddEventHandler('skinchanger:loadDefaultModel', function() isLoadoutLoaded = false end)
AddEventHandler('esx:onPlayerSpawn', function() isDead = false end)
AddEventHandler('esx:onPlayerDeath', function() isDead = true end)
AddEventHandler('skinchanger:modelLoaded', function()
while not ESX.PlayerLoaded do
while not ESX.PlayerLoaded do
Citizen.Wait(100)
end
TriggerEvent('esx:restoreLoadout')
TriggerEvent('esx:restoreLoadout')
end)
AddEventHandler('esx:restoreLoadout', function()
local playerPed = PlayerPedId()
local playerPed = PlayerPedId()
local ammoTypes = {}
RemoveAllPedWeapons(playerPed, true)
for k,v in ipairs(ESX.PlayerData.loadout) do
@@ -170,7 +109,6 @@ AddEventHandler('esx:restoreLoadout', function()
for k2,v2 in ipairs(v.components) do
local componentHash = ESX.GetWeaponComponent(weaponName, v2).hash
GiveWeaponComponentToPed(playerPed, weaponHash, componentHash)
end
@@ -179,8 +117,6 @@ AddEventHandler('esx:restoreLoadout', function()
ammoTypes[ammoType] = true
end
end
isLoadoutLoaded = true
end)
RegisterNetEvent('esx:setAccountMoney')
@@ -309,7 +245,7 @@ RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job)
if Config.EnableHud then
ESX.UI.HUD.UpdateElement('job', {
job_label = job.label,
job_label = job.label,
grade_label = job.grade_label
})
end
@@ -332,92 +268,42 @@ AddEventHandler('esx:spawnVehicle', function(vehicleName)
end)
RegisterNetEvent('esx:createPickup')
AddEventHandler('esx:createPickup', function(pickupId, label, playerId, type, name, components, tintIndex)
local playerPed = GetPlayerPed(GetPlayerFromServerId(playerId))
local entityCoords, forwardVector = GetEntityCoords(playerPed), GetEntityForwardVector(playerPed)
local objectCoords = (entityCoords + forwardVector * 1.0)
local function setupPickup(obj)
SetEntityAsMissionEntity(obj, true, false)
PlaceObjectOnGroundProperly(obj)
FreezeEntityPosition(obj, true)
SetEntityCollision(obj, false, true)
AddEventHandler('esx:createPickup', function(pickupId, label, coords, type, name, components, tintIndex)
local function setObjectProperties(object)
SetEntityAsMissionEntity(object, true, false)
PlaceObjectOnGroundProperly(object)
FreezeEntityPosition(object, true)
SetEntityCollision(object, false, true)
pickups[pickupId] = {
id = pickupId,
obj = obj,
label = label,
obj = object,
label = label,
inRange = false,
coords = objectCoords
coords = vector3(coords.x, coords.y, coords.z)
}
end
if type == 'item_weapon' then
local weaponHash = GetHashKey(name)
ESX.Streaming.RequestWeaponAsset(weaponHash)
local pickupObject = CreateWeaponObject(weaponHash, 50, coords.x, coords.y, coords.z, true, 1.0, 0)
SetWeaponObjectTintIndex(pickupObject, tintIndex)
Citizen.CreateThread(function()
local weaponHash = GetHashKey(name)
ESX.Streaming.RequestWeaponAsset(weaponHash)
local pickupObject = CreateWeaponObject(weaponHash, 50, objectCoords, true, 1.0, 0)
SetWeaponObjectTintIndex(pickupObject, tintIndex)
for k,v in ipairs(components) do
local component = ESX.GetWeaponComponent(name, v)
GiveWeaponComponentToWeaponObject(pickupObject, component.hash)
end
setupPickup(pickupObject)
end)
for k,v in ipairs(components) do
local component = ESX.GetWeaponComponent(name, v)
GiveWeaponComponentToWeaponObject(pickupObject, component.hash)
end
setObjectProperties(pickupObject)
else
ESX.Game.SpawnLocalObject('prop_money_bag_01', objectCoords, function(obj)
setupPickup(obj)
end)
ESX.Game.SpawnLocalObject('prop_money_bag_01', coords, setObjectProperties)
end
end)
RegisterNetEvent('esx:createMissingPickups')
AddEventHandler('esx:createMissingPickups', function(missingPickups)
for pickupId,pickup in pairs(missingPickups) do
local pickupObject = nil
if pickup.type == 'item_weapon' then
ESX.Streaming.RequestWeaponAsset(GetHashKey(pickup.name))
pickupObject = CreateWeaponObject(GetHashKey(pickup.name), 50, pickup.coords.x, pickup.coords.y, pickup.coords.z, true, 1.0, 0)
SetWeaponObjectTintIndex(pickupObject, pickup.tintIndex)
for k,componentName in ipairs(pickup.components) do
local component = ESX.GetWeaponComponent(pickup.name, componentName)
GiveWeaponComponentToWeaponObject(pickupObject, component.hash)
end
else
ESX.Game.SpawnLocalObject('prop_money_bag_01', pickup.coords, function(obj)
pickupObject = obj
end)
while not pickupObject do
Citizen.Wait(10)
end
end
SetEntityAsMissionEntity(pickupObject, true, false)
PlaceObjectOnGroundProperly(pickupObject)
FreezeEntityPosition(pickupObject, true)
SetEntityCollision(pickupObject, false, true)
pickups[pickupId] = {
obj = pickupObject,
label = pickup.label,
inRange = false,
coords = vector3(pickup.coords.x, pickup.coords.y, pickup.coords.z)
}
TriggerEvent('esx:createPickup', pickupId, pickup.label, pickup.coords, pickup.type, pickup.name, pickup.components, pickup.tintIndex)
end
end)
@@ -495,151 +381,110 @@ if Config.EnableHud then
end)
end
ESX.Loop('server-sync-ammo', function()
function StartServerSyncLoops()
-- keep track of ammo
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
if isDead then
Citizen.Wait(500)
else
local playerPed = PlayerPedId()
if IsPedShooting(playerPed) then
local _,weaponHash = GetCurrentPedWeapon(playerPed, true)
local weapon = ESX.GetWeaponFromHash(weaponHash)
if IsPedShooting(playerPed) then
local _,weaponHash = GetCurrentPedWeapon(playerPed, true)
local weapon = ESX.GetWeaponFromHash(weaponHash)
if weapon then
local ammoCount = GetAmmoInPedWeapon(playerPed, weaponHash)
TriggerServerEvent('esx:updateWeaponAmmo', weapon.name, ammoCount)
end
end
if weapon then
local ammoCount = GetAmmoInPedWeapon(playerPed, weaponHash)
TriggerServerEvent('esx:updateWeaponAmmo', weapon.name, ammoCount)
end
end
end
end
end)
end, 250, {
function() return ESX.PlayerLoaded and (not ESX.IsDead) end
})
-- sync current player coords with server
Citizen.CreateThread(function()
local previousCoords = vector3(ESX.PlayerData.coords.x, ESX.PlayerData.coords.y, ESX.PlayerData.coords.z)
local previousCoords
while true do
Citizen.Wait(1000)
local playerPed = PlayerPedId()
ESX.Loop('server-sync-coords', function()
local playerPed = PlayerPedId()
if DoesEntityExist(playerPed) then
local playerCoords = GetEntityCoords(playerPed)
previousCoords = previousCoords or playerCoords
local distance = #(playerCoords - previousCoords)
if distance > 1 then
previousCoords = playerCoords
local playerHeading = ESX.Math.Round(GetEntityHeading(playerPed), 1)
local formattedCoords = {x = ESX.Math.Round(playerCoords.x, 1), y = ESX.Math.Round(playerCoords.y, 1), z = ESX.Math.Round(playerCoords.z, 1), heading = playerHeading}
TriggerServerEvent('esx:updateCoords', formattedCoords)
end
end
end, 1000, {
function() return ESX.PlayerLoaded and (not ESX.IsDead) end
})
-- Disable wanted level
if Config.DisableWantedLevel then
ESX.Loop('disable-wanted-level', function()
local playerId = PlayerId()
if GetPlayerWantedLevel(playerId) ~= 0 then
SetPlayerWantedLevel(playerId, 0, false)
SetPlayerWantedLevelNow(playerId, false)
end
end, 0)
if DoesEntityExist(playerPed) then
local playerCoords = GetEntityCoords(playerPed)
local distance = #(playerCoords - previousCoords)
if distance > 1 then
previousCoords = playerCoords
local playerHeading = ESX.Math.Round(GetEntityHeading(playerPed), 1)
local formattedCoords = {x = ESX.Math.Round(playerCoords.x, 1), y = ESX.Math.Round(playerCoords.y, 1), z = ESX.Math.Round(playerCoords.z, 1), heading = playerHeading}
TriggerServerEvent('esx:updateCoords', formattedCoords)
end
end
end
end)
end
-- Pickups
local pickupsInRange = {}
local closestUsablePickup = nil
ESX.Loop('get-pickups-in-range', function()
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
pickupsInRange = {}
closestUsablePickup = nil
for pickupId, pickup in pairs(pickups) do
local distance = #(playerCoords - pickup.coords)
if distance < 5.0 then
pickupsInRange[#pickupsInRange + 1] = pickup
if distance < 1.0 then
closestUsablePickup = pickup
end
end
end
end, 500)
ESX.Loop('draw-pickups', function()
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
for i=1, #pickupsInRange, 1 do
local pickup = pickupsInRange[i]
ESX.ShowFloatingHelpNotification(pickup.label, {
x = pickup.coords.x,
y = pickup.coords.y,
z = pickup.coords.z + 0.25
}, 100)
end
end, 0)
ESX.Loop('pickup-actions', function()
local playerPed = PlayerPedId()
local pickup = closestUsablePickup
if IsControlJustReleased(0, 38) then
if IsPedOnFoot(playerPed) then
Citizen.CreateThread(function()
local dict, anim = 'weapons@first_person@aim_rng@generic@projectile@sticky_bomb@', 'plant_floor'
ESX.Streaming.RequestAnimDict(dict)
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:onPickup', pickup.id)
PlaySoundFrontend(-1, 'PICK_UP', 'HUD_FRONTEND_DEFAULT_SOUNDSET', false)
end)
end
end
end, 0, {
function() return closestUsablePickup ~= nil end
})
AddEventHandler('luaconsole:getHandlers', function(cb)
local name = GetCurrentResourceName()
cb(name, function(code, env)
if env ~= nil then
for k,v in pairs(env) do _ENV[k] = v end
return load(code, 'lc:' .. name, 'bt', _ENV)
else
return load(code, 'lc:' .. name, 'bt')
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if IsControlJustReleased(0, 289) then
if IsInputDisabled(0) and not isDead and not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then
ESX.ShowInventory()
end
end
end
end)
-- Pickups
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
local playerCoords, letSleep = GetEntityCoords(playerPed), true
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer(playerCoords)
for pickupId,pickup in pairs(pickups) do
local distance = #(playerCoords - pickup.coords)
if distance < 5 then
local label = pickup.label
letSleep = false
if distance < 1 then
if IsControlJustReleased(0, 38) then
if IsPedOnFoot(playerPed) and (closestDistance == -1 or closestDistance > 3) and not pickup.inRange then
pickup.inRange = true
local dict, anim = 'weapons@first_person@aim_rng@generic@projectile@sticky_bomb@', 'plant_floor'
ESX.Streaming.RequestAnimDict(dict)
TaskPlayAnim(playerPed, dict, anim, 8.0, 1.0, 1000, 16, 0.0, false, false, false)
Citizen.Wait(1000)
TriggerServerEvent('esx:onPickup', pickupId)
PlaySoundFrontend(-1, 'PICK_UP', 'HUD_FRONTEND_DEFAULT_SOUNDSET', false)
end
end
label = ('%s~n~%s'):format(label, _U('threw_pickup_prompt'))
end
ESX.Game.Utils.DrawText3D({
x = pickup.coords.x,
y = pickup.coords.y,
z = pickup.coords.z + 0.25
}, label, 1.2, 1)
elseif pickup.inRange then
pickup.inRange = false
end
end
if letSleep then
Citizen.Wait(500)
end
end
end)
+52 -39
View File
@@ -1,51 +1,64 @@
AddEventHandler('baseevents:onPlayerDied', function(killerType, deathCoords)
Citizen.CreateThread(function()
local isDead = false
local playerPed = PlayerPedId()
while true do
Citizen.Wait(0)
local player = PlayerId()
if NetworkIsPlayerActive(player) then
local playerPed = PlayerPedId()
if IsPedFatallyInjured(playerPed) and not isDead then
isDead = true
local killerEntity, deathCause = GetPedSourceOfDeath(playerPed), GetPedCauseOfDeath(playerPed)
local killerClientId = NetworkGetPlayerIndexFromPed(killerEntity)
if killerEntity ~= playerPed and killerClientId and NetworkIsPlayerActive(killerClientId) then
PlayerKilledByPlayer(GetPlayerServerId(killerClientId), killerClientId, deathCause)
else
PlayerKilled(deathCause)
end
elseif not IsPedFatallyInjured(playerPed) then
isDead = false
end
end
end
end)
function PlayerKilledByPlayer(killerServerId, killerClientId, deathCause)
local victimCoords = GetEntityCoords(PlayerPedId())
local killerCoords = GetEntityCoords(GetPlayerPed(killerClientId))
local distance = #(victimCoords - killerCoords)
local data = {
killed = false,
killerType = killerType,
deathCoords = deathCoords,
deathCause = GetPedCauseOfDeath(playerPed)
victimCoords = {x = ESX.Math.Round(victimCoords.x, 1), y = ESX.Math.Round(victimCoords.y, 1), z = ESX.Math.Round(victimCoords.z, 1)},
killerCoords = {x = ESX.Math.Round(killerCoords.x, 1), y = ESX.Math.Round(killerCoords.y, 1), z = ESX.Math.Round(killerCoords.z, 1)},
killedByPlayer = true,
deathCause = deathCause,
distance = ESX.Math.Round(distance, 1),
killerServerId = killerServerId,
killerClientId = killerClientId
}
TriggerEvent('esx:onPlayerDeath', data)
TriggerServerEvent('esx:onPlayerDeath', data)
TriggerServerEvent('esx:onPlayerDeath', data)
end
end)
AddEventHandler('baseevents:onPlayerKilled', function(killerId, data)
function PlayerKilled(deathCause)
local playerPed = PlayerPedId()
local killer = GetPlayerFromServerId(killerId)
local victimCoords = GetEntityCoords(playerPed)
if NetworkIsPlayerActive(killer) then
local data = {
victimCoords = {x = ESX.Math.Round(victimCoords.x, 1), y = ESX.Math.Round(victimCoords.y, 1), z = ESX.Math.Round(victimCoords.z, 1)},
local victimCoords = data.killerpos
local weaponHash = data.weaponhash
data.killerpos = nil
data.weaponhash = nil
local killerPed = GetPlayerPed(killer)
local killerCoords = GetEntityCoords(killerPed)
local distance = GetDistanceBetweenCoords(victimCoords[1], victimCoords[2], victimCoords[3], killerCoords, false)
data.victimCoords = victimCoords
data.weaponHash = weaponHash
data.deathCause = GetPedCauseOfDeath(playerPed)
data.killed = true
data.killerId = killerId
data.killerCoords = {x = killerCoords.x, y = killerCoords.y, z = killerCoords.z}
data.distance = distance
else
data.killed = false
data.deathCause = GetPedCauseOfDeath(playerPed)
end
killedByPlayer = false,
deathCause = deathCause
}
TriggerEvent('esx:onPlayerDeath', data)
TriggerServerEvent('esx:onPlayerDeath', data)
end)
TriggerServerEvent('esx:onPlayerDeath', data)
end
+1 -1
View File
@@ -6,7 +6,7 @@ RegisterNUICallback('__chunk', function(data, cb)
if data['end'] then
local msg = json.decode(Chunks[data.id])
TriggerEvent(data.__namespace .. ':message:' .. data.__type, msg)
TriggerEvent(GetCurrentResourceName() .. ':message:' .. data.__type, msg)
Chunks[data.id] = nil
end
-18
View File
@@ -1,18 +0,0 @@
OnESX = function(cb)
local ESX = nil
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
cb(ESX)
end)
end
exports('OnESX', OnESX)
-13
View File
@@ -4,19 +4,6 @@ for i = 48, 57 do table.insert(Charset, string.char(i)) end
for i = 65, 90 do table.insert(Charset, string.char(i)) end
for i = 97, 122 do table.insert(Charset, string.char(i)) end
-- Be careful with this, use it for some config file parsing and such
ESX.EvalFile = function(resource, file, env)
env = env or {}
env._G = env
local code = LoadResourceFile(resource, file)
load(code, code, 't', env)()
return env
end
ESX.GetRandomString = function(length)
math.randomseed(GetGameTimer())
+17 -8
View File
@@ -2,20 +2,29 @@ Config = {}
Config.Locale = 'en'
Config.Accounts = {
bank = _U('account_bank'),
bank = _U('account_bank'),
black_money = _U('account_black_money'),
money = _U('account_money')
money = _U('account_money')
}
Config.StartingAccountMoney = {bank = 50000}
Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society
Config.DisableWantedLevel = true
Config.EnableHud = true -- enable the default hud? Display current job and accounts (black, bank & cash)
Config.EnablePvP = true -- enable pvp?
Config.MaxWeight = 24 -- the max inventory weight without backpack
Config.PaycheckInterval = 7 * 60000 -- how often to recieve pay checks in milliseconds
Config.EnableDebug = false
Config.PaycheckInterval = 7 * 60000 -- how often to recieve pay checks in milliseconds
Config.EnableDebug = false
Config.InventoryKey = 'REPLAY_START_STOP_RECORDING_SECONDARY' -- Key F2 by default
Config.IncompatibleResourcesToStop = {
['essentialmode'] = 'ES for short, the performance heavy RP framework no one uses - and source for the random unwanted ZAP ads you\'re seeing',
['es_admin2'] = 'Adminstration tool for the ancient ES framework that wont work with ESX',
['esplugin_mysql'] = 'MySQL "plugin" for the ancient ES framework that has a SQL injection vulnerability',
['es_ui'] = 'Money HUD for ES',
['spawnmanager'] = 'Default resource that takes care of spawning players, ESX does this already',
['mapmanager'] = 'Default resource that was required by spawnmanager, but neither are used',
['basic-gamemode'] = 'Resource that is solely for choosing the default game type',
['fivem'] = 'Resource that is solely for choosing the default game type',
['fivem-map-hipster'] = 'Default spawn locations for mapmanager',
['fivem-map-skater'] = 'Default spawn locations for mapmanager',
['baseevents'] = 'Default resource for handling death events, ESX does this already'
}
+40 -46
View File
@@ -1,55 +1,49 @@
CREATE DATABASE IF NOT EXISTS `es_extended`;
USE `es_extended`;
CREATE TABLE IF NOT EXISTS `migrations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`module` varchar(50) NOT NULL,
`last` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `users` (
`identifier` VARCHAR(40) NOT NULL,
`accounts` LONGTEXT NULL DEFAULT NULL,
`group` VARCHAR(50) NULL DEFAULT 'user',
`inventory` LONGTEXT NULL DEFAULT NULL,
`job` VARCHAR(20) NULL DEFAULT 'unemployed',
`job_grade` INT(11) NULL DEFAULT 0,
`loadout` LONGTEXT NULL DEFAULT NULL,
`position` VARCHAR(53) NULL DEFAULT '{"x":-269.4,"y":-955.3,"z":31.2,"heading":205.8}',
CREATE TABLE IF NOT EXISTS `items` (
`name` varchar(50) NOT NULL,
`label` varchar(50) NOT NULL,
`weight` int(11) NOT NULL DEFAULT 1,
`rare` tinyint(1) NOT NULL DEFAULT 0,
`can_remove` tinyint(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
PRIMARY KEY (`identifier`)
);
CREATE TABLE IF NOT EXISTS `jobs` (
`name` varchar(50) NOT NULL,
`label` varchar(50) DEFAULT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `items` (
`name` VARCHAR(50) NOT NULL,
`label` VARCHAR(50) NOT NULL,
`weight` INT(11) NOT NULL DEFAULT 1,
`rare` TINYINT(1) NOT NULL DEFAULT 0,
`can_remove` TINYINT(1) NOT NULL DEFAULT 1,
CREATE TABLE IF NOT EXISTS `job_grades` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_name` varchar(50) DEFAULT NULL,
`grade` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`label` varchar(50) NOT NULL,
`salary` int(11) NOT NULL,
`skin_male` longtext NOT NULL,
`skin_female` longtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4;
PRIMARY KEY (`name`)
);
CREATE TABLE IF NOT EXISTS `users` (
`identifier` varchar(40) NOT NULL,
`accounts` longtext DEFAULT NULL,
`group` varchar(50) DEFAULT 'user',
`inventory` longtext DEFAULT '[]',
`job` varchar(20) DEFAULT 'unemployed',
`job_grade` int(11) DEFAULT 0,
`loadout` longtext DEFAULT '[]',
`position` varchar(53) DEFAULT '{"x":-269.4,"y":-955.3,"z":31.2,"heading":205.8}',
`phone_number` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`is_dead` tinyint(1) DEFAULT 0,
PRIMARY KEY (`identifier`),
UNIQUE KEY `index_users_phone_number` (`phone_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `job_grades` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`job_name` VARCHAR(50) DEFAULT NULL,
`grade` INT(11) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`label` VARCHAR(50) NOT NULL,
`salary` INT(11) NOT NULL,
`skin_male` LONGTEXT NOT NULL,
`skin_female` LONGTEXT NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `job_grades` VALUES (1,'unemployed',0,'unemployed','Unemployed',200,'{}','{}');
CREATE TABLE `jobs` (
`name` VARCHAR(50) NOT NULL,
`label` VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (`name`)
);
INSERT INTO `jobs` VALUES ('unemployed','Unemployed');
INSERT INTO `job_grades` VALUES (1,'unemployed',0,'unemployed','Unemployed',200,'{}','{}');
+41 -60
View File
@@ -4,14 +4,23 @@ game 'gta5'
description 'ES Extended'
version '2.0.0'
version '1.2.0'
server_scripts {
'@async/async.lua',
'@mysql-async/lib/MySQL.lua',
'locale.lua',
'locales/*.lua',
'locales/de.lua',
'locales/br.lua',
'locales/fr.lua',
'locales/en.lua',
'locales/fi.lua',
'locales/sv.lua',
'locales/pl.lua',
'locales/cs.lua',
'locales/sc.lua',
'locales/tc.lua',
'config.lua',
'config.weapons.lua',
@@ -25,15 +34,21 @@ server_scripts {
'common/modules/math.lua',
'common/modules/table.lua',
'common/functions.lua',
'common/bootstrap.lua',
'common/functions.lua'
}
client_scripts {
'locale.lua',
'locales/*.lua',
'locales/de.lua',
'locales/br.lua',
'locales/fr.lua',
'locales/en.lua',
'locales/fi.lua',
'locales/sv.lua',
'locales/pl.lua',
'locales/cs.lua',
'locales/sc.lua',
'locales/tc.lua',
'config.lua',
'config.weapons.lua',
@@ -50,74 +65,40 @@ client_scripts {
'common/modules/math.lua',
'common/modules/table.lua',
'common/functions.lua',
'common/bootstrap.lua',
'common/functions.lua'
}
ui_page {
'hud/index.html'
'html/ui.html'
}
files {
'client/bootstrap.lua',
'locale.js',
'hud/**/*',
'html/ui.html',
'html/css/app.css',
'html/js/mustache.min.js',
'html/js/wrapper.js',
'html/js/app.js',
'html/fonts/pdown.ttf',
'html/fonts/bankgothic.ttf',
'html/img/accounts/bank.png',
'html/img/accounts/black_money.png',
'html/img/accounts/money.png'
}
exports {
'getSharedObject',
'OnESX',
'getSharedObject'
}
server_exports {
'getSharedObject',
'OnESX',
'getSharedObject'
}
dependencies {
'spawnmanager',
'baseevents',
'mysql-async',
'async',
'cron',
'skinchanger',
'async'
}
-- ESX Modules
esxmodule = function(name)
file('modules/' .. name .. '/data/**/*')
client_script('modules/' .. name .. '/client/module.lua')
client_script('modules/' .. name .. '/client/main.lua')
client_script('modules/' .. name .. '/client/events.lua')
server_script('modules/' .. name .. '/server/module.lua')
server_script('modules/' .. name .. '/server/main.lua')
server_script('modules/' .. name .. '/server/events.lua')
end
-- Misc
esxmodule 'input' -- Evented input manager
esxmodule 'interact' -- Interact menu (marker / npc)
-- Extend
esxmodule 'addonaccount' -- Addon account
esxmodule 'addoninventory' -- Addon inventory
esxmodule 'datastore' -- Arbitrary data store
esxmodule 'society' -- Society management
-- UI
esxmodule 'hud' -- Money / society etc... HUD
esxmodule 'menu_default' -- Default menu
esxmodule 'menu_dialog' -- Dialog menu
esxmodule 'menu_list' -- List menu
-- Misc
esxmodule 'skin' -- Skin management
esxmodule 'accessories' -- Skin accessories management
-- Jobs
esxmodule 'job_police' -- Job police
@@ -20,8 +20,8 @@ html {
padding: 4px;
text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;
text-align: right;
top: 20;
right: 20;
top: 80;
right: 40;
}
#inventory_notifications {

Before

Width:  |  Height:  |  Size: 1015 B

After

Width:  |  Height:  |  Size: 1015 B

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Before

Width:  |  Height:  |  Size: 662 B

After

Width:  |  Height:  |  Size: 662 B

@@ -33,7 +33,7 @@
if (i == str.length - 1)
data.end = true;
$.post('http://' + GetCurrentResourceName() + '/__chunk', JSON.stringify(data));
$.post('http://' + namespace + '/__chunk', JSON.stringify(data));
}
-19
View File
@@ -1,19 +0,0 @@
html, body, #frames, #frames > div, #frames > div > iframe {
width : 100vw;
height : 100vh;
margin : 0;
padding : 0;
border : 0;
background-color: transparent;
}
#frames > div, #frames > div > iframe {
position: absolute;
left: 0;
top: 0;
}
#pb {
display: none;
overflow: hidden;
}
-120
View File
@@ -1,120 +0,0 @@
(() => {
class ESX {
constructor() {
this.frames = {};
this.modulePath = '../modules';
window.addEventListener('message', e => {
for(let name in this.frames) {
if(this.frames[name].iframe.contentWindow === e.source) {
this.onFrameMessage(name, e.data);
return;
}
}
this.onMessage(e.data);
});
$.post('http://es_extended/nui_ready', '{}');
}
createFrame(name, url, visible = true) {
const frame = document.createElement('div');
const iframe = document.createElement('iframe');
frame.appendChild(iframe);
iframe.src = url;
this.frames[name] = {frame, iframe};
this.frames[name].iframe.addEventListener('message', e => this.onFrameMessage(name, e.data));
this.frames[name].frame.style.pointerEvents = 'none';
document.querySelector('#frames').appendChild(frame);
if(!visible)
this.hideFrame(name);
return this.frames[name];
}
destroyFrame(name) {
document.querySelector('#frames').removeChild(this.frames[name].frame);
this.frames[name].frame.remove();
}
showFrame(name) {
this.frames[name].frame.style.display = 'block';
}
hideFrame(name) {
this.frames[name].frame.style.display = 'none';
}
focusFrame(name) {
for(let k in this.frames) {
if(k === name)
this.frames[k].frame.style.pointerEvents = 'all';
else
this.frames[k].frame.style.pointerEvents = 'none';
}
this.frames[name].iframe.contentWindow.focus();
}
onMessage(msg) {
if(msg.target) {
if(this.frames[msg.target])
this.frames[msg.target].iframe.contentWindow.postMessage(msg.data);
else
console.error('[esx:nui] cannot find frame : ' + msg.target);
} else {
switch(msg.action) {
case 'create_frame' : {
this.createFrame(msg.name, msg.url, msg.visible);
break;
}
case 'destroy_frame' : {
this.destroyFrame(msg.name);
break;
}
case 'focus_frame' : {
this.focusFrame(msg.name);
break;
}
default: break;
}
}
}
onFrameMessage(name, msg) {
$.post('http://es_extended/frame_message', JSON.stringify({name, msg}));
}
}
ESX = new ESX();
})();
-15
View File
@@ -1,15 +0,0 @@
<html>
<head>
<title>esx</title>
<link rel="stylesheet" href="app.css"/>
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&display=swap" rel="stylesheet">
</head>
<body>
<div id="frames"></div>
<div id="ui"></div>
<script src="nui://game/ui/jquery.js"></script>
<script src="app.js"></script>
</body>
</html>
-35
View File
@@ -1,35 +0,0 @@
document.getElementById('ui').innerHTML = "<div id='pb'><div id='pbar_outerdiv' style='margin-top: 45.5%; left: 42.5%; background-color: rgba(0,0,0,0.25); width: 15%; height: 30px; z-index: 1; position: relative; border-style: solid; border-radius: 3px; border-width: 2px;'><div id='pbar_innerdiv' style='background-color: rgba(0, 83, 236, 0.95); z-index: 2; height: 100%; width: 0%; border-radius: 3px;'></div><div id='pbar_innertext' style='color: white; z-index: 3; position: absolute; top: 3px; left: 0; width: 100%; height: 100%; font-weight: bold; text-align: center; font-family: Bebas Neue, cursive; margin-top: 2px; letter-spacing: 2px;'>0%</div></div></div>";
$(function(){
window.onload = (e) => {
window.addEventListener('message', (event) => {
var item = event.data;
if (item !== undefined && item.type === "progressbar") {
if (item.display === true) {
$("#pb").show();
var start = new Date();
var maxTime = item.time;
var text = item.text;
var timeoutVal = Math.floor(maxTime/100);
animateUpdate();
$('#pbar_innertext').text(text);
function updateProgress(percentage) {
$('#pbar_innerdiv').css("width", percentage + "%");
}
function animateUpdate() {
var now = new Date();
var timeDiff = now.getTime() - start.getTime();
var perc = Math.round((timeDiff/maxTime)*100);
if (perc <= 100) {
updateProgress(perc);
setTimeout(animateUpdate, timeoutVal);
} else {
$("#pb").hide();
}
}
} else {
$("#pb").hide();
}
}
});
};
});
-43
View File
@@ -1,43 +0,0 @@
(() => {
let ESXWrapper = {};
ESXWrapper.MessageSize = 1024;
ESXWrapper.messageId = 0;
window.SendMessage = function (namespace, type, msg) {
ESXWrapper.messageId = (ESXWrapper.messageId < 65535) ? ESXWrapper.messageId + 1 : 0;
const str = JSON.stringify(msg);
for (let i = 0; i < str.length; i++) {
let count = 0;
let chunk = '';
while (count < ESXWrapper.MessageSize && i < str.length) {
chunk += str[i];
count++;
i++;
}
i--;
const data = {
__namespace: namespace,
__type: type,
id: ESXWrapper.messageId,
chunk: chunk
}
if (i == str.length - 1)
data.end = true;
$.post('http://es_extended/__chunk', JSON.stringify(data));
}
}
})()
-10
View File
@@ -19,13 +19,3 @@ end
function _U(str, ...) -- Translate string first char uppercase
return tostring(_(str, ...):gsub("^%l", string.upper))
end
function LoadLocale(ns, lang, data)
Locales[lang] = Locales[lang] or {}
for k,v in pairs(data) do
Locales[lang][ns .. ':' .. k] =v
end
end
+87 -88
View File
@@ -10,9 +10,9 @@ Locales['pl'] = {
['giveammo'] = 'daj amunicje',
['amountammo'] = 'ilość amunicji',
['noammo'] = 'nie posiadasz wystarczającej ilości amunicji!',
['gave_item'] = 'dajesz ~y~%sx~s~ ~b~%s~s~ dla ~y~%s~s~',
['received_item'] = 'otrzymujesz ~y~%sx~s~ ~b~%s~s~ od ~b~%s~s~',
['gave_weapon'] = 'dajesz ~b~%s~s~ dla ~y~%s~s~',
['gave_item'] = 'dałeś/aś ~y~%sx~s~ ~b~%s~s~ dla ~y~%s~s~',
['received_item'] = 'otrzymałeś/aś ~y~%sx~s~ ~b~%s~s~ od ~b~%s~s~',
['gave_weapon'] = 'dałeś/aś ~b~%s~s~ dla ~y~%s~s~',
['gave_weapon_ammo'] = 'dałeś/aś ~o~%sx %s~s~ do ~b~%s~s~ dla ~y~%s~s~',
['gave_weapon_withammo'] = 'dałeś/aś ~b~%s~s~ z ~o~%sx %s~s~ dla ~y~%s~s~',
['gave_weapon_hasalready'] = '~y~%s~s~ już posiada ~y~%s~s~',
@@ -22,8 +22,8 @@ Locales['pl'] = {
['received_weapon_withammo'] = 'otrzymałeś/aś ~b~%s~s~ z ~o~%sx %s~s~ od ~b~%s~s~',
['received_weapon_hasalready'] = '~b~%s~s~ próbował/a przekazać ci ~y~%s~s~, lecz już posiadasz jedno',
['received_weapon_noweapon'] = '~b~%s~s~ próbował/a przekazać ci amunicje do ~y~%s~s~, lecz nie posiadasz tej broni',
['gave_account_money'] = 'dajesz ~g~%s$~s~ (%s) dla ~y~%s~s~',
['received_account_money'] = 'otrzymujesz ~g~%s$~s~ (%s) od ~b~%s~s~',
['gave_account_money'] = 'dałeś/aś ~g~%s$~s~ (%s) dla ~y~%s~s~',
['received_account_money'] = 'otrzymałeś/aś ~g~%s$~s~ (%s) od ~b~%s~s~',
['amount_invalid'] = 'nieprawidłowa ilość',
['players_nearby'] = 'brak graczy w pobliżu',
['ex_inv_lim'] = 'akcja nie jest możliwa, nie możesz mieć więcej ~y~%s~s~',
@@ -33,76 +33,75 @@ Locales['pl'] = {
['threw_account'] = 'wyrzuciłeś/aś ~g~$%s~s~ ~b~%s~s~',
['threw_weapon'] = 'wyrzuciłeś/aś ~b~%s~s~',
['threw_weapon_ammo'] = 'wyrzuciłeś/aś ~b~%s~s~ z ~o~%sx %s~s~',
['threw_weapon_already'] = 'you already carry the same weapon',
['threw_cannot_pickup'] = 'you cannot pickup that because your inventory is full!',
['threw_pickup_prompt'] = 'press ~y~E~s~ to pickup',
['threw_weapon_already'] = 'już posiadasz taką samą broń',
['threw_cannot_pickup'] = 'nie możesz tego podnieść, gdyż masz pełny ekwipunek!',
['threw_pickup_prompt'] = 'naciśnij ~y~E~s~ aby podnieść',
-- Key mapping
['keymap_showinventory'] = 'show Inventory',
['keymap_showinventory'] = 'pokaż ekwipunek',
-- Salary related
['received_salary'] = 'otrzymałeś wynagrodzenie: ~g~%s$~s~',
['received_help'] = 'otrzymałem zapomogę: ~g~$%s~s~',
['received_salary'] = 'otrzymałeś/aś wynagrodzenie: ~g~%s$~s~',
['received_help'] = 'otrzymałeś/aś zapomogę: ~g~$%s~s~',
['company_nomoney'] = 'firma, w której pracujesz, jest zbyt biedna, by wypłacić twoją pensję',
['received_paycheck'] = 'otrzymana wypłata',
['received_paycheck'] = 'otrzymano wypłate',
['bank'] = 'bank',
['account_bank'] = 'bank',
['account_black_money'] = 'dirty Money',
['account_money'] = 'cash',
['account_black_money'] = 'brudne pieniądze',
['account_money'] = 'pieniądze',
['act_imp'] = 'działanie niemożliwe',
['in_vehicle'] = 'nie możesz przekazywać przedmiotów w pojeździe',
-- Commands
['command_car'] = 'spawn an vehicle',
['command_car_car'] = 'vehicle spawn name or hash',
['command_cardel'] = 'delete vehicle in proximity',
['command_cardel_radius'] = 'optional, delete every vehicle within the specified radius',
['command_clear'] = 'clear chat',
['command_clearall'] = 'clear chat for all players',
['command_clearinventory'] = 'clear player inventory',
['command_clearloadout'] = 'clear a player loadout',
['command_giveaccountmoney'] = 'give account money',
['command_giveaccountmoney_account'] = 'valid account name',
['command_giveaccountmoney_amount'] = 'amount to add',
['command_giveaccountmoney_invalid'] = 'invalid account name',
['command_giveitem'] = 'give an item to a player',
['command_giveitem_item'] = 'item name',
['command_giveitem_count'] = 'item count',
['command_giveweapon'] = 'give a weapon to a player',
['command_giveweapon_weapon'] = 'weapon name',
['command_giveweapon_ammo'] = 'ammo count',
['command_giveweapon_hasalready'] = 'player already has that weapon',
['command_giveweaponcomponent'] = 'give weapon component',
['command_giveweaponcomponent_component'] = 'component name',
['command_giveweaponcomponent_invalid'] = 'invalid weapon component',
['command_giveweaponcomponent_hasalready'] = 'player already has that weapon component',
['command_giveweaponcomponent_missingweapon'] = 'player does not have that weapon',
['command_save'] = 'save a player to database',
['command_saveall'] = 'save all players to database',
['command_setaccountmoney'] = 'set account money for a player',
['command_setaccountmoney_amount'] = 'amount of money to set',
['command_setcoords'] = 'teleport to coordinates',
['command_car'] = 'przywołaj pojazd',
['command_car_car'] = 'nazwa lub hash przywołanego pojazdu',
['command_cardel'] = 'usuń pojazd w pobliżu',
['command_cardel_radius'] = 'opcjonalnie usuń każdy pojazd w obszarze',
['command_clear'] = 'wyczyść czat',
['command_clearall'] = 'wyczyść czat dla wszystkich graczy',
['command_clearinventory'] = 'wyczyść ekwipunek gracza',
['command_clearloadout'] = 'wyczyść wyposarzenie gracza',
['command_giveaccountmoney'] = 'daj pieniądze na podany typ konta',
['command_giveaccountmoney_account'] = 'prawidłowy typ konta',
['command_giveaccountmoney_amount'] = 'ilość do dodania',
['command_giveaccountmoney_invalid'] = 'nieprawidłowy typ konta',
['command_giveitem'] = 'daj przedmiot graczowi',
['command_giveitem_item'] = 'nazwa przedmiotu',
['command_giveitem_count'] = 'ilość przedimotu',
['command_giveweapon'] = 'daj broń graczowi',
['command_giveweapon_weapon'] = 'nazwa broni',
['command_giveweapon_ammo'] = 'ilość amunicji',
['command_giveweapon_hasalready'] = 'gracz już posiada tą broń',
['command_giveweaponcomponent'] = 'daj komponent do broni graczowi',
['command_giveweaponcomponent_component'] = 'nazwa komponentu',
['command_giveweaponcomponent_invalid'] = 'nieprawidłowy komponent do broni',
['command_giveweaponcomponent_hasalready'] = 'gracz już posiada ten komponent do tej broni',
['command_giveweaponcomponent_missingweapon'] = 'gracz nie posiada tej broni',
['command_save'] = 'zapisz gracza w bazie danych',
['command_saveall'] = 'zapisz wszystkich graczy w bazie danych',
['command_setaccountmoney'] = 'ustaw ilość pieniędzy danego konta dla gracza',
['command_setaccountmoney_amount'] = 'ilość pieniędzy do ustawienia',
['command_setcoords'] = 'teleportuj na koordynaty',
['command_setcoords_x'] = 'x axis',
['command_setcoords_y'] = 'y axis',
['command_setcoords_z'] = 'z axis',
['command_setjob'] = 'set job for a player',
['command_setjob_job'] = 'job name',
['command_setjob_grade'] = 'job grade',
['command_setjob_invalid'] = 'the job, grade or both are invalid',
['command_setgroup'] = 'set player group',
['command_setgroup_group'] = 'group name',
['commanderror_argumentmismatch'] = 'argument count mismatch (passed %s, wanted %s)',
['commanderror_argumentmismatch_number'] = 'argument #%s type mismatch (passed string, wanted number)',
['commanderror_invaliditem'] = 'invalid item name',
['commanderror_invalidweapon'] = 'invalid weapon',
['commanderror_console'] = 'that command can not be run from console',
['commanderror_invalidcommand'] = '^3%s^0 is not an valid command!',
['commanderror_invalidplayerid'] = 'there is no player online matching that server id',
['commandgeneric_playerid'] = 'player id',
['command_setjob'] = 'ustaw prace dla gracza',
['command_setjob_job'] = 'nazwa pracy',
['command_setjob_grade'] = 'stanowisko w pracy',
['command_setjob_invalid'] = 'praca, stanowisko lub obydwa są nieprawidłowe',
['command_setgroup'] = 'ustaw grupe gracza',
['command_setgroup_group'] = 'nazwa grupy',
['commanderror_argumentmismatch'] = 'nieprawiłowa ilość argumentów (przeszło %s, wymagane %s)',
['commanderror_argumentmismatch_number'] = 'nieprawidłowy typ argumentu #%s (przeszedł tekst, wymagany numer)',
['commanderror_invaliditem'] = 'nieprawidłowa nazwa przedmiotu',
['commanderror_invalidweapon'] = 'nieprawidłowa broń',
['commanderror_console'] = 'podana komenda nie może zostać uruchomiona przez konsole',
['commanderror_invalidcommand'] = '^3%s^0 nie jest poprawną komendą!',
['commanderror_invalidplayerid'] = 'brak dostepnego gracza pasującego do podanego id serwerowego',
['commandgeneric_playerid'] = 'id gracza',
-- Locale settings
['locale_digit_grouping_symbol'] = ' ',
['locale_digit_grouping_symbol'] = ',',
['locale_currency'] = '$%s',
-- Weapons
@@ -184,42 +183,42 @@ Locales['pl'] = {
-- Weapon Components
['component_clip_default'] = 'domyślny tłumik',
['component_clip_extended'] = 'rozszerzony tłumik',
['component_clip_drum'] = 'drum Magazine',
['component_clip_box'] = 'box Magazine',
['component_clip_drum'] = 'magazynek bębnowy',
['component_clip_box'] = 'magazynek',
['component_flashlight'] = 'latarka',
['component_scope'] = 'luneta',
['component_scope_advanced'] = 'zaawansowana luneta',
['component_suppressor'] = 'tłumik',
['component_grip'] = 'uchwyt',
['component_luxary_finish'] = 'luxary Weapon Finish',
['component_luxary_finish'] = 'luksusowe wykończenie broni',
-- Weapon Ammo
['ammo_rounds'] = 'round(s)',
['ammo_shells'] = 'shell(s)',
['ammo_charge'] = 'charge',
['ammo_petrol'] = 'gallons of fuel',
['ammo_firework'] = 'firework(s)',
['ammo_rockets'] = 'rocket(s)',
['ammo_grenadelauncher'] = 'grenade(s)',
['ammo_grenade'] = 'grenade(s)',
['ammo_stickybomb'] = 'bomb(s)',
['ammo_pipebomb'] = 'bomb(s)',
['ammo_smokebomb'] = 'bomb(s)',
['ammo_molotov'] = 'cocktail(s)',
['ammo_proxmine'] = 'mine(s)',
['ammo_bzgas'] = 'can(s)',
['ammo_ball'] = 'ball(s)',
['ammo_snowball'] = 'snowball(s)',
['ammo_flare'] = 'flare(s)',
['ammo_flaregun'] = 'flare(s)',
['ammo_rounds'] = 'nabój/oi',
['ammo_shells'] = 'pocisk(ów)',
['ammo_charge'] = 'naładowania',
['ammo_petrol'] = 'galon(y) paliwa',
['ammo_firework'] = 'fajerwerka/i',
['ammo_rockets'] = 'rakieta/y',
['ammo_grenadelauncher'] = 'granat(y)',
['ammo_grenade'] = 'granat(y)',
['ammo_stickybomb'] = 'bomba/y',
['ammo_pipebomb'] = 'bomba/y',
['ammo_smokebomb'] = 'bomba/y',
['ammo_molotov'] = 'kontail(e)',
['ammo_proxmine'] = 'mina/y',
['ammo_bzgas'] = 'puszka/ek',
['ammo_ball'] = 'kula/e',
['ammo_snowball'] = 'snieżka/i',
['ammo_flare'] = 'flara/y',
['ammo_flaregun'] = 'flara/y',
-- Weapon Tints
['tint_default'] = 'default skin',
['tint_green'] = 'green skin',
['tint_gold'] = 'gold skin',
['tint_pink'] = 'pink skin',
['tint_army'] = 'army skin',
['tint_lspd'] = 'blue skin',
['tint_orange'] = 'orange skin',
['tint_platinum'] = 'platinum skin',
['tint_default'] = 'domyślny skin',
['tint_green'] = 'zielony skin',
['tint_gold'] = 'złoty skin',
['tint_pink'] = 'różowy skin',
['tint_army'] = 'wojskowy skin',
['tint_lspd'] = 'niebieski skin',
['tint_orange'] = 'pomarańczowy skin',
['tint_platinum'] = 'platynowy skin',
}
+1 -1
View File
@@ -42,7 +42,7 @@ Locales['sc'] = {
-- Salary related
['received_salary'] = '你收到了你的工资: ~g~$%s~s~',
['received_help'] = '鉴于你良好的表现,系统赠送给你一些奖励: ~g~$%s~s~',
['received_help'] = '你领取到了你的失业救济金: ~g~$%s~s~',
['company_nomoney'] = '你受雇的公司太穷了,无法支付你的工资。',
['received_paycheck'] = '收到转账',
['bank'] = '花园银行',
+1 -1
View File
@@ -42,7 +42,7 @@ Locales['tc'] = {
-- Salary related
['received_salary'] = '您收到您的薪水: ~g~$%s~s~',
['received_help'] = '由於您表現良好,系統給予您一些獎勵: ~g~$%s~s~',
['received_help'] = '你領取到了你的失業救濟金: ~g~$%s~s~',
['company_nomoney'] = '您的公司太窮了,無法給予您薪水。',
['received_paycheck'] = '收到轉帳',
['bank'] = '花園銀行',
-39
View File
@@ -1,39 +0,0 @@
local self = ESX.Modules['accessories']
local Input = ESX.Modules['input']
AddEventHandler('esx_accessories:hasEnteredMarker', function(zone)
self.CurrentAction = 'shop_menu'
self.CurrentActionMsg = _U('press_access')
self.CurrentActionData = { accessory = zone }
end)
AddEventHandler('esx_accessories:hasExitedMarker', function(zone)
ESX.UI.Menu.CloseAll()
self.CurrentAction = nil
end)
-- Key Controls
Input.On('released', Input.Groups.MOVE, Input.Controls.PICKUP, function(lastPressed)
if self.CurrentAction and (not ESX.IsDead) then
self.CurrentAction()
self.CurrentAction = nil
end
end)
if self.Config.EnableControls then
Input.On('released', Input.Groups.MOVE, Input.Controls.REPLAY_SHOWHOTKEY, function(lastPressed)
if not ESX.IsDead then
self.OpenAccessoryMenu()
end
end)
end
-3
View File
@@ -1,3 +0,0 @@
local self = ESX.Modules['accessories']
self.Init()
-192
View File
@@ -1,192 +0,0 @@
ESX.Modules['accessories'] = {}
local self = ESX.Modules['accessories']
-- Locals
local Input = ESX.Modules['input']
local Interact = ESX.Modules['interact']
-- Properties
self.Config = ESX.EvalFile(GetCurrentResourceName(), 'modules/accessories/data/config.lua', {
vector3 = vector3
})['Config']
self.Init = function()
self.RegisterControls()
local translations = ESX.EvalFile(GetCurrentResourceName(), 'modules/accessories/data/locales/' .. Config.Locale .. '.lua')['Translations']
LoadLocale('accessories', Config.Locale, translations)
for k,v in pairs(self.Config.Zones) do
for i = 1, #v.Pos, 1 do
local key = 'accessories:' .. k .. ':' .. i
Interact.Register({
name = key,
type = 'marker',
distance = self.Config.DrawDistance,
radius = 2.0,
pos = v.Pos[i],
size = self.Config.Size.z,
mtype = self.Config.Type,
color = self.Config.Color,
rotate = true,
accessory = k
})
AddEventHandler('esx:interact:enter:' .. key, function(data)
ESX.ShowHelpNotification(_U('accessories:press_access'))
self.CurrentAction = function()
self.OpenShopMenu(data.accessory)
end
end)
AddEventHandler('esx:interact:exit:' .. key, function(data)
self.CurrentAction = nil
end)
end
end
for k,v in pairs(self.Config.ShopsBlips) do
if v.Pos ~= nil then
for i=1, #v.Pos, 1 do
local blip = AddBlipForCoord(v.Pos[i])
SetBlipSprite (blip, v.Blip.sprite)
SetBlipDisplay(blip, 4)
SetBlipScale (blip, 1.0)
SetBlipColour (blip, v.Blip.color)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(_U('accessories:shop', _U(string.lower(k))))
EndTextCommandSetBlipName(blip)
end
end
end
end
self.OpenAccessoryMenu = function()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'set_unset_accessory', {
title = _U('accessories:set_unset'),
align = 'top-left',
elements = {
{label = _U('accessories:helmet'), value = 'Helmet'},
{label = _U('accessories:ears'), value = 'Ears'},
{label = _U('accessories:mask'), value = 'Mask'},
{label = _U('accessories:glasses'), value = 'Glasses'}
}}, function(data, menu)
menu.close()
self.SetUnsetAccessory(data.current.value)
end, function(data, menu)
menu.close()
end)
end
self.SetUnsetAccessory = function(accessory)
ESX.TriggerServerCallback('esx_accessories:get', function(hasAccessory, accessorySkin)
local _accessory = string.lower(accessory)
if hasAccessory then
TriggerEvent('skinchanger:getSkin', function(skin)
local mAccessory = -1
local mColor = 0
if _accessory == "mask" then
mAccessory = 0
end
if skin[_accessory .. '_1'] == mAccessory then
mAccessory = accessorySkin[_accessory .. '_1']
mColor = accessorySkin[_accessory .. '_2']
end
local accessorySkin = {}
accessorySkin[_accessory .. '_1'] = mAccessory
accessorySkin[_accessory .. '_2'] = mColor
TriggerEvent('skinchanger:loadClothes', skin, accessorySkin)
end)
else
ESX.ShowNotification(_U('accessories:no_' .. _accessory))
end
end, accessory)
end
self.OpenShopMenu = function(accessory)
local _accessory = string.lower(accessory)
local restrict = {}
restrict = { _accessory .. '_1', _accessory .. '_2' }
TriggerEvent('esx_skin:openRestrictedMenu', function(data, menu)
menu.close()
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop_confirm', {
title = _U('accessories:valid_purchase'),
align = 'top-left',
elements = {
{label = _U('accessories:no'), value = 'no'},
{label = _U('accessories:yes', ESX.Math.GroupDigits(self.Config.Price)), value = 'yes'}
}}, function(data, menu)
menu.close()
if data.current.value == 'yes' then
ESX.TriggerServerCallback('esx_accessories:checkMoney', function(hasEnoughMoney)
if hasEnoughMoney then
TriggerServerEvent('esx_accessories:pay')
TriggerEvent('skinchanger:getSkin', function(skin)
TriggerServerEvent('esx_accessories:save', skin, accessory)
end)
else
TriggerEvent('esx_skin:getLastSkin', function(skin)
TriggerEvent('skinchanger:loadSkin', skin)
end)
ESX.ShowNotification(_U('accessories:not_enough_money'))
end
end)
end
if data.current.value == 'no' then
local player = PlayerPedId()
TriggerEvent('esx_skin:getLastSkin', function(skin)
TriggerEvent('skinchanger:loadSkin', skin)
end)
if accessory == "Ears" then
ClearPedProp(player, 2)
elseif accessory == "Mask" then
SetPedComponentVariation(player, 1, 0 ,0, 2)
elseif accessory == "Helmet" then
ClearPedProp(player, 0)
elseif accessory == "Glasses" then
SetPedPropIndex(player, 1, -1, 0, 0)
end
end
self.CurrentAction = 'shop_menu'
self.CurrentActionMsg = _U('accessories:press_access')
self.CurrentActionData = {}
end, function(data, menu)
menu.close()
self.CurrentAction = 'shop_menu'
self.CurrentActionMsg = _U('accessories:press_access')
self.CurrentActionData = {}
end)
end, function(data, menu)
menu.close()
self.CurrentAction = 'shop_menu'
self.CurrentActionMsg = _U('accessories:press_access')
self.CurrentActionData = {}
end, restrict)
end
self.RegisterControls = function()
Input.RegisterControl(Input.Groups.MOVE, Input.Controls.PICKUP)
Input.RegisterControl(Input.Groups.MOVE, Input.Controls.REPLAY_SHOWHOTKEY)
end
-97
View File
@@ -1,97 +0,0 @@
Config = {}
Config.Locale = 'fr'
Config.Price = 100
Config.EnableControls = true
Config.DrawDistance = 100.0
Config.Size = {x = 1.5, y = 1.5, z = 1.0}
Config.Color = {r = 102, g = 102, b = 204, a = 100}
Config.Type = 1
-- Fill this if you want to see the blips,
-- If you have esx_clothesshop you should not fill this
-- more than it's already filled.
Config.ShopsBlips = {
Ears = {
Pos = nil,
Blip = nil
},
Mask = {
Pos = {
vector3(-1338.1, -1278.2, 3.8),
},
Blip = {sprite = 362, color = 2}
},
Helmet = {
Pos = nil,
Blip = nil
},
Glasses = {
Pos = nil,
Blip = nil
}
}
Config.Zones = {
Ears = {
Pos = {
vector3(80.3, -1389.4, 28.4),
vector3(-163.0, -302.0, 38.8),
vector3(-163.0,-302.0, 38.8),
vector3(420.7, -809.6, 28.6),
vector3(-817.0, -1075.9, 10.4),
vector3(-1451.3, -238.2, 48.9),
vector3(-0.7, 6513.6, 30.9),
vector3(123.4, -208.0, 53.6),
vector3(1687.3, 4827.6, 41.1),
vector3(622.8, 2749.2, 41.2),
vector3(1200.0, 2705.4, 37.3),
vector3(-1199.9, -782.5, 16.4),
vector3(-3171.8, 1059.6, 19.9),
vector3(-1095.6, 2709.2, 18.2),
}},
Mask = {
Pos = {
vector3(-1338.1, -1278.2, 3.8),
}},
Helmet = {
Pos = {
vector3(81.5, -1400.6, 28.4),
vector3(-705.8, -159.0, 36.5),
vector3(-161.3, -295.7, 38.8),
vector3(419.3, -800.6, 28.6),
vector3(-824.3, -1081.7, 10.4),
vector3(-1454.8, -242.9, 48.9),
vector3(4.7, 6520.9, 30.9),
vector3(121.0, -223.2, 53.3),
vector3(1689.6, 4818.8, 41.1),
vector3(613.9, 2749.9, 41.2),
vector3(1189.5, 2703.9, 37.3),
vector3(-1204.0, -774.4, 16.4),
vector3(-3164.2, 1054.7, 19.9),
vector3(-1103.1, 2700.5, 18.2),
}},
Glasses = {
Pos = {
vector3(75.2, -1391.1, 28.4),
vector3(-713.1, -160.1, 36.5),
vector3(-156.1, -300.5, 38.8),
vector3(425.4, -807.8, 28.6),
vector3(-820.8, -1072.9, 10.4),
vector3(-1458.0, -236.7, 48.9),
vector3(3.5, 6511.5, 30.9),
vector3(131.3, -212.3, 53.6),
vector3(1694.9, 4820.8, 41.1),
vector3(613.9, 2768.8, 41.2),
vector3(1198.6, 2711.0, 37.3),
vector3(-1188.2, -764.5, 16.4),
vector3(-3173.1, 1038.2, 19.9),
vector3(-1100.4, 2712.4, 18.2),
}}
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'ověřit nákup?',
['yes'] = 'ano (<span style="color: green;">$%s</span>)',
['no'] = 'ne',
['helmet'] = 'helma / Čepice',
['glasses'] = 'brýle',
['mask'] = 'maska',
['ears'] = 'doplňky na uši',
['shop'] = '%s obchod',
['set_unset'] = 'nasadit / Sundat',
['not_enough_money'] = 'nemáte dostatek peněz',
['press_access'] = 'zmáčkněte ~INPUT_CONTEXT~ pro otevření menu',
['accessories_blip'] = 'doplňky',
['no_ears'] = 'nemáte doplňky na uši',
['no_glasses'] = 'nemáte brýle',
['no_helmet'] = 'nemáte helmu',
['no_mask'] = 'nemáte masku',
['you_paid'] = 'zaplatili jste ~g~$%s~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'validate this purchase?',
['yes'] = 'yes (<span style="color: green;">$%s</span>)',
['no'] = 'no',
['helmet'] = 'helmet / Hat',
['glasses'] = 'glasses',
['mask'] = 'mask',
['ears'] = 'ears accessories',
['shop'] = '%s shop',
['set_unset'] = 'put on / Take off',
['not_enough_money'] = 'you do not have enough money',
['press_access'] = 'press ~INPUT_CONTEXT~ to access the menu',
['accessories_blip'] = 'accessories',
['no_ears'] = 'you do not have ears accessories',
['no_glasses'] = 'you do not have glasses',
['no_helmet'] = 'you do not have a helmet',
['no_mask'] = 'you do not have a mask',
['you_paid'] = 'you paid ~g~$%s~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'varmista ostos?',
['yes'] = 'kyllä (<span style="color: green;">$%s</span>)',
['no'] = 'ei',
['helmet'] = 'kypärä / Hattu',
['glasses'] = 'lasit',
['mask'] = 'maskit',
['ears'] = 'korva asusteet',
['shop'] = '%s asustekauppa',
['set_unset'] = 'laita päälle / Ota pois',
['not_enough_money'] = 'sinulla ei ole tarpeeksi rahaa',
['press_access'] = 'paina ~INPUT_CONTEXT~ avataksesi menu',
['accessories_blip'] = 'asusteet',
['no_ears'] = 'sinulla ei ole korva asusteita',
['no_glasses'] = 'sinulla ei ole laseja',
['no_helmet'] = 'sinulla ei ole kypäriä',
['no_mask'] = 'sinulla ei ole maskeja',
['you_paid'] = 'sinä maksoit ~g~$%s~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'valider cet achat?',
['yes'] = 'oui (<span style="color: green;">$%s</span>)',
['no'] = 'non',
['helmet'] = 'casque / Chapeau',
['glasses'] = 'lunettes',
['mask'] = 'masque',
['ears'] = 'accessoires d\'oreilles',
['shop'] = '%s magasin de',
['set_unset'] = 'mettre / Enlever',
['not_enough_money'] = 'vous n\'avez pas assez d\'argent',
['press_access'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder au menu',
['accessories_blip'] = 'accessoires',
['no_ears'] = 'vous n\'avez pas d\'accessoires d\'oreilles',
['no_glasses'] = 'vous n\'avez pas de lunettes',
['no_helmet'] = 'vous n\'avez pas de casque / chapeau',
['no_mask'] = 'vous n\'avez pas de masque',
['you_paid'] = 'vous avez payé ~g~$%s~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'czy napewno chcesz to zakupić?',
['yes'] = 'tak (<span style="color: green;">%s $</span>)',
['no'] = 'nie',
['helmet'] = 'hełm / Czapka',
['glasses'] = 'okulary',
['mask'] = 'maska',
['ears'] = 'akcesoria uszu',
['shop'] = 'sklep %s ',
['set_unset'] = 'załóż / Zdejmij',
['not_enough_money'] = 'nie masz wystarczająco pieniędzy',
['press_access'] = 'wciśnij ~INPUT_CONTEXT~ aby otworzyć menu',
['accessories_blip'] = 'akcesoria',
['no_ears'] = 'nie posiadasz akcesorii uszu',
['no_glasses'] = 'nie posiadasz okularów',
['no_helmet'] = 'nie posiadasz nakrycia głowy',
['no_mask'] = 'nie posiadasz maski',
['you_paid'] = 'płacisz ~g~%s $~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'Подтверждаете покупку',
['yes'] = 'Да (<span style="color: green;">$%s</span>)',
['no'] = 'Нет',
['helmet'] = 'Шлем / Шапка',
['glasses'] = 'Очки',
['mask'] = 'Маска',
['ears'] = 'Аксессуары для ушей',
['shop'] = 'Магазин %s',
['set_unset'] = 'Положить / Снять',
['not_enough_money'] = 'У вас не достаточно денег',
['press_access'] = 'Нажмите ~INPUT_CONTEXT~ для доступа к меню',
['accessories_blip'] = 'Аксессуары',
['no_ears'] = 'У вас нет аксессуаров для ушей',
['no_glasses'] = 'У вас нет очков',
['no_helmet'] = 'У вас нет шлема',
['no_mask'] = 'У вас нет маски',
['you_paid'] = 'Вы заплатили ~g~$%s~s~',
}
-19
View File
@@ -1,19 +0,0 @@
Translations = {
['valid_purchase'] = 'bekräfta köp?',
['yes'] = 'ja (<span style="color: green;">%s SEK</span>)',
['no'] = 'nej',
['helmet'] = 'hjälm / hat',
['glasses'] = 'glasögon',
['mask'] = 'ansiktsmask',
['ears'] = 'örontillbehör',
['shop'] = '%s affär',
['set_unset'] = 'ta på / av',
['not_enough_money'] = 'du har inte råd!',
['press_access'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn.',
['accessories_blip'] = 'extrautröstning',
['no_ears'] = 'du har inga öron tillbehör',
['no_glasses'] = 'du har inga glasögon',
['no_helmet'] = 'du har ingen hjälm',
['no_mask'] = 'du har inte någon mask',
['you_paid'] = 'du har betalat ~g~%s SEK~s~',
}
-4
View File
@@ -1,4 +0,0 @@
USE `es_extended`;
ALTER TABLE `users` ADD COLUMN `accessories` LONGTEXT NULL DEFAULT NULL;
-95
View File
@@ -1,95 +0,0 @@
local self = ESX.Modules['accessories']
-- BEGIN extend xPlayer stuff
-- add properties and methods to xPlayer when bulding its instance
AddEventHandler('esx:player:create', function(xPlayer)
xPlayer.set('getAccessories', function()
return xPlayer.get('accessories')
end)
xPlayer.set('setAccessories', function(accessories)
xPlayer.set('accessories', accessories)
end)
end)
-- add field when serializing xPlayer instance (for sending in event for example)
AddEventHandler('esx:player:serialize', function(xPlayer, add)
add({accessories = xPlayer.getAccessories()})
end)
-- add field when serializing xPlayer instance to DB
AddEventHandler('esx:player:serialize:db', function(xPlayer, add)
add({accessories = json.encode(xPlayer.getAccessories())})
end)
-- handle sql field loading from DB
AddEventHandler('esx:player:load:accessories', function(identifier, playerId, row, userData, addTask)
addTask(function(cb)
local data = {}
if row.accessories and row.accessories ~= '' then
data = json.decode(row.accessories)
else
data = {}
end
cb({accessories = data})
end)
end)
-- END extend xPlayer stuff
RegisterServerEvent('esx_accessories:pay')
AddEventHandler('esx_accessories:pay', function()
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeMoney(self.Config.Price)
TriggerClientEvent('esx:showNotification', source, _U('accesories:you_paid', ESX.Math.GroupDigits(self.Config.Price)))
end)
RegisterServerEvent('esx_accessories:save')
AddEventHandler('esx_accessories:save', function(skin, accessory)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
local item1 = string.lower(accessory) .. '_1'
local item2 = string.lower(accessory) .. '_2'
local accessories = xPlayer.getAccessories()
accessories[accessory] = {
[item1] = skin[item1],
[item2] = skin[item2],
}
xPlayer.setAccessories(accessories)
end)
ESX.RegisterServerCallback('esx_accessories:get', function(source, cb, accessory)
local xPlayer = ESX.GetPlayerFromId(source)
local skin = xPlayer.accessories[accessory]
local hasAccessory = skin ~= nil
cb(hasAccessory, skin)
end)
ESX.RegisterServerCallback('esx_accessories:checkMoney', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
cb(xPlayer.getMoney() >= self.Config.Price)
end)
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['accessories']
-8
View File
@@ -1,8 +0,0 @@
ESX.Modules['accessories'] = {}
local self = ESX.Modules['accessories']
-- Properties
self.Config = ESX.EvalFile(GetCurrentResourceName(), 'modules/accessories/data/config.lua', {
vector3 = vector3
})['Config']
-20
View File
@@ -1,20 +0,0 @@
USE `es_extended`;
CREATE TABLE IF NOT EXISTS `addon_account` (
`name` VARCHAR(60) NOT NULL,
`label` VARCHAR(100) NOT NULL,
`shared` INT(11) NOT NULL,
PRIMARY KEY (`name`)
);
CREATE TABLE IF NOT EXISTS `addon_account_data` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`account_name` VARCHAR(100) DEFAULT NULL,
`money` INT(11) NOT NULL,
`owner` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `index_addon_account_data_account_name_owner` (`account_name`, `owner`),
INDEX `index_addon_account_data_account_name` (`account_name`)
);
-113
View File
@@ -1,113 +0,0 @@
local self = ESX.Modules['addonaccount']
AddEventHandler('esx_addonaccount:getAccount', function(name, owner, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetAccount(name, owner))
end)
end)
AddEventHandler('esx_addonaccount:getSharedAccount', function(name, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetSharedAccount(name))
end)
end)
AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
local addonAccounts = {}
for i=1, #self.AccountsIndex, 1 do
local name = self.AccountsIndex[i]
local account = GetAccount(name, xPlayer.identifier)
if account == nil then
MySQL.Async.execute('INSERT INTO addon_account_data (account_name, money, owner) VALUES (@account_name, @money, @owner)', {
['@account_name'] = name,
['@money'] = 0,
['@owner'] = xPlayer.identifier
})
account = self.CreateAddonAccount(name, xPlayer.identifier, 0)
table.insert(self.Accounts[name], account)
end
table.insert(addonAccounts, account)
end
xPlayer.set('addonAccounts', addonAccounts)
end)
end)
MySQL.ready(function()
local result = MySQL.Sync.fetchAll('SELECT * FROM addon_account')
for i=1, #result, 1 do
local name = result[i].name
local label = result[i].label
local shared = result[i].shared
local result2 = MySQL.Sync.fetchAll('SELECT * FROM addon_account_data WHERE account_name = @account_name', {
['@account_name'] = name
})
if shared == 0 then
table.insert(self.AccountsIndex, name)
self.Accounts[name] = {}
for j=1, #result2, 1 do
local addonAccount = CreateAddonAccount(name, result2[j].owner, result2[j].money)
table.insert(self.Accounts[name], addonAccount)
end
else
local money = nil
if #result2 == 0 then
MySQL.Sync.execute('INSERT INTO addon_account_data (account_name, money, owner) VALUES (@account_name, @money, NULL)', {
['@account_name'] = name,
['@money'] = 0
})
money = 0
else
money = result2[1].money
end
local addonAccount = self.CreateAddonAccount(name, nil, money)
self.SharedAccounts[name] = addonAccount
end
end
self.Ready = true
end)
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['addonaccount']
-67
View File
@@ -1,67 +0,0 @@
ESX.Modules['addonaccount'] = {}
local self = ESX.Modules['addonaccount']
self.Ready = false
self.AccountsIndex = {}
self.Accounts = {}
self.SharedAccounts = {}
self.GetAccount = function(name, owner)
for i=1, #self.Accounts[name], 1 do
if self.Accounts[name][i].owner == owner then
return self.Accounts[name][i]
end
end
end
self.GetSharedAccount = function(name)
return self.SharedAccounts[name]
end
self.CreateAddonAccount = function(name, owner, money)
local self = {}
self.name = name
self.owner = owner
self.money = money
self.addMoney = function(m)
self.money = self.money + m
self.save()
TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.removeMoney = function(m)
self.money = self.money - m
self.save()
TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.setMoney = function(m)
self.money = m
self.save()
TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.save = function()
if self.owner == nil then
MySQL.Async.execute('UPDATE addon_account_data SET money = @money WHERE account_name = @account_name', {
['@account_name'] = self.name,
['@money'] = self.money
})
else
MySQL.Async.execute('UPDATE addon_account_data SET money = @money WHERE account_name = @account_name AND owner = @owner', {
['@account_name'] = self.name,
['@money'] = self.money,
['@owner'] = self.owner
})
end
end
return self
end
-22
View File
@@ -1,22 +0,0 @@
USE `es_extended`;
CREATE TABLE IF NOT EXISTS `addon_inventory` (
`name` VARCHAR(60) NOT NULL,
`label` VARCHAR(100) NOT NULL,
`shared` INT(11) NOT NULL,
PRIMARY KEY (`name`)
);
CREATE TABLE IF NOT EXISTS `addon_inventory_items` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`inventory_name` VARCHAR(100) NOT NULL,
`name` VARCHAR(100) NOT NULL,
`count` INT(11) NOT NULL,
`owner` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `index_addon_inventory_items_inventory_name_name` (`inventory_name`, `name`),
INDEX `index_addon_inventory_items_inventory_name_name_owner` (`inventory_name`, `name`, `owner`),
INDEX `index_addon_inventory_inventory_name` (`inventory_name`)
);
-124
View File
@@ -1,124 +0,0 @@
local self = ESX.Modules['addoninventory']
AddEventHandler('esx_addoninventory:getInventory', function(name, owner, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetInventory(name, owner))
end)
end)
AddEventHandler('esx_addoninventory:getSharedInventory', function(name, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetSharedInventory(name))
end)
end)
AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
local addonInventories = {}
for i=1, #self.InventoriesIndex, 1 do
local name = self.InventoriesIndex[i]
local inventory = self.GetInventory(name, xPlayer.identifier)
if inventory == nil then
inventory = self.CreateAddonInventory(name, xPlayer.identifier, {})
table.insert(self.Inventories[name], inventory)
end
table.insert(addonInventories, inventory)
end
xPlayer.set('addonInventories', addonInventories)
end)
end)
MySQL.ready(function()
local items = MySQL.Sync.fetchAll('SELECT * FROM items')
for i=1, #items, 1 do
self.Items[items[i].name] = items[i].label
end
local result = MySQL.Sync.fetchAll('SELECT * FROM addon_inventory')
for i=1, #result, 1 do
local name = result[i].name
local label = result[i].label
local shared = result[i].shared
local result2 = MySQL.Sync.fetchAll('SELECT * FROM addon_inventory_items WHERE inventory_name = @inventory_name', {
['@inventory_name'] = name
})
if shared == 0 then
table.insert(self.InventoriesIndex, name)
self.Inventories[name] = {}
local items = {}
for j=1, #result2, 1 do
local itemName = result2[j].name
local itemCount = result2[j].count
local itemOwner = result2[j].owner
if items[itemOwner] == nil then
items[itemOwner] = {}
end
table.insert(items[itemOwner], {
name = itemName,
count = itemCount,
label = Items[itemName]
})
end
for k,v in pairs(items) do
local addonInventory = CreateAddonInventory(name, k, v)
table.insert(self.Inventories[name], addonInventory)
end
else
local items = {}
for j=1, #result2, 1 do
table.insert(items, {
name = result2[j].name,
count = result2[j].count,
label = self.Items[result2[j].name]
})
end
local addonInventory = self.CreateAddonInventory(name, nil, items)
self.SharedInventories[name] = addonInventory
end
end
self.Ready = true
end)
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['addoninventory']
-104
View File
@@ -1,104 +0,0 @@
ESX.Modules['addoninventory'] = {}
local self = ESX.Modules['addoninventory']
self.Ready = false
self.Items = {}
self.InventoriesIndex = {}
self.Inventories = {}
self.SharedInventories = {}
self.GetInventory = function(name, owner)
for i=1, #self.Inventories[name], 1 do
if self.Inventories[name][i].owner == owner then
return self.Inventories[name][i]
end
end
end
self.GetSharedInventory = function(name)
return self.SharedInventories[name]
end
self.CreateAddonInventory = function(name, owner, items)
local self = {}
self.name = name
self.owner = owner
self.items = items
self.addItem = function(name, count)
local item = self.getItem(name)
item.count = item.count + count
self.saveItem(name, item.count)
end
self.removeItem = function(name, count)
local item = self.getItem(name)
item.count = item.count - count
self.saveItem(name, item.count)
end
self.setItem = function(name, count)
local item = self.getItem(name)
item.count = count
self.saveItem(name, item.count)
end
self.getItem = function(name)
for i=1, #self.items, 1 do
if self.items[i].name == name then
return self.items[i]
end
end
item = {
name = name,
count = 0,
label = Items[name]
}
table.insert(self.items, item)
if self.owner == nil then
MySQL.Async.execute('INSERT INTO addon_inventory_items (inventory_name, name, count) VALUES (@inventory_name, @item_name, @count)',
{
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = 0
})
else
MySQL.Async.execute('INSERT INTO addon_inventory_items (inventory_name, name, count, owner) VALUES (@inventory_name, @item_name, @count, @owner)',
{
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = 0,
['@owner'] = self.owner
})
end
return item
end
self.saveItem = function(name, count)
if self.owner == nil then
MySQL.Async.execute('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name', {
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = count
})
else
MySQL.Async.execute('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name AND owner = @owner', {
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = count,
['@owner'] = self.owner
})
end
end
return self
end
-20
View File
@@ -1,20 +0,0 @@
USE `es_extended`;
CREATE TABLE IF NOT EXISTS `datastore` (
`name` VARCHAR(60) NOT NULL,
`label` VARCHAR(100) NOT NULL,
`shared` INT(11) NOT NULL,
PRIMARY KEY (`name`)
);
CREATE TABLE IF NOT EXISTS `datastore_data` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(60) NOT NULL,
`owner` VARCHAR(40),
`data` LONGTEXT,
PRIMARY KEY (`id`),
UNIQUE INDEX `index_datastore_data_name_owner` (`name`, `owner`),
INDEX `index_datastore_data_name` (`name`)
);
-114
View File
@@ -1,114 +0,0 @@
local self = ESX.Modules['datastore']
AddEventHandler('esx_datastore:getDataStore', function(name, owner, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetDataStore(name, owner))
end)
end)
AddEventHandler('esx_datastore:getDataStoreOwners', function(name, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetDataStoreOwners(name))
end)
end)
AddEventHandler('esx_datastore:getSharedDataStore', function(name, cb)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
cb(self.GetSharedDataStore(name))
end)
end)
AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
Citizen.CreateThread(function()
while not self.Ready do
Citizen.Wait(0)
end
for i=1, #self.DataStoresIndex, 1 do
local name = self.DataStoresIndex[i]
local dataStore = self.GetDataStore(name, xPlayer.identifier)
if not dataStore then
MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', {
['@name'] = name,
['@owner'] = xPlayer.identifier,
['@data'] = '{}'
})
dataStore = CreateDataStore(name, xPlayer.identifier, {})
table.insert(self.DataStores[name], dataStore)
end
end
end)
end)
MySQL.ready(function()
local result = MySQL.Sync.fetchAll('SELECT * FROM datastore')
for i=1, #result, 1 do
local name, label, shared = result[i].name, result[i].label, result[i].shared
local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', {
['@name'] = name
})
if shared == 0 then
table.insert(self.DataStoresIndex, name)
self.DataStores[name] = {}
for j=1, #result2, 1 do
local storeName = result2[j].name
local storeOwner = result2[j].owner
local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data))
local dataStore = self.CreateDataStore(storeName, storeOwner, storeData)
table.insert(self.DataStores[name], dataStore)
end
else
local data
if #result2 == 0 then
MySQL.Sync.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, NULL, \'{}\')', {
['@name'] = name
})
data = {}
else
data = json.decode(result2[1].data)
end
local dataStore = self.CreateDataStore(name, nil, data)
self.SharedDataStores[name] = dataStore
end
end
self.Ready = true
end)
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['datastore']
-118
View File
@@ -1,118 +0,0 @@
ESX.Modules['datastore'] = {}
local self = ESX.Modules['datastore']
self.Ready = false
self.DataStores = {}
self.DataStoresIndex = {}
self.SharedDataStores = {}
local stringsplit = function(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
self.GetDataStore = function(name, owner)
for i=1, #self.DataStores[name], 1 do
if self.DataStores[name][i].owner == owner then
return self.DataStores[name][i]
end
end
end
self.GetDataStoreOwners = function(name)
local identifiers = {}
for i=1, #self.DataStores[name], 1 do
table.insert(identifiers, self.DataStores[name][i].owner)
end
return identifiers
end
self.GetSharedDataStore = function(name)
return self.SharedDataStores[name]
end
self.CreateDataStore = function(name, owner, data)
local self = {}
self.name = name
self.owner = owner
self.data = data
local timeoutCallbacks = {}
self.set = function(key, val)
data[key] = val
self.save()
end
self.get = function(key, i)
local path = stringsplit(key, '.')
local obj = self.data
for i=1, #path, 1 do
obj = obj[path[i]]
end
if i == nil then
return obj
else
return obj[i]
end
end
self.count = function(key, i)
local path = stringsplit(key, '.')
local obj = self.data
for i=1, #path, 1 do
obj = obj[path[i]]
end
if i ~= nil then
obj = obj[i]
end
if obj == nil then
return 0
else
return #obj
end
end
self.save = function()
for i=1, #timeoutCallbacks, 1 do
ESX.ClearTimeout(timeoutCallbacks[i])
timeoutCallbacks[i] = nil
end
local timeoutCallback = ESX.SetTimeout(10000, function()
if self.owner == nil then
MySQL.Async.execute('UPDATE datastore_data SET data = @data WHERE name = @name', {
['@data'] = json.encode(self.data),
['@name'] = self.name,
})
else
MySQL.Async.execute('UPDATE datastore_data SET data = @data WHERE name = @name and owner = @owner', {
['@data'] = json.encode(self.data),
['@name'] = self.name,
['@owner'] = self.owner,
})
end
end)
table.insert(timeoutCallbacks, timeoutCallback)
end
return self
end
-5
View File
@@ -1,5 +0,0 @@
local self = ESX.Modules['hud']
AddEventHandler('esx:nui_ready', function()
ESX.CreateFrame('hud', 'nui://' .. GetCurrentResourceName() .. '/modules/hud/data/html/ui.html')
end)
-4
View File
@@ -1,4 +0,0 @@
local self = ESX.Modules['hud']
-5
View File
@@ -1,5 +0,0 @@
ESX.Modules['hud'] = {};
local self = ESX.Modules['hud']
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['hud']
-3
View File
@@ -1,3 +0,0 @@
local self = ESX.Modules['hud']
-3
View File
@@ -1,3 +0,0 @@
ESX.Modules['hud'] = {};
local self = ESX.Modules['hud']
-1
View File
@@ -1 +0,0 @@
local self = ESX.Modules['input']
-69
View File
@@ -1,69 +0,0 @@
local self = ESX.Modules['input']
self.InitESX()
Citizen.CreateThread(function()
while true do
local events = {
pressed = {},
released = {},
dpressed = {},
dreleased = {},
}
for group, ids in pairs(self.RegisteredControls) do
for i=1, #ids, 1 do
local id = ids[i]
if self.IsControlEnabled(group, id) then
if IsControlJustPressed(group, id) then
events.pressed[#events.pressed + 1] = {group, id, self.LastPressed[group][id]}
end
if IsControlJustReleased(group, id) then
events.released[#events.released + 1] = {group, id, self.LastReleased[group][id]}
end
else
DisableControlAction(group, id, true);
if IsDisabledControlJustPressed(group, id) then
events.dpressed[#events.dpressed + 1] = {group, id, self.LastDisabledPressed[group][id]}
self.LastDisabledPressed[group][id] = GetGameTimer()
end
if IsDisabledControlJustReleased(group, id) then
events.dreleased[#events.dreleased + 1] = {group, id, self.LastDisabledReleased[group][id]}
self.LastDisabledReleased[group][id] = GetGameTimer()
end
end
end
end
for i=1, #events.pressed, 1 do
TriggerEvent('esx:input:pressed:' .. events.pressed[i][1] .. ':' .. events.pressed[i][2], events.pressed[i][3])
end
for i=1, #events.released, 1 do
TriggerEvent('esx:input:released:' .. events.released[i][1] .. ':' .. events.released[i][2], events.released[i][3])
end
for i=1, #events.dpressed, 1 do
TriggerEvent('esx:input:disabled:pressed:' .. events.dpressed[i][1] .. ':' .. events.dpressed[i][2], events.dpressed[i][3])
end
for i=1, #events.dreleased, 1 do
TriggerEvent('esx:input:disabled:released:' .. events.dreleased[i][1] .. ':' .. events.dreleased[i][2], events.dreleased[i][3])
end
Citizen.Wait(0)
end
end)
-466
View File
@@ -1,466 +0,0 @@
ESX.Modules['input'] = {}
local self = ESX.Modules['input']
self.RegisteredControls = {}
self.EnabledControls = {}
self.LastPressed = {}
self.LastDisabledPressed = {}
self.LastReleased = {}
self.LastDisabledReleased = {}
self.Groups = {
MOVE = 0,
LOOK = 1,
WHEEL = 2,
CELLPHONE_NAVIGATE = 3,
CELLPHONE_NAVIGATE_UD = 4,
CELLPHONE_NAVIGATE_LR = 5,
FRONTEND_DPAD_ALL = 6,
FRONTEND_DPAD_UD = 7,
FRONTEND_DPAD_LR = 8,
FRONTEND_LSTICK_ALL = 9,
FRONTEND_RSTICK_ALL = 10,
FRONTEND_GENERIC_UD = 11,
FRONTEND_GENERIC_LR = 12,
FRONTEND_GENERIC_ALL = 13,
FRONTEND_BUMPERS = 14,
FRONTEND_TRIGGERS = 15,
FRONTEND_STICKS = 16,
SCRIPT_DPAD_ALL = 17,
SCRIPT_DPAD_UD = 18,
SCRIPT_DPAD_LR = 19,
SCRIPT_LSTICK_ALL = 20,
SCRIPT_RSTICK_ALL = 21,
SCRIPT_BUMPERS = 22,
SCRIPT_TRIGGERS = 23,
WEAPON_WHEEL_CYCLE = 24,
FLY = 25,
SUB = 26,
VEH_MOVE_ALL = 27,
CURSOR = 28,
CURSOR_SCROLL = 29,
SNIPER_ZOOM_SECONDARY = 30,
VEH_HYDRAULICS_CONTROL = 31,
}
self.Controls = {
NEXT_CAMERA = 0,
LOOK_LR = 1,
LOOK_UD = 2,
LOOK_UP_ONLY = 3,
LOOK_DOWN_ONLY = 4,
LOOK_LEFT_ONLY = 5,
LOOK_RIGHT_ONLY = 6,
CINEMATIC_SLOWMO = 7,
SCRIPTED_FLY_UD = 8,
SCRIPTED_FLY_LR = 9,
SCRIPTED_FLY_ZUP = 10,
SCRIPTED_FLY_ZDOWN = 11,
WEAPON_WHEEL_UD = 12,
WEAPON_WHEEL_LR = 13,
WEAPON_WHEEL_NEXT = 14,
WEAPON_WHEEL_PREV = 15,
SELECT_NEXT_WEAPON = 16,
SELECT_PREV_WEAPON = 17,
SKIP_CUTSCENE = 18,
CHARACTER_WHEEL = 19,
MULTIPLAYER_INFO = 20,
SPRINT = 21,
JUMP = 22,
ENTER = 23,
ATTACK = 24,
AIM = 25,
LOOK_BEHIND = 26,
PHONE = 27,
SPECIAL_ABILITY = 28,
SPECIAL_ABILITY_SECONDARY = 29,
MOVE_LR = 30,
MOVE_UD = 31,
MOVE_UP_ONLY = 32,
MOVE_DOWN_ONLY = 33,
MOVE_LEFT_ONLY = 34,
MOVE_RIGHT_ONLY = 35,
DUCK = 36,
SELECT_WEAPON = 37,
PICKUP = 38,
SNIPER_ZOOM = 39,
SNIPER_ZOOM_IN_ONLY = 40,
SNIPER_ZOOM_OUT_ONLY = 41,
SNIPER_ZOOM_IN_SECONDARY = 42,
SNIPER_ZOOM_OUT_SECONDARY = 43,
COVER = 44,
RELOAD = 45,
TALK = 46,
DETONATE = 47,
HUD_SPECIAL = 48,
ARREST = 49,
ACCURATE_AIM = 50,
CONTEXT = 51,
CONTEXT_SECONDARY = 52,
WEAPON_SPECIAL = 53,
WEAPON_SPECIAL_TWO = 54,
DIVE = 55,
DROP_WEAPON = 56,
DROP_AMMO = 57,
THROW_GRENADE = 58,
VEH_MOVE_LR = 59,
VEH_MOVE_UD = 60,
VEH_MOVE_UP_ONLY = 61,
VEH_MOVE_DOWN_ONLY = 62,
VEH_MOVE_LEFT_ONLY = 63,
VEH_MOVE_RIGHT_ONLY = 64,
VEH_SPECIAL = 65,
VEH_GUN_LR = 66,
VEH_GUN_UD = 67,
VEH_AIM = 68,
VEH_ATTACK = 69,
VEH_ATTACK2 = 70,
VEH_ACCELERATE = 71,
VEH_BRAKE = 72,
VEH_DUCK = 73,
VEH_HEADLIGHT = 74,
VEH_EXIT = 75,
VEH_HANDBRAKE = 76,
VEH_HOTWIRE_LEFT = 77,
VEH_HOTWIRE_RIGHT = 78,
VEH_LOOK_BEHIND = 79,
VEH_CIN_CAM = 80,
VEH_NEXT_RADIO = 81,
VEH_PREV_RADIO = 82,
VEH_NEXT_RADIO_TRACK = 83,
VEH_PREV_RADIO_TRACK = 84,
VEH_RADIO_WHEEL = 85,
VEH_HORN = 86,
VEH_FLY_THROTTLE_UP = 87,
VEH_FLY_THROTTLE_DOWN = 88,
VEH_FLY_YAW_LEFT = 89,
VEH_FLY_YAW_RIGHT = 90,
VEH_PASSENGER_AIM = 91,
VEH_PASSENGER_ATTACK = 92,
VEH_SPECIAL_ABILITY_FRANKLIN = 93,
VEH_STUNT_UD = 94,
VEH_CINEMATIC_UD = 95,
VEH_CINEMATIC_UP_ONLY = 96,
VEH_CINEMATIC_DOWN_ONLY = 97,
VEH_CINEMATIC_LR = 98,
VEH_SELECT_NEXT_WEAPON = 99,
VEH_SELECT_PREV_WEAPON = 100,
VEH_ROOF = 101,
VEH_JUMP = 102,
VEH_GRAPPLING_HOOK = 103,
VEH_SHUFFLE = 104,
VEH_DROP_PROJECTILE = 105,
VEH_MOUSE_CONTROL_OVERRIDE = 106,
VEH_FLY_ROLL_LR = 107,
VEH_FLY_ROLL_LEFT_ONLY = 108,
VEH_FLY_ROLL_RIGHT_ONLY = 109,
VEH_FLY_PITCH_UD = 110,
VEH_FLY_PITCH_UP_ONLY = 111,
VEH_FLY_PITCH_DOWN_ONLY = 112,
VEH_FLY_UNDERCARRIAGE = 113,
VEH_FLY_ATTACK = 114,
VEH_FLY_SELECT_NEXT_WEAPON = 115,
VEH_FLY_SELECT_PREV_WEAPON = 116,
VEH_FLY_SELECT_TARGET_LEFT = 117,
VEH_FLY_SELECT_TARGET_RIGHT = 118,
VEH_FLY_VERTICAL_FLIGHT_MODE = 119,
VEH_FLY_DUCK = 120,
VEH_FLY_ATTACK_CAMERA = 121,
VEH_FLY_MOUSE_CONTROL_OVERRIDE = 122,
VEH_SUB_TURN_LR = 123,
VEH_SUB_TURN_LEFT_ONLY = 124,
VEH_SUB_TURN_RIGHT_ONLY = 125,
VEH_SUB_PITCH_UD = 126,
VEH_SUB_PITCH_UP_ONLY = 127,
VEH_SUB_PITCH_DOWN_ONLY = 128,
VEH_SUB_THROTTLE_UP = 129,
VEH_SUB_THROTTLE_DOWN = 130,
VEH_SUB_ASCEND = 131,
VEH_SUB_DESCEND = 132,
VEH_SUB_TURN_HARD_LEFT = 133,
VEH_SUB_TURN_HARD_RIGHT = 134,
VEH_SUB_MOUSE_CONTROL_OVERRIDE = 135,
VEH_PUSHBIKE_PEDAL = 136,
VEH_PUSHBIKE_SPRINT = 137,
VEH_PUSHBIKE_FRONT_BRAKE = 138,
VEH_PUSHBIKE_REAR_BRAKE = 139,
MELEE_ATTACK_LIGHT = 140,
MELEE_ATTACK_HEAVY = 141,
MELEE_ATTACK_ALTERNATE = 142,
MELEE_BLOCK = 143,
PARACHUTE_DEPLOY = 144,
PARACHUTE_DETACH = 145,
PARACHUTE_TURN_LR = 146,
PARACHUTE_TURN_LEFT_ONLY = 147,
PARACHUTE_TURN_RIGHT_ONLY = 148,
PARACHUTE_PITCH_UD = 149,
PARACHUTE_PITCH_UP_ONLY = 150,
PARACHUTE_PITCH_DOWN_ONLY = 151,
PARACHUTE_BRAKE_LEFT = 152,
PARACHUTE_BRAKE_RIGHT = 153,
PARACHUTE_SMOKE = 154,
PARACHUTE_PRECISION_LANDING = 155,
MAP = 156,
SELECT_WEAPON_UNARMED = 157,
SELECT_WEAPON_MELEE = 158,
SELECT_WEAPON_HANDGUN = 159,
SELECT_WEAPON_SHOTGUN = 160,
SELECT_WEAPON_SMG = 161,
SELECT_WEAPON_AUTO_RIFLE = 162,
SELECT_WEAPON_SNIPER = 163,
SELECT_WEAPON_HEAVY = 164,
SELECT_WEAPON_SPECIAL = 165,
SELECT_CHARACTER_MICHAEL = 166,
SELECT_CHARACTER_FRANKLIN = 167,
SELECT_CHARACTER_TREVOR = 168,
SELECT_CHARACTER_MULTIPLAYER = 169,
SAVE_REPLAY_CLIP = 170,
SPECIAL_ABILITY_PC = 171,
CELLPHONE_UP = 172,
CELLPHONE_DOWN = 173,
CELLPHONE_LEFT = 174,
CELLPHONE_RIGHT = 175,
CELLPHONE_SELECT = 176,
CELLPHONE_CANCEL = 177,
CELLPHONE_OPTION = 178,
CELLPHONE_EXTRA_OPTION = 179,
CELLPHONE_SCROLL_FORWARD = 180,
CELLPHONE_SCROLL_BACKWARD = 181,
CELLPHONE_CAMERA_FOCUS_LOCK = 182,
CELLPHONE_CAMERA_GRID = 183,
CELLPHONE_CAMERA_SELFIE = 184,
CELLPHONE_CAMERA_DOF = 185,
CELLPHONE_CAMERA_EXPRESSION = 186,
FRONTEND_DOWN = 187,
FRONTEND_UP = 188,
FRONTEND_LEFT = 189,
FRONTEND_RIGHT = 190,
FRONTEND_RDOWN = 191,
FRONTEND_RUP = 192,
FRONTEND_RLEFT = 193,
FRONTEND_RRIGHT = 194,
FRONTEND_AXIS_X = 195,
FRONTEND_AXIS_Y = 196,
FRONTEND_RIGHT_AXIS_X = 197,
FRONTEND_RIGHT_AXIS_Y = 198,
FRONTEND_PAUSE = 199,
FRONTEND_PAUSE_ALTERNATE = 200,
FRONTEND_ACCEPT = 201,
FRONTEND_CANCEL = 202,
FRONTEND_X = 203,
FRONTEND_Y = 204,
FRONTEND_LB = 205,
FRONTEND_RB = 206,
FRONTEND_LT = 207,
FRONTEND_RT = 208,
FRONTEND_LS = 209,
FRONTEND_RS = 210,
FRONTEND_LEADERBOARD = 211,
FRONTEND_SOCIAL_CLUB = 212,
FRONTEND_SOCIAL_CLUB_SECONDARY = 213,
FRONTEND_DELETE = 214,
FRONTEND_ENDSCREEN_ACCEPT = 215,
FRONTEND_ENDSCREEN_EXPAND = 216,
FRONTEND_SELECT = 217,
SCRIPT_LEFT_AXIS_X = 218,
SCRIPT_LEFT_AXIS_Y = 219,
SCRIPT_RIGHT_AXIS_X = 220,
SCRIPT_RIGHT_AXIS_Y = 221,
SCRIPT_RUP = 222,
SCRIPT_RDOWN = 223,
SCRIPT_RLEFT = 224,
SCRIPT_RRIGHT = 225,
SCRIPT_LB = 226,
SCRIPT_RB = 227,
SCRIPT_LT = 228,
SCRIPT_RT = 229,
SCRIPT_LS = 230,
SCRIPT_RS = 231,
SCRIPT_PAD_UP = 232,
SCRIPT_PAD_DOWN = 233,
SCRIPT_PAD_LEFT = 234,
SCRIPT_PAD_RIGHT = 235,
SCRIPT_SELECT = 236,
CURSOR_ACCEPT = 237,
CURSOR_CANCEL = 238,
CURSOR_X = 239,
CURSOR_Y = 240,
CURSOR_SCROLL_UP = 241,
CURSOR_SCROLL_DOWN = 242,
ENTER_CHEAT_CODE = 243,
INTERACTION_MENU = 244,
MP_TEXT_CHAT_ALL = 245,
MP_TEXT_CHAT_TEAM = 246,
MP_TEXT_CHAT_FRIENDS = 247,
MP_TEXT_CHAT_CREW = 248,
PUSH_TO_TALK = 249,
CREATOR_LS = 250,
CREATOR_RS = 251,
CREATOR_LT = 252,
CREATOR_RT = 253,
CREATOR_MENU_TOGGLE = 254,
CREATOR_ACCEPT = 255,
CREATOR_DELETE = 256,
ATTACK2 = 257,
RAPPEL_JUMP = 258,
RAPPEL_LONG_JUMP = 259,
RAPPEL_SMASH_WINDOW = 260,
PREV_WEAPON = 261,
NEXT_WEAPON = 262,
MELEE_ATTACK1 = 263,
MELEE_ATTACK2 = 264,
WHISTLE = 265,
MOVE_LEFT = 266,
MOVE_RIGHT = 267,
MOVE_UP = 268,
MOVE_DOWN = 269,
LOOK_LEFT = 270,
LOOK_RIGHT = 271,
LOOK_UP = 272,
LOOK_DOWN = 273,
SNIPER_ZOOM_IN = 274,
SNIPER_ZOOM_OUT = 275,
SNIPER_ZOOM_IN_ALTERNATE = 276,
SNIPER_ZOOM_OUT_ALTERNATE = 277,
VEH_MOVE_LEFT = 278,
VEH_MOVE_RIGHT = 279,
VEH_MOVE_UP = 280,
VEH_MOVE_DOWN = 281,
VEH_GUN_LEFT = 282,
VEH_GUN_RIGHT = 283,
VEH_GUN_UP = 284,
VEH_GUN_DOWN = 285,
VEH_LOOK_LEFT = 286,
VEH_LOOK_RIGHT = 287,
REPLAY_START_STOP_RECORDING = 288,
REPLAY_START_STOP_RECORDING_SECONDARY = 289,
SCALED_LOOK_LR = 290,
SCALED_LOOK_UD = 291,
SCALED_LOOK_UP_ONLY = 292,
SCALED_LOOK_DOWN_ONLY = 293,
SCALED_LOOK_LEFT_ONLY = 294,
SCALED_LOOK_RIGHT_ONLY = 295,
REPLAY_MARKER_DELETE = 296,
REPLAY_CLIP_DELETE = 297,
REPLAY_PAUSE = 298,
REPLAY_REWIND = 299,
REPLAY_FFWD = 300,
REPLAY_NEWMARKER = 301,
REPLAY_RECORD = 302,
REPLAY_SCREENSHOT = 303,
REPLAY_HIDEHUD = 304,
REPLAY_STARTPOINT = 305,
REPLAY_ENDPOINT = 306,
REPLAY_ADVANCE = 307,
REPLAY_BACK = 308,
REPLAY_TOOLS = 309,
REPLAY_RESTART = 310,
REPLAY_SHOWHOTKEY = 311,
REPLAY_CYCLEMARKERLEFT = 312,
REPLAY_CYCLEMARKERRIGHT = 313,
REPLAY_FOVINCREASE = 314,
REPLAY_FOVDECREASE = 315,
REPLAY_CAMERAUP = 316,
REPLAY_CAMERADOWN = 317,
REPLAY_SAVE = 318,
REPLAY_TOGGLETIME = 319,
REPLAY_TOGGLETIPS = 320,
REPLAY_PREVIEW = 321,
REPLAY_TOGGLE_TIMELINE = 322,
REPLAY_TIMELINE_PICKUP_CLIP = 323,
REPLAY_TIMELINE_DUPLICATE_CLIP = 324,
REPLAY_TIMELINE_PLACE_CLIP = 325,
REPLAY_CTRL = 326,
REPLAY_TIMELINE_SAVE = 327,
REPLAY_PREVIEW_AUDIO = 328,
VEH_DRIVE_LOOK = 329,
VEH_DRIVE_LOOK2 = 330,
VEH_FLY_ATTACK2 = 331,
RADIO_WHEEL_UD = 332,
RADIO_WHEEL_LR = 333,
VEH_SLOWMO_UD = 334,
VEH_SLOWMO_UP_ONLY = 335,
VEH_SLOWMO_DOWN_ONLY = 336,
VEH_HYDRAULICS_CONTROL_TOGGLE = 337,
VEH_HYDRAULICS_CONTROL_LEFT = 338,
VEH_HYDRAULICS_CONTROL_RIGHT = 339,
VEH_HYDRAULICS_CONTROL_UP = 340,
VEH_HYDRAULICS_CONTROL_DOWN = 341,
VEH_HYDRAULICS_CONTROL_UD = 342,
VEH_HYDRAULICS_CONTROL_LR = 343,
MAP_POI = 344,
INPUT_REPLAY_SNAPMATIC_PHOTO = 345,
}
self.RegisterControl = function(group, id)
if ESX.Table.IndexOf(self.RegisteredControls[group], id) == -1 then
self.RegisteredControls[group][#self.RegisteredControls[group] + 1] = id
end
end
self.UnregisterControl = function(group, id)
if ESX.Table.IndexOf(self.RegisteredControls[group], id) ~= -1 then
table.remove(self.RegisteredControls[group], ESX.Table.IndexOf(self.RegisteredControls[group], id))
end
end
self.EnableControl = function(group, id)
self.EnabledControls[group][id] = self.EnabledControls[group][id] + 1
end
self.DisableControl = function(group, id)
self.EnabledControls[group][id] = self.EnabledControls[group][id] - 1
end
self.IsControlRegistered = function(group, id)
return ESX.Table.IndexOf(self.RegisteredControls[group], id) ~= -1
end
self.IsControlPressed = function(group, id)
return self.IsControlEnabled(group, id) and (IsControlPressed(group, id))
end
self.IsDisabledControlPressed = function(group, id)
return (not self.IsControlEnabled(group, id)) and (IsDisabledControlPressed(group, id))
end
self.IsControlEnabled = function(group, id)
return self.EnabledControls[group][id] >= 0
end
for k1, group in pairs(self.Groups) do
self.RegisteredControls[group] = {}
self.EnabledControls[group] = {}
self.LastPressed[group] = {}
self.LastDisabledPressed[group] = {}
self.LastReleased[group] = {}
self.LastDisabledReleased[group] = {}
for k2, id in pairs(self.Controls) do
self.EnabledControls[group][id] = 0
self.LastPressed[group][id] = -1
self.LastDisabledPressed[group][id] = -1
self.LastReleased[group][id] = -1
self.LastDisabledReleased[group][id] = -1
end
end
self.On = function(event, group, id, cb)
return AddEventHandler('esx:input:' .. event .. ':' .. group .. ':' .. id, cb)
end
self.InitESX = function()
self.RegisterControl(self.Groups.MOVE, self.Controls[Config.InventoryKey])
self.On('released', self.Groups.MOVE, self.Controls[Config.InventoryKey], function(lastPressed)
if (not ESX.IsDead) and (not ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory')) then
ESX.ShowInventory()
end
end)
end
-1
View File
@@ -1 +0,0 @@
local self = ESX.Modules['input']
-1
View File
@@ -1 +0,0 @@
local self = ESX.Modules['input']
-2
View File
@@ -1,2 +0,0 @@
ESX.Modules['input'] = {}
local self = ESX.Modules['input']
-12
View File
@@ -1,12 +0,0 @@
local self = ESX.Modules['interact']
AddEventHandler('esx:interact:register', self.Register)
-- Do not use this in prod ! internal event only
AddEventHandler('esx:interact:enter', function(name, data)
TriggerEvent('esx:interact:enter:' .. name, data)
end)
AddEventHandler('esx:interact:exit', function(name, data)
TriggerEvent('esx:interact:exit:' .. name, data)
end)
-190
View File
@@ -1,190 +0,0 @@
local self = ESX.Modules['interact']
self.LOVE_PLAYER_GROUP = AddRelationshipGroup('LOVE_PLAYER')
SetRelationshipBetweenGroups(0, self.LOVE_PLAYER_GROUP, 'PLAYER')
Citizen.CreateThread(function()
while true do
Citizen.Wait(100)
local ped = PlayerPedId()
local coords = GetOffsetFromEntityInWorldCoords(ped, 0.0, 0.0, -1.0)
self.Cache.player.ped = ped
self.Cache.player.coords = vector3(table.unpack(coords))
local toRemove = {}
for i=1, #self.Data, 1 do
local data = self.Data[i]
if data.pos == nil then
print('[esx_interact] data.pos is nil => ' .. json.encode(data))
else
local distance = #(data.pos - self.Cache.player.coords);
if
(distance <= data.distance) and
(ESX.Table.FindIndex(self.Cache.current , function(e) return e.__id == data.__id end) == -1)
then
if (data.check == nil) or data.check(self.Cache.player.ped, self.Cache.player.coords) then
data.playing = false
self.Cache.current[#self.Cache.current + 1] = data
end
elseif (distance > data.distance) then
local idx = ESX.Table.FindIndex(self.Cache.current, function(e) return e.__id == data.__id end)
if idx ~= -1 then
toRemove[#toRemove + 1] = idx
end
end
end
end
if #toRemove > 0 then
self.Cache.current = ESX.Table.Filter(self.Cache.current, function(e) return ESX.Table.IndexOf(toRemove, e.__id) ~= -1 end)
end
end
end)
-- Markers
ESX.Loop('input-markers', function()
for i=1, #self.Cache.current, 1 do
local curr = self.Cache.current[i]
if curr.type == 'marker' then
DrawMarker(
curr.mtype,
curr.pos.x + 0.0, curr.pos.y + 0.0, curr.pos.z + 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
curr.size.x + 0.0, curr.size.y + 0.0, curr.size.z + 0.0,
curr.color.r, curr.color.g, curr.color.b, curr.color.a,
curr.bobUpAndDown, curr.faceCamera, 2, curr.rotate, nil, nil, false
)
end
end
end, 0)
-- NPCs
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
for i=1, #self.Cache.current, 1 do
local curr = self.Cache.current[i]
if curr.type == 'npc' then
if IsModelValid(curr.model) and IsModelInCdimage(curr.model) then
local found = false
local closestPed, closestDistance = ESX.Game.GetClosestPed({
x = curr.pos.x + 0.0,
y = curr.pos.y + 0.0,
z = curr.pos.z + 0.0
}, {Cache.player.ped})
if closestPed ~= -1 then
local model = GetEntityModel(closestPed)
if (model == curr.model) and (closestDistance <= 10.0) then
found = true
if (curr.lib ~= nil) and (curr.anim ~= nil) then
if not HasAnimDictLoaded(curr.lib) then
RequestAnimDict(curr.lib)
end
if HasAnimDictLoaded(curr.lib) and (not curr.playing) then
curr.playing = true
TaskPlayAnim(closestPed, curr.lib, curr.anim, 8.0, -8.0, -1, 1, 1.0, false, false, false)
end
end
end
end
if not found then
print('Create ped : ' .. curr.model .. ' @ ' .. curr.pos.x .. ' ' .. curr.pos.y .. ' ' .. curr.pos.z)
RequestModel(curr.model)
while not HasModelLoaded(curr.model) do
Citizen.Wait(0)
end
curr.__ped = CreatePed(26, curr.model, curr.pos.x + 0.0, curr.pos.y + 0.0, curr.pos.z + 0.0, curr.heading + 0.0, true, false)
SetModelAsNoLongerNeeded(curr.model)
SetPedRelationshipGroupHash(curr.__ped, self.LOVE_PLAYER_GROUP)
SetBlockingOfNonTemporaryEvents(curr.__ped, true)
TaskStandStill(curr.__ped, -1)
SetEntityInvincible(curr.__ped, true)
FreezeEntityPosition(curr.__ped, true)
end
else
print('Invalid/inexistent model => ' .. curr.model)
end
end
end
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(100)
for i=1, #self.Cache.current, 1 do
local data = self.Cache.current[i]
local distance = #(data.pos - self.Cache.player.coords);
if (distance <= data.radius) and (not self.Cache.using[data.__id]) then
self.Cache.using[data.__id] = true
TriggerEvent('esx:interact:enter', data.name, data)
elseif (distance > data.radius) and self.Cache.using[data.__id] then
self.Cache.using[data.__id] = nil
TriggerEvent('esx:interact:exit', data.name, data)
end
end
end
end)
-50
View File
@@ -1,50 +0,0 @@
ESX.Modules['interact'] = {};
local self = ESX.Modules['interact']
self.Id = 0
self.Data = {}
self.Cache = {
player = {
ped = 0,
coords = vector3(0.0, 0.0, 0.0)
},
current = {
marker = {},
npc = {},
},
using = {},
}
self.Register = function(data)
local idx = -1
for i=1, #self.Data, 1 do
if self.Data[i].name == data.name then
idx = i
break
end
end
if self.Id >= 65535 then
data.__id = 1
else
data.__id = self.Id + 1
end
data.size = (type(data.size) == 'number') and {x = data.size, y = data.size, z = data.size} or data.size
if data.faceCamera == nil then data.faceCamera = false end
if data.bobUpAndDown == nil then data.bobUpAndDown = false end
if data.rotate == nil then data.rotate = false end
self.Id = data.__id
if idx == -1 then
self.Data[#self.Data + 1] = data
else
self.Data[idx] = data
end
end
-2
View File
@@ -1,2 +0,0 @@
local self = ESX.Modules['interact']
-3
View File
@@ -1,3 +0,0 @@
local self = ESX.Modules['interact']
-3
View File
@@ -1,3 +0,0 @@
ESX.Modules['interact'] = {};
local self = ESX.Modules['interact']
-311
View File
@@ -1,311 +0,0 @@
local self = ESX.Modules['job_police']
-- Locals
local Input = ESX.Modules['input']
RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job)
Citizen.Wait(5000)
TriggerServerEvent('esx_policejob:forceBlip')
end)
RegisterNetEvent('esx_phone:loaded')
AddEventHandler('esx_phone:loaded', function(phoneNumber, contacts)
local specialContact = {
name = _U('job_police:phone_police'),
number = 'police',
base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDFGQTJDRkI0QUJCMTFFN0JBNkQ5OENBMUI4QUEzM0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDFGQTJDRkM0QUJCMTFFN0JBNkQ5OENBMUI4QUEzM0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MUZBMkNGOTRBQkIxMUU3QkE2RDk4Q0ExQjhBQTMzRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0MUZBMkNGQTRBQkIxMUU3QkE2RDk4Q0ExQjhBQTMzRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoW66EYAAAjGSURBVHjapJcLcFTVGcd/u3cfSXaTLEk2j80TCI8ECI9ABCyoiBqhBVQqVG2ppVKBQqUVgUl5OU7HKqNOHUHU0oHamZZWoGkVS6cWAR2JPJuAQBPy2ISEvLN57+v2u2E33e4k6Ngz85+9d++95/zP9/h/39GpqsqiRYsIGz8QZAq28/8PRfC+4HT4fMXFxeiH+GC54NeCbYLLATLpYe/ECx4VnBTsF0wWhM6lXY8VbBE0Ch4IzLcpfDFD2P1TgrdC7nMCZLRxQ9AkiAkQCn77DcH3BC2COoFRkCSIG2JzLwqiQi0RSmCD4JXbmNKh0+kc/X19tLtc9Ll9sk9ZS1yoU71YIk3xsbEx8QaDEc2ttxmaJSKC1ggSKBK8MKwTFQVXRzs3WzpJGjmZgvxcMpMtWIwqsjztvSrlzjYul56jp+46qSmJmMwR+P3+4aZ8TtCprRkk0DvUW7JjmV6lsqoKW/pU1q9YQOE4Nxkx4ladE7zd8ivuVmJQfXZKW5dx5EwPRw4fxNx2g5SUVLw+33AkzoRaQDP9SkFu6OKqz0uF8yaz7vsOL6ycQVLkcSg/BlWNsjuFoKE1knqDSl5aNnmPLmThrE0UvXqQqvJPyMrMGorEHwQfEha57/3P7mXS684GFjy8kreLppPUuBXfyd/ibeoS2kb0mWPANhJdYjb61AxUvx5PdT3+4y+Tb3mTd19ZSebE+VTXVGNQlHAC7w4VhH8TbA36vKq6ilnzlvPSunHw6Trc7XpZ14AyfgYeyz18crGN1Alz6e3qwNNQSv4dZox1h/BW9+O7eIaEsVv41Y4XeHJDG83Nl4mLTwzGhJYtx0PzNTjOB9KMTlc7Nkcem39YAGU7cbeBKVLMPGMVf296nMd2VbBq1wmizHoqqm/wrS1/Zf0+N19YN2PIu1fcIda4Vk66Zx/rVi+jo9eIX9wZGGcFXUMR6BHUa76/2ezioYcXMtpyAl91DSaTfDxlJbtLprHm2ecpObqPuTPzSNV9yKz4a4zJSuLo71/j8Q17ON69EmXiPIlNMe6FoyzOqWPW/MU03Lw5EFcyKghTrNDh7+/vw545mcJcWbTiGKpRdGPMXbx90sGmDaux6sXk+kimjU+BjnMkx3kYP34cXrFuZ+3nrHi6iDMt92JITcPjk3R3naRwZhpuNSqoD93DKaFVU7j2dhcF8+YzNlpErbIBTVh8toVccbaysPB+4pMcuPw25kwSsau7BIlmHpy3guaOPtISYyi/UkaJM5Lpc5agq5Xkcl6gIHkmqaMn0dtylcjIyPThCNyhaXyfR2W0I1our0v6qBii07ih5rDtGSOxNVdk1y4R2SR8jR/g7hQD9l1jUeY/WLJB5m39AlZN4GZyIQ1fFJNsEgt0duBIc5GRkcZF53mNwIzhXPDgQPoZIkiMkbTxtstDMVnmFA4cOsbz2/aKjSQjev4Mp9ZAg+hIpFhB3EH5Yal16+X+Kq3dGfxkzRY+KauBjBzREvGN0kNCTARu94AejBLMHorAQ7cEQMGs2cXvkWshYLDi6e9l728O8P1XW6hKeB2yv42q18tjj+iFTGoSi+X9jJM9RTxS9E+OHT0krhNiZqlbqraoT7RAU5bBGrEknEBhgJks7KXbLS8qERI0ErVqF/Y4K6NHZfLZB+/wzJvncacvFd91oXO3o/O40MfZKJOKu/rne+mRQByXM4lYreb1tUnkizVVA/0SpfpbWaCNBeEE5gb/UH19NLqEgDF+oNDQWcn41Cj0EXFEWqzkOIyYekslFkThsvMxpIyE2hIc6lXGZ6cPyK7Nnk5OipixRdxgUESAYmhq68VsGgy5CYKCUAJTg0+izApXne3CJFmUTwg4L3FProFxU+6krqmXu3MskkhSD2av41jLdzlnfFrSdCZxyqfMnppN6ZUa7pwt0h3fiK9DCt4IO9e7YqisvI7VYgmNv7mhBKKD/9psNi5dOMv5ZjukjsLdr0ffWsyTi6eSlfcA+dmiVyOXs+/sHNZu3M6PdxzgVO9GmDSHsSNqmTz/R6y6Xxqma4fwaS5Mn85n1ZE0Vl3CHBER3lUNEhiURpPJRFdTOcVnpUJnPIhR7cZXfoH5UYc5+E4RzRH3sfSnl9m2dSMjE+Tz9msse+o5dr7UwcQ5T3HwlWUkNuzG3dKFSTbsNs7m/Y8vExOlC29UWkMJlAxKoRQMR3IC7x85zOn6fHS50+U/2Untx2R1voinu5no+DQmz7yPXmMKZnsu0wrm0Oe3YhOVHdm8A09dBQYhTv4T7C+xUPrZh8Qn2MMr4qcDSRfoirWgKAvtgOpv1JI8Zi77X15G7L+fxeOUOiUFxZiULD5fSlNzNM62W+k1yq5gjajGX/ZHvOIyxd+Fkj+P092rWP/si0Qr7VisMaEWuCiYonXFwbAUTWWPYLV245NITnGkUXnpI9butLJn2y6iba+hlp7C09qBcvoN7FYL9mhxo1/y/LoEXK8Pv6qIC8WbBY/xr9YlPLf9dZT+OqKTUwfmDBm/GOw7ws4FWpuUP2gJEZvKqmocuXPZuWYJMzKuSsH+SNwh3bo0p6hao6HeEqwYEZ2M6aKWd3PwTCy7du/D0F1DsmzE6/WGLr5LsDF4LggnYBacCOboQLHQ3FFfR58SR+HCR1iQH8ukhA5s5o5AYZMwUqOp74nl8xvRHDlRTsnxYpJsUjtsceHt2C8Fm0MPJrphTkZvBc4It9RKLOFx91Pf0Igu0k7W2MmkOewS2QYJUJVWVz9VNbXUVVwkyuAmKTFJayrDo/4Jwe/CT0aGYTrWVYEeUfsgXssMRcpyenraQJa0VX9O3ZU+Ma1fax4xGxUsUVFkOUbcama1hf+7+LmA9juHWshwmwOE1iMmCFYEzg1jtIm1BaxW6wCGGoFdewPfvyE4ertTiv4rHC73B855dwp2a23bbd4tC1hvhOCbX7b4VyUQKhxrtSOaYKngasizvwi0RmOS4O1QZf2yYfiaR+73AvhTQEVf+rpn9/8IMAChKDrDzfsdIQAAAABJRU5ErkJggg=='
}
TriggerEvent('esx_phone:addSpecialContact', specialContact.name, specialContact.number, specialContact.base64Icon)
end)
-- don't show dispatches if the player isn't in service
AddEventHandler('esx_phone:cancelMessage', function(dispatchNumber)
if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' and ESX.PlayerData.job.name == dispatchNumber then
-- if esx_service is enabled
if self.Config.EnableESXService and not playerInService then
CancelEvent()
end
end
end)
AddEventHandler('esx_policejob:hasEnteredMarker', function(station, part, partNum)
if part == 'Cloakroom' then
self.CurrentAction = 'menu_cloakroom'
self.CurrentActionMsg = _U('job_police:open_cloackroom')
self.CurrentActionData = {}
elseif part == 'Armory' then
self.CurrentAction = 'menu_armory'
self.CurrentActionMsg = _U('job_police:open_armory')
self.CurrentActionData = {station = station}
elseif part == 'Vehicles' then
self.CurrentAction = 'menu_vehicle_spawner'
self.CurrentActionMsg = _U('job_police:garage_prompt')
self.CurrentActionData = {station = station, part = part, partNum = partNum}
elseif part == 'Helicopters' then
self.CurrentAction = 'Helicopters'
self.CurrentActionMsg = _U('job_police:helicopter_prompt')
self.CurrentActionData = {station = station, part = part, partNum = partNum}
elseif part == 'BossActions' then
self.CurrentAction = 'menu_boss_actions'
self.CurrentActionMsg = _U('job_police:open_bossmenu')
self.CurrentActionData = {}
end
end)
AddEventHandler('esx_policejob:hasExitedMarker', function(station, part, partNum)
if not isInShopMenu then
ESX.UI.Menu.CloseAll()
end
self.CurrentAction = nil
end)
AddEventHandler('esx_policejob:hasEnteredEntityZone', function(entity)
local playerPed = PlayerPedId()
if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' and IsPedOnFoot(playerPed) then
self.CurrentAction = 'remove_entity'
self.CurrentActionMsg = _U('job_police:remove_prop')
self.CurrentActionData = {entity = entity}
end
if GetEntityModel(entity) == GetHashKey('p_ld_stinger_s') then
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
if IsPedInAnyVehicle(playerPed, false) then
local vehicle = GetVehiclePedIsIn(playerPed)
for i=0, 7, 1 do
SetVehicleTyreBurst(vehicle, i, true, 1000)
end
end
end
end)
AddEventHandler('esx_policejob:hasExitedEntityZone', function(entity)
if self.CurrentAction == 'remove_entity' then
self.CurrentAction = nil
end
end)
RegisterNetEvent('esx_policejob:handcuff')
AddEventHandler('esx_policejob:handcuff', function()
self.IsHandcuffed = not self.IsHandcuffed
local playerPed = PlayerPedId()
if self.IsHandcuffed then
RequestAnimDict('mp_arresting')
while not HasAnimDictLoaded('mp_arresting') do
Citizen.Wait(100)
end
TaskPlayAnim(playerPed, 'mp_arresting', 'idle', 8.0, -8, -1, 49, 0, 0, 0, 0)
SetEnableHandcuffs(playerPed, true)
DisablePlayerFiring(playerPed, true)
SetCurrentPedWeapon(playerPed, GetHashKey('WEAPON_UNARMED'), true) -- unarm player
SetPedCanPlayGestureAnims(playerPed, false)
FreezeEntityPosition(playerPed, true)
DisplayRadar(false)
if self.Config.EnableHandcuffTimer then
if handcuffTimer.active then
ESX.ClearTimeout(handcuffTimer.task)
end
StartHandcuffTimer()
end
else
if self.Config.EnableHandcuffTimer and handcuffTimer.active then
ESX.ClearTimeout(handcuffTimer.task)
end
ClearPedSecondaryTask(playerPed)
SetEnableHandcuffs(playerPed, false)
DisablePlayerFiring(playerPed, false)
SetPedCanPlayGestureAnims(playerPed, true)
FreezeEntityPosition(playerPed, false)
DisplayRadar(true)
end
end)
RegisterNetEvent('esx_policejob:unrestrain')
AddEventHandler('esx_policejob:unrestrain', function()
if self.IsHandcuffed then
local playerPed = PlayerPedId()
self.IsHandcuffed = false
ClearPedSecondaryTask(playerPed)
SetEnableHandcuffs(playerPed, false)
DisablePlayerFiring(playerPed, false)
SetPedCanPlayGestureAnims(playerPed, true)
FreezeEntityPosition(playerPed, false)
DisplayRadar(true)
-- end timer
if self.Config.EnableHandcuffTimer and handcuffTimer.active then
ESX.ClearTimeout(handcuffTimer.task)
end
end
end)
RegisterNetEvent('esx_policejob:drag')
AddEventHandler('esx_policejob:drag', function(copId)
if self.IsHandcuffed then
dragStatus.isDragged = not dragStatus.isDragged
dragStatus.CopId = copId
end
end)
RegisterNetEvent('esx_policejob:putInVehicle')
AddEventHandler('esx_policejob:putInVehicle', function()
if self.IsHandcuffed then
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
if IsAnyVehicleNearPoint(coords, 5.0) then
local vehicle = GetClosestVehicle(coords, 5.0, 0, 71)
if DoesEntityExist(vehicle) then
local maxSeats, freeSeat = GetVehicleMaxNumberOfPassengers(vehicle)
for i=maxSeats - 1, 0, -1 do
if IsVehicleSeatFree(vehicle, i) then
freeSeat = i
break
end
end
if freeSeat then
TaskWarpPedIntoVehicle(playerPed, vehicle, freeSeat)
dragStatus.isDragged = false
end
end
end
end
end)
RegisterNetEvent('esx_policejob:OutVehicle')
AddEventHandler('esx_policejob:OutVehicle', function()
local playerPed = PlayerPedId()
if IsPedSittingInAnyVehicle(playerPed) then
local vehicle = GetVehiclePedIsIn(playerPed, false)
TaskLeaveVehicle(playerPed, vehicle, 16)
end
end)
RegisterNetEvent('esx_policejob:updateBlip')
AddEventHandler('esx_policejob:updateBlip', function()
-- Refresh all blips
for k, existingBlip in pairs(self.BlipsCops) do
RemoveBlip(existingBlip)
end
-- Clean the blip table
self.BlipsCops = {}
-- Enable blip?
if self.Config.EnableESXService and not playerInService then
return
end
if not self.Config.EnableJobBlip then
return
end
-- Is the player a cop? In that case show all the blips for other cops
if ESX.PlayerData.job and ESX.PlayerData.job.name == 'police' then
ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players)
for i=1, #players, 1 do
if players[i].job.name == 'police' then
local id = GetPlayerFromServerId(players[i].source)
if NetworkIsPlayerActive(id) and GetPlayerPed(id) ~= PlayerPedId() then
CreateBlip(id)
end
end
end
end)
end
end)
AddEventHandler('playerSpawned', function(spawn)
isDead = false
TriggerEvent('esx_policejob:unrestrain')
if not hasAlreadyJoined then
TriggerServerEvent('esx_policejob:spawned')
end
hasAlreadyJoined = true
end)
AddEventHandler('esx:onPlayerDeath', function(data)
isDead = true
end)
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
TriggerEvent('esx_policejob:unrestrain')
TriggerEvent('esx_phone:removeSpecialContact', 'police')
if self.Config.EnableESXService then
TriggerServerEvent('esx_service:disableService', 'police')
end
if self.Config.EnableHandcuffTimer and self.HandcuffTimer.active then
ESX.ClearTimeout(self.HandcuffTimer.task)
end
end
end)
-- Key Controls
Input.On('released', Input.Groups.MOVE, Input.Controls.PICKUP, function(lastPressed)
if self.CurrentAction and self.IsPolice() then
self.CurrentAction()
self.CurrentAction = nil
end
end)
Input.On('released', Input.Groups.MOVE, Input.Controls.SELECT_CHARACTER_FRANKLIN, function(lastPressed)
if (not self.IsDead) and self.IsPolice() and (not ESX.UI.Menu.IsOpen('default', GetCurrentResourceName(), 'police_actions')) then
if not self.Config.EnableESXService then
OpenPoliceActionsMenu()
elseif playerInService then
OpenPoliceActionsMenu()
else
ESX.ShowNotification(_U('job_police:service_not'))
end
end
end)
Input.On('released', Input.Groups.MOVE, Input.Controls.PICKUP, function(lastPressed)
if self.CurrentAction and self.IsPolice() and self.CurrentTask.busy then
ESX.ShowNotification(_U('job_police:impound_canceled'))
ESX.ClearTimeout(self.CurrentTask.task)
ClearPedTasks(PlayerPedId())
self.CurrentTask.busy = false
end
end)
-158
View File
@@ -1,158 +0,0 @@
local self = ESX.Modules['job_police']
-- Init
self.Init()
-- Drag
Citizen.CreateThread(function()
local wasDragged = false
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
if self.IsHandcuffed and self.DragStatus.isDragged then
local targetPed = GetPlayerPed(GetPlayerFromServerId(self.DragStatus.CopId))
if DoesEntityExist(targetPed) and IsPedOnFoot(targetPed) and not IsPedDeadOrDying(targetPed, true) then
if not wasDragged then
AttachEntityToEntity(playerPed, targetPed, 11816, 0.54, 0.54, 0.0, 0.0, 0.0, 0.0, false, false, false, false, 2, true)
wasDragged = true
else
Citizen.Wait(1000)
end
else
wasDragged = false
self.DragStatus.isDragged = false
DetachEntity(playerPed, true, false)
end
elseif wasDragged then
wasDragged = false
DetachEntity(playerPed, true, false)
else
Citizen.Wait(500)
end
end
end)
-- Handcuff
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
if self.IsHandcuffed then
DisableControlAction(0, 1, true) -- Disable pan
DisableControlAction(0, 2, true) -- Disable tilt
DisableControlAction(0, 24, true) -- Attack
DisableControlAction(0, 257, true) -- Attack 2
DisableControlAction(0, 25, true) -- Aim
DisableControlAction(0, 263, true) -- Melee Attack 1
DisableControlAction(0, 32, true) -- W
DisableControlAction(0, 34, true) -- A
DisableControlAction(0, 31, true) -- S
DisableControlAction(0, 30, true) -- D
DisableControlAction(0, 45, true) -- Reload
DisableControlAction(0, 22, true) -- Jump
DisableControlAction(0, 44, true) -- Cover
DisableControlAction(0, 37, true) -- Select Weapon
DisableControlAction(0, 23, true) -- Also 'enter'?
DisableControlAction(0, 288, true) -- Disable phone
DisableControlAction(0, 289, true) -- Inventory
DisableControlAction(0, 170, true) -- Animations
DisableControlAction(0, 167, true) -- Job
DisableControlAction(0, 0, true) -- Disable changing view
DisableControlAction(0, 26, true) -- Disable looking behind
DisableControlAction(0, 73, true) -- Disable clearing animation
DisableControlAction(2, 199, true) -- Disable pause screen
DisableControlAction(0, 59, true) -- Disable steering in vehicle
DisableControlAction(0, 71, true) -- Disable driving forward in vehicle
DisableControlAction(0, 72, true) -- Disable reversing in vehicle
DisableControlAction(2, 36, true) -- Disable going stealth
DisableControlAction(0, 47, true) -- Disable weapon
DisableControlAction(0, 264, true) -- Disable melee
DisableControlAction(0, 257, true) -- Disable melee
DisableControlAction(0, 140, true) -- Disable melee
DisableControlAction(0, 141, true) -- Disable melee
DisableControlAction(0, 142, true) -- Disable melee
DisableControlAction(0, 143, true) -- Disable melee
DisableControlAction(0, 75, true) -- Disable exit vehicle
DisableControlAction(27, 75, true) -- Disable exit vehicle
if IsEntityPlayingAnim(playerPed, 'mp_arresting', 'idle', 3) ~= 1 then
ESX.Streaming.RequestAnimDict('mp_arresting', function()
TaskPlayAnim(playerPed, 'mp_arresting', 'idle', 8.0, -8, -1, 49, 0.0, false, false, false)
end)
end
else
Citizen.Wait(500)
end
end
end)
--[[
-- Enter / Exit entity zone events
Citizen.CreateThread(function()
local trackedEntities = {
'prop_roadcone02a',
'prop_barrier_work05',
'p_ld_stinger_s',
'prop_boxpile_07d',
'hei_prop_cash_crate_half_full'
}
while true do
Citizen.Wait(500)
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
local closestDistance = -1
local closestEntity = nil
for i=1, #trackedEntities, 1 do
local object = GetClosestObjectOfType(playerCoords, 3.0, GetHashKey(trackedEntities[i]), false, false, false)
if DoesEntityExist(object) then
local objCoords = GetEntityCoords(object)
local distance = #(playerCoords - objCoords)
if closestDistance == -1 or closestDistance > distance then
closestDistance = distance
closestEntity = object
end
end
end
if closestDistance ~= -1 and closestDistance <= 3.0 then
if LastEntity ~= closestEntity then
TriggerEvent('esx_policejob:hasEnteredEntityZone', closestEntity)
LastEntity = closestEntity
end
else
if LastEntity then
TriggerEvent('esx_policejob:hasExitedEntityZone', LastEntity)
LastEntity = nil
end
end
end
end)
]]--
File diff suppressed because it is too large Load Diff
-319
View File
@@ -1,319 +0,0 @@
Config = {}
Config.DrawDistance = 100.0
Config.MarkerType = 1
Config.MarkerSize = {x = 1.5, y = 1.5, z = 0.5}
Config.MarkerColor = {r = 50, g = 50, b = 204, a = 100}
Config.EnablePlayerManagement = true
Config.EnableArmoryManagement = true
Config.EnableESXIdentity = false -- enable if you're using esx_identity
Config.EnableLicenses = false -- enable if you're using esx_license
Config.EnableHandcuffTimer = true -- enable handcuff timer? will unrestrain player after the time ends
Config.HandcuffTimer = 10 * 60000 -- 10 mins
Config.EnableJobBlip = false -- enable blips for cops on duty, requires esx_society
Config.EnableCustomPeds = false -- enable custom peds in cloak room? See Config.CustomPeds below to customize peds
Config.EnableESXService = false -- enable esx service?
Config.MaxInService = 5
Config.Locale = 'fr'
Config.PoliceStations = {
LSPD = {
Blip = {
Coords = vector3(425.1, -979.5, 30.7),
Sprite = 60,
Display = 4,
Scale = 1.2,
Colour = 29
},
Cloakrooms = {
vector3(452.6, -992.8, 30.6)
},
Armories = {
vector3(451.7, -980.1, 30.6)
},
Vehicles = {
{
Spawner = vector3(454.6, -1017.4, 28.4),
InsideShop = vector3(228.5, -993.5, -99.5),
SpawnPoints = {
{coords = vector3(438.4, -1018.3, 27.7), heading = 90.0, radius = 6.0},
{coords = vector3(441.0, -1024.2, 28.3), heading = 90.0, radius = 6.0},
{coords = vector3(453.5, -1022.2, 28.0), heading = 90.0, radius = 6.0},
{coords = vector3(450.9, -1016.5, 28.1), heading = 90.0, radius = 6.0}
}
},
{
Spawner = vector3(473.3, -1018.8, 28.0),
InsideShop = vector3(228.5, -993.5, -99.0),
SpawnPoints = {
{coords = vector3(475.9, -1021.6, 28.0), heading = 276.1, radius = 6.0},
{coords = vector3(484.1, -1023.1, 27.5), heading = 302.5, radius = 6.0}
}
}
},
Helicopters = {
{
Spawner = vector3(461.1, -981.5, 43.6),
InsideShop = vector3(477.0, -1106.4, 43.0),
SpawnPoints = {
{coords = vector3(449.5, -981.2, 43.6), heading = 92.6, radius = 10.0}
}
}
},
BossActions = {
vector3(448.4, -973.2, 30.6)
}
}
}
Config.AuthorizedWeapons = {
{ -- recruit
{weapon = 'WEAPON_APPISTOL', components = {0, 0, 1000, 4000, nil}, price = 10000},
{weapon = 'WEAPON_NIGHTSTICK', price = 0},
{weapon = 'WEAPON_STUNGUN', price = 1500},
{weapon = 'WEAPON_FLASHLIGHT', price = 80}
},
{ -- officer
{weapon = 'WEAPON_ADVANCEDRIFLE', components = {0, 6000, 1000, 4000, 8000, nil}, price = 50000},
},
{ -- sergeant
{weapon = 'WEAPON_PUMPSHOTGUN', components = {2000, 6000, nil}, price = 70000},
},
{ -- lieutenant
},
{ -- boss
}
}
Config.AuthorizedVehicles = {
car = {
{ -- recruit
},
{ -- officer
{model = 'police3', price = 20000}
},
{ -- sergeant
{model = 'policet', price = 18500},
{model = 'policeb', price = 30500}
},
{ -- lieutenant
{model = 'riot', price = 70000},
{model = 'fbi2', price = 60000}
},
{ -- boss
}
},
helicopter = {
{ -- recruit
},
{ -- officer
},
{-- sergeant
},
{ -- lieutenant
{model = 'polmav', props = {modLivery = 0}, price = 200000}
},
{ -- boss
{model = 'polmav', props = {modLivery = 0}, price = 100000}
}
}
}
Config.CustomPeds = {
shared = {
{label = 'Sheriff Ped', maleModel = 's_m_y_sheriff_01', femaleModel = 's_f_y_sheriff_01'},
{label = 'Police Ped', maleModel = 's_m_y_cop_01', femaleModel = 's_f_y_cop_01'}
},
recruit = {},
officer = {},
sergeant = {},
lieutenant = {},
boss = {
{label = 'SWAT Ped', maleModel = 's_m_y_swat_01', femaleModel = 's_m_y_swat_01'}
}
}
-- CHECK SKINCHANGER CLIENT MAIN.LUA for matching elements
Config.Uniforms = {
recruit = {
male = {
tshirt_1 = 59, tshirt_2 = 1,
torso_1 = 55, torso_2 = 0,
decals_1 = 0, decals_2 = 0,
arms = 41,
pants_1 = 25, pants_2 = 0,
shoes_1 = 25, shoes_2 = 0,
helmet_1 = 46, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
},
female = {
tshirt_1 = 36, tshirt_2 = 1,
torso_1 = 48, torso_2 = 0,
decals_1 = 0, decals_2 = 0,
arms = 44,
pants_1 = 34, pants_2 = 0,
shoes_1 = 27, shoes_2 = 0,
helmet_1 = 45, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
}
},
officer = {
male = {
tshirt_1 = 58, tshirt_2 = 0,
torso_1 = 55, torso_2 = 0,
decals_1 = 0, decals_2 = 0,
arms = 41,
pants_1 = 25, pants_2 = 0,
shoes_1 = 25, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
},
female = {
tshirt_1 = 35, tshirt_2 = 0,
torso_1 = 48, torso_2 = 0,
decals_1 = 0, decals_2 = 0,
arms = 44,
pants_1 = 34, pants_2 = 0,
shoes_1 = 27, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
}
},
sergeant = {
male = {
tshirt_1 = 58, tshirt_2 = 0,
torso_1 = 55, torso_2 = 0,
decals_1 = 8, decals_2 = 1,
arms = 41,
pants_1 = 25, pants_2 = 0,
shoes_1 = 25, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
},
female = {
tshirt_1 = 35, tshirt_2 = 0,
torso_1 = 48, torso_2 = 0,
decals_1 = 7, decals_2 = 1,
arms = 44,
pants_1 = 34, pants_2 = 0,
shoes_1 = 27, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
}
},
lieutenant = {
male = {
tshirt_1 = 58, tshirt_2 = 0,
torso_1 = 55, torso_2 = 0,
decals_1 = 8, decals_2 = 2,
arms = 41,
pants_1 = 25, pants_2 = 0,
shoes_1 = 25, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
},
female = {
tshirt_1 = 35, tshirt_2 = 0,
torso_1 = 48, torso_2 = 0,
decals_1 = 7, decals_2 = 2,
arms = 44,
pants_1 = 34, pants_2 = 0,
shoes_1 = 27, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
}
},
boss = {
male = {
tshirt_1 = 58, tshirt_2 = 0,
torso_1 = 55, torso_2 = 0,
decals_1 = 8, decals_2 = 3,
arms = 41,
pants_1 = 25, pants_2 = 0,
shoes_1 = 25, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
},
female = {
tshirt_1 = 35, tshirt_2 = 0,
torso_1 = 48, torso_2 = 0,
decals_1 = 7, decals_2 = 3,
arms = 44,
pants_1 = 34, pants_2 = 0,
shoes_1 = 27, shoes_2 = 0,
helmet_1 = -1, helmet_2 = 0,
chain_1 = 0, chain_2 = 0,
ears_1 = 2, ears_2 = 0
}
},
bullet_wear = {
male = {
bproof_1 = 11, bproof_2 = 1
},
female = {
bproof_1 = 13, bproof_2 = 1
}
},
gilet_wear = {
male = {
tshirt_1 = 59, tshirt_2 = 1
},
female = {
tshirt_1 = 36, tshirt_2 = 1
}
}
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloackroom
['cloakroom'] = 'Vestiário',
['citizen_wear'] = 'Roupa casual',
['police_wear'] = 'Uniforme da Polícia',
['gilet_wear'] = 'orange reflective jacket',
['bullet_wear'] = 'bulletproof vest',
['no_outfit'] = 'there\'s no uniform that fits you!',
['open_cloackroom'] = 'Pressione ~INPUT_CONTEXT~ para se trocar',
-- Armory
['remove_object'] = 'take object',
['deposit_object'] = 'deposit object',
['get_weapon'] = 'Pegar arma',
['put_weapon'] = 'Entregar arma',
['buy_weapons'] = 'Comprar armas',
['armory'] = 'Arsenal',
['open_armory'] = 'Pressione ~INPUT_CONTEXT~ para acessar o arsenal',
['armory_owned'] = 'owned',
['armory_free'] = 'free',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armory - Buy weapon',
['armory_componenttitle'] = 'armory - Weapon attatchments',
['armory_bought'] = 'you bought an ~y~%s~s~ for ~g~$%s~s~',
['armory_money'] = 'you cannot afford that weapon',
['armory_hascomponent'] = 'you have that attatchment equiped!',
['get_weapon_menu'] = 'armory - Withdraw Weapon',
['put_weapon_menu'] = 'armory - Store Weapon',
-- Vehicles
['vehicle_menu'] = 'vehicle',
['vehicle_blocked'] = 'all available spawn points are currently blocked!',
['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.',
['garage_title'] = 'vehicle Actions',
['garage_stored'] = 'stored',
['garage_notstored'] = 'not in garage',
['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
['garage_has_stored'] = 'the vehicle has been stored in your garage',
['garage_has_notstored'] = 'no nearby owned vehicles were found',
['garage_notavailable'] = 'your vehicle is not stored in the garage.',
['garage_blocked'] = 'there\'s no available spawn points!',
['garage_empty'] = 'you dont have any vehicles in your garage.',
['garage_released'] = 'your vehicle has been released from the garage.',
['garage_store_nearby'] = 'there is no nearby vehicles.',
['garage_storeditem'] = 'open garage',
['garage_storeitem'] = 'store vehicle in garage',
['garage_buyitem'] = 'vehicle shop',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'vehicle Shop',
['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~g~$%s~s~',
['vehicleshop_money'] = 'you cannot afford that vehicle',
['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait',
['confirm_no'] = 'no',
['confirm_yes'] = 'yes',
-- Service
['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
['service_not'] = 'you have not entered service! You\'ll have to get changed first.',
['service_anonunce'] = 'service information',
['service_in'] = 'you\'ve entered service, welcome!',
['service_in_announce'] = 'operator ~y~%s~s~ has entered service!',
['service_out'] = 'you have left service.',
['service_out_announce'] = 'operator ~y~%s~s~ has left their service.',
-- Action Menu
['citizen_interaction'] = 'Interagir com o cidadão',
['vehicle_interaction'] = 'Interagir com o veículo',
['object_spawner'] = 'Interagir com as rodovias',
['id_card'] = 'Carteira de identidade',
['search'] = 'Procurar',
['handcuff'] = 'Algemar / Soltar',
['drag'] = 'drag',
['put_in_vehicle'] = 'Colocar no veículo',
['out_the_vehicle'] = 'take out of vehicle',
['fine'] = 'Multa',
['unpaid_bills'] = 'manage unpaid bills',
['license_check'] = 'manage license',
['license_revoke'] = 'revoke license',
['license_revoked'] = 'your ~b~%s~s~ has been ~y~revoked~s~!',
['licence_you_revoked'] = 'you revoked a ~b~%s~s~ which belonged to ~y~%s~s~',
['no_players_nearby'] = 'nenhum jogador nas proximidades',
['being_searched'] = 'you are being ~y~searched~s~ by the ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'Informações',
['pick_lock'] = 'Trancar veículo',
['vehicle_unlocked'] = 'Veículo ~g~destravado~s~',
['no_vehicles_nearby'] = 'Nenhum veículo nas proximidades',
['impound'] = 'apreender carro',
['impound_prompt'] = 'Pressione ~INPUT_CONTEXT~ para cancelar a ~y~apreender~s~',
['impound_canceled'] = 'you canceled the impound',
['impound_canceled_moved'] = 'o apreender foi cancelado porque o veículo mudou',
['impound_successful'] = 'você apreendeu o veículo',
['search_database'] = 'informação do veículo',
['search_database_title'] = 'informações do veículo - pesquisa com número de registro',
['search_database_error_invalid'] = 'que ~r~não~s~ é um número de registro ~y~válido~s~',
-- Traffic interaction
['traffic_interaction'] = 'Interagir com as rodovias',
['cone'] = 'Cones',
['barrier'] = 'Barreira',
['spikestrips'] = 'Fita de pregos',
['box'] = 'Caixa',
['cash'] = 'Caixa de dinheiro',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'job: %s',
['sex'] = 'sex: %s',
['dob'] = 'DOB: %s',
['height'] = 'height: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'unknown',
['male'] = 'male',
['female'] = 'female',
-- Body Search Menu
['guns_label'] = '--- Armas ---',
['inventory_label'] = '--- Inventário ---',
['license_label'] = ' --- Licenses ---',
['confiscate'] = 'confiscar %s',
['confiscate_weapon'] = 'confiscate %s with %s bullets',
['confiscate_inv'] = 'Confiscar %sx %s',
['confiscate_dirty'] = 'Confiscar dinheiro sujo: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'you confiscated ~y~%sx~s~ ~b~%s~s~ from ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ were confiscated by ~y~%s~s~',
['you_confiscated_account'] = 'you confiscated ~g~$%s~s~ (%s) from ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s) was confiscated by ~y~%s~s~',
['you_confiscated_weapon'] = 'you confiscated ~b~%s~s~ from ~b~%s~s~ with ~o~%s~s~ bullets',
['got_confiscated_weapon'] = 'your ~b~%s~s~ with ~o~%s~s~ bullets was confiscated by ~y~%s~s~',
['traffic_offense'] = 'Infrações de transito',
['minor_offense'] = 'Infração leve',
['average_offense'] = 'Infração média',
['major_offense'] = 'Infração grave',
['fine_total'] = 'multa: %s',
-- Vehicle Info Menu
['plate'] = 'placa: %s',
['owner_unknown'] = 'proprietário: Desconhecido',
['owner'] = 'proprietário: %s',
-- Boss Menu
['open_bossmenu'] = 'Pressione ~INPUT_CONTEXT~ para abrir o menu',
['quantity_invalid'] = 'invalid quantity',
['have_withdrawn'] = 'you have withdrawn ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'you have deposited ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'quantity',
['inventory'] = 'inventory',
['police_stock'] = 'police Stock',
-- Misc
['remove_prop'] = 'Pressione ~INPUT_CONTEXT~ para remover o objeto',
['map_blip'] = 'Departamento de Polícia',
['unrestrained_timer'] = 'you feel your handcuffs slowly losing grip and fading away.',
-- Notifications
['alert_police'] = 'Alerta da Polícia',
['phone_police'] = 'police',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'satna',
['citizen_wear'] = 'civilní oblek',
['police_wear'] = 'policejní oblek',
['gilet_wear'] = 'oranžová reflexní vesta',
['bullet_wear'] = 'neprůstřelná vesta',
['no_outfit'] = 'není zde žádná uniforma, která by ti sedla!',
['open_cloackroom'] = 'stiskni ~INPUT_CONTEXT~ pro změnu ~y~oblečení~s~.',
-- Armory
['remove_object'] = 'vzít objekt',
['deposit_object'] = 'odevzdat objekt',
['get_weapon'] = 'vzít zbraň ze zbrojnice',
['put_weapon'] = 'uchovat zbraň ve zbrojnici',
['buy_weapons'] = 'koupit zbraně',
['armory'] = 'zbrojnice',
['open_armory'] = 'stiskni ~INPUT_CONTEXT~ pro přístup do ~y~zbrojnice~s~.',
['armory_owned'] = 'vlastněno',
['armory_free'] = 'zdarma',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'zbrojnice',
['armory_componenttitle'] = 'zbrojnice - Příslušenství ke zbraním',
['armory_bought'] = 'zakoupil jsi ~y~%s~s~ za ~g~$%s~s~',
['armory_money'] = 'nemáš dostatek peněz na tuto zbraň',
['armory_hascomponent'] = 'toto příslušenství máš již nainstalováno!',
['get_weapon_menu'] = 'zbrojnice - Vzít zbraň',
['put_weapon_menu'] = 'zbrojnice - Uchovat zbraň',
-- Vehicles
['vehicle_menu'] = 'vozidlo',
['vehicle_blocked'] = 'vsechny dostupne spawn pointy jsou blokovany!',
['garage_prompt'] = 'stiskni ~INPUT_CONTEXT~ pro otevreni ~y~akce vozidel~s~.',
['garage_title'] = 'akce vozidel',
['garage_stored'] = 'uloženo',
['garage_notstored'] = 'není v garáži',
['garage_storing'] = 'pokousime se o odstraneni vozidla, ujisti se, ze kolem nej nejsou hraci.',
['garage_has_stored'] = 'vozidlo bylo ulozeno do garaze',
['garage_has_notstored'] = 'zadne nejblizsi vlastnene vozidlo nenalezeno',
['garage_notavailable'] = 'tvoje vozidlo neni ulozeno v garazi.',
['garage_blocked'] = 'nejsou zde zadne spawn pointy!',
['garage_empty'] = 'zadne vozidlo nemas v garazi.',
['garage_released'] = 'tvoje vozidlo bylo vyjmuto z garaze.',
['garage_store_nearby'] = 'nejsou poblíž zádná vozidla.',
['garage_storeditem'] = 'otevřít garáž',
['garage_storeitem'] = 'uchovat vozidlo v garáži',
['garage_buyitem'] = 'prodej vozidel',
['garage_notauthorized'] = 'nemas opravneni ke koupi tohoto vozidla.',
['helicopter_prompt'] = 'stiskni ~INPUT_CONTEXT~ pro pristup k ~y~akcim Helikopter~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'prodejce vozidel',
['vehicleshop_confirm'] = 'opravdu chces koupit toto vozidlo?',
['vehicleshop_bought'] = 'koupil jsi ~y~%s~s~ za ~r~$%s~s~',
['vehicleshop_money'] = 'toto vozidlo si nemuzete dovolit',
['vehicleshop_awaiting_model'] = 'vozidlo se prave ~g~stahuje a nacita~s~ prosim pockej',
['confirm_no'] = 'ne',
['confirm_yes'] = 'ano',
-- Service
['service_max'] = 'nemuzete vstoupit do sluzby, max dustojníci v provozu: %s/%s',
['service_not'] = 'nezadali jste sluzbu! Nejprve se musíte zmenit.',
['service_anonunce'] = 'informace o sluzbe',
['service_in'] = 'vstoupil jsi do sluzby, vitej!',
['service_in_announce'] = 'operator ~y~%s~s~ se pripojil do sluzby!',
['service_out'] = 'opustil jsi sluzbu.',
['service_out_announce'] = 'operator ~y~%s~s~ opustil jejich sluzbu.',
-- Action Menu
['citizen_interaction'] = 'Interakce s občanem',
['vehicle_interaction'] = 'Interakce vozidla',
['object_spawner'] = 'Objekty',
['id_card'] = 'Občanský průkaz',
['search'] = 'prohledat',
['handcuff'] = 'poutat / odpoutat',
['drag'] = 'prenést',
['put_in_vehicle'] = 'vlozit do vozidla',
['out_the_vehicle'] = 'vytahnout z vozidla',
['fine'] = 'pokuta',
['unpaid_bills'] = 'spravovat nezaplacené pokuty',
['license_check'] = 'spravovat průkazy',
['license_revoke'] = 'zneplatnit průkaz',
['license_revoked'] = 'vase ~b~%s~s~ bylo ~y~zruseno~s~!',
['licence_you_revoked'] = 'zrusil jsi ~b~%s~s~ ktery patril ~y~%s~s~',
['no_players_nearby'] = 'zadny hrac pobliz!',
['being_searched'] = 'prave jsi ~y~prohledavan~s~ ~b~policii~s~',
-- Vehicle interaction
['vehicle_info'] = 'informace o vozidle',
['pick_lock'] = 'vypáčit vozidlo',
['vehicle_unlocked'] = 'vozidlo je ~g~Odemčeno~s~',
['no_vehicles_nearby'] = 'there is no vehicles nearby',
['impound'] = 'odtahnout vozidlo',
['impound_prompt'] = 'zmackni ~INPUT_CONTEXT~ pro zruseni ~y~odtahnuti~s~',
['impound_canceled'] = 'zrusil jsi odtah',
['impound_canceled_moved'] = 'odtah byl zrusen,protoze se vozidlo pohlo!',
['impound_successful'] = 'uspesne jsi odtahl vozidlo',
['search_database'] = 'informace o vozidle',
['search_database_title'] = 'informace o vozidle - pomocí registracnich cisel',
['search_database_error_invalid'] = 'tohle ~r~neni~s~ ~y~spravne~s~ registracni cislo',
-- Traffic interaction
['traffic_interaction'] = 'interakce provozu',
['cone'] = 'kuzel',
['barrier'] = 'bariera',
['spikestrips'] = 'ostnaty pas',
['box'] = 'box',
['cash'] = 'box penez',
-- ID Card Menu
['name'] = 'jméno: %s',
['job'] = 'práce: %s',
['sex'] = 'pohlaví: %s',
['dob'] = 'DOB: %s',
['height'] = 'výška: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'neznámé',
['male'] = 'muž',
['female'] = 'žena',
-- Body Search Menu
['guns_label'] = '--- Zbraně ---',
['inventory_label'] = '--- Inventář ---',
['license_label'] = ' --- Průkazy ---',
['confiscate'] = 'zabavit %s',
['confiscate_weapon'] = 'zabavit %s s %s naboji',
['confiscate_inv'] = 'zabavit %sx %s',
['confiscate_dirty'] = 'zabavit spinave penize: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'zabavil jsi ~y~%sx~s~ ~b~%s~s~ od ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ byly zabaveny od ~y~%s~s~',
['you_confiscated_account'] = 'zabavil jsi ~g~$%s~s~ (%s) od ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s) byly zabaveny ~y~%s~s~',
['you_confiscated_weapon'] = 'zabavil jsi ~b~%s~s~ od ~b~%s~s~ s ~o~%s~s~ naboji ',
['got_confiscated_weapon'] = 'tvoje ~b~%s~s~ s ~o~%s~s~ bylo zabaveno od ~y~%s~s~',
['traffic_offense'] = 'dopravní přestupek',
['minor_offense'] = 'malý přestupek',
['average_offense'] = 'přestupek',
['major_offense'] = 'trestný čin',
['fine_total'] = 'pokuta: %s',
-- Vehicle Info Menu
['plate'] = 'SPZ: %s',
['owner_unknown'] = 'vlastník: Neznámý',
['owner'] = 'vlastník: %s',
-- Boss Menu
['open_bossmenu'] = 'stiskni ~INPUT_CONTEXT~ pro otevření menu',
['quantity_invalid'] = 'neplatné množství',
['have_withdrawn'] = 'vybral jsi ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'vložil jsi ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'množství',
['inventory'] = 'inventář',
['police_stock'] = 'policejní sklad',
-- Misc
['remove_prop'] = 'stiskni ~INPUT_CONTEXT~ pro odstranění předmětu',
['map_blip'] = 'policejní stanice',
['unrestrained_timer'] = 'cítíš, že tvé pouta pomalu ztrácejí přilnavost a padají.',
-- Notifications
['alert_police'] = 'policejní poplach',
['phone_police'] = 'policie',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloackroom
['cloakroom'] = 'Garderobe',
['citizen_wear'] = 'Zivilkleidung',
['police_wear'] = 'Arbeitskleidung',
['gilet_wear'] = 'warnweste',
['bullet_wear'] = 'kugelsichere Weste',
['no_outfit'] = 'Keine Uniform vorhanden, die dir passt!',
['open_cloackroom'] = 'Drücke ~INPUT_CONTEXT~ um dich umzuziehen',
-- Armory
['remove_object'] = 'objekt mitnehmen',
['deposit_object'] = 'objekt ablegen',
['get_weapon'] = 'Waffen holen',
['put_weapon'] = 'Waffen bringen',
['buy_weapons'] = 'Waffen kaufen',
['armory'] = 'Waffenkammer',
['open_armory'] = 'Drücke ~INPUT_CONTEXT~ um die Waffenkammer zu öffnen',
['armory_owned'] = 'im Besitz',
['armory_free'] = 'kostenlos',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'Waffenkammer - Waffe kaufen',
['armory_componenttitle'] = 'Waffenkammer - Waffenaccessoires',
['armory_bought'] = 'du hast ein/e ~y~%s~s~ für ~g~$%s~s~ gekauft',
['armory_money'] = 'du kannst dir die Waffe nicht leisten',
['armory_hascomponent'] = 'du hast das Accessoire ausgerüstet!',
['get_weapon_menu'] = 'Waffenkammer - Waffe mitnehmen',
['put_weapon_menu'] = 'Waffenkammer - Waffe lagern',
-- Vehicles
['vehicle_menu'] = 'Fahrzeuge',
['vehicle_blocked'] = 'alle Ausparkpunkte sind geblockt!',
['garage_prompt'] = 'Drücke ~INPUT_CONTEXT~ um ~y~Fahrzeugaktionen~s~ anzuzeigen.',
['garage_title'] = 'Fahrzeugaktionen',
['garage_stored'] = 'geparkt',
['garage_notstored'] = 'nicht in der Garage',
['garage_storing'] = 'wir versuchen das Fahrzeug einzuparken, bitte stell sicher dass keine Spieler in der Nähe sind.',
['garage_has_stored'] = 'fahrzeug wurde eingeparkt',
['garage_has_notstored'] = 'kein Fahrzeug im Personenbesitz in der Nähe',
['garage_notavailable'] = 'das Fahrzeug ist nicht in der Garage.',
['garage_blocked'] = 'keine Spawnpunkt vorhanden!',
['garage_empty'] = 'es sind keine Fahrzeuge in der Garage.',
['garage_released'] = 'fahrzeug wurde aus der Garage geholt.',
['garage_store_nearby'] = 'keine Fahrzeuge in der Nähe.',
['garage_storeditem'] = 'Garage öffnen',
['garage_storeitem'] = 'fahrzeug einparken',
['garage_buyitem'] = 'fahrzeugshop',
['garage_notauthorized'] = 'du bist nicht autorisiert dieses Fahrzeug zu kaufen.',
['helicopter_prompt'] = 'Drücke ~INPUT_CONTEXT~ um ~y~Helikopteraktionen~s~ zu öffnen.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'fahrzeugshop',
['vehicleshop_confirm'] = 'möchtest du dieses Fahrzeug kaufen?',
['vehicleshop_bought'] = 'du kaufst ~y~%s~s~ für ~r~$%s~s~',
['vehicleshop_money'] = 'du kannst dir das Fahrzeug nicht leisten',
['vehicleshop_awaiting_model'] = 'fahrzeug ~g~DOWNLOADED & LÄDT~s~ bitte warte',
['confirm_no'] = 'nein',
['confirm_yes'] = 'ja',
-- Service
['service_max'] = 'du kannst nicht in den Dienst gehen Max. Officer im Dienst: %s/%s',
['service_not'] = 'du bist nicht in den Dienst gegangen! Zieh zuerst dein Outfit an.',
['service_anonunce'] = 'diensthinweis',
['service_in'] = 'du bist in den Dienst gegangen!',
['service_in_announce'] = '~y~%s~s~ ist nun im Dienst!',
['service_out'] = 'du bist aus dem Dienst gegangen.',
['service_out_announce'] = '~y~%s~s~ ist aus dem Dienst gegangen.',
-- Action Menu
['citizen_interaction'] = 'Zivilistenaktionen',
['vehicle_interaction'] = 'Fahrzeuginteraktionen',
['object_spawner'] = 'Objekt Spawner',
['id_card'] = 'ID Karte',
['search'] = 'Suche',
['handcuff'] = 'Festnehmen / Freilassen',
['drag'] = 'abführen',
['put_in_vehicle'] = 'In Fahrzeug setzen',
['out_the_vehicle'] = 'aus dem Fahrzeug bringen',
['fine'] = 'Strafe',
['unpaid_bills'] = 'ungezahlte Rechnungen bearbeiten',
['license_check'] = 'lizenzen ansehen',
['license_revoke'] = 'lizenz abnehmen',
['license_revoked'] = 'dein ~b~%s~s~ wurde dir ~y~abgenommen~s~!',
['licence_you_revoked'] = 'du nimmst den ~b~%s~s~ ab, welche ~y~%s~s~ gehörte',
['no_players_nearby'] = 'keine Spieler in der Nähe',
['being_searched'] = 'du wirst von der ~b~Polizei ~y~durchsucht~s~',
-- Vehicle interaction
['vehicle_info'] = 'Fahrzeug Info',
['pick_lock'] = 'Fahrzeug öffnen',
['vehicle_unlocked'] = 'Fahrzeug ~g~offen~s~',
['no_vehicles_nearby'] = 'Keine Fahrzeuge in der Nähe',
['impound'] = 'fahrzeug abschleppen',
['impound_prompt'] = 'drücke ~INPUT_CONTEXT~ um das Abschleppen ~y~abzubrechen~s~',
['impound_canceled'] = 'abschleppen abgebrochen',
['impound_canceled_moved'] = 'abschleppen abgebrochen, Fahrzeug wurde bewegt',
['impound_successful'] = 'du hast das Fahrzeug erfolgreich abgeschleppt',
['search_database'] = 'fahrzeugabfrage',
['search_database_title'] = 'Fahrzeugabfragge - Suche nach Kennzeichen',
['search_database_error_invalid'] = '~r~kein~s~ ~y~registriertes~s~ Kennzeichen',
-- Traffic interaction
['traffic_interaction'] = 'Straßeninteraktionen',
['cone'] = 'Hütchen',
['barrier'] = 'Barriere',
['spikestrips'] = 'Nagelband',
['box'] = 'Box',
['cash'] = 'Box mit Geld',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'job: %s',
['sex'] = 'geschlecht: %s',
['dob'] = 'DOB: %s',
['height'] = 'größe: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'unbekannt',
['male'] = 'männlich',
['female'] = 'weiblich',
-- Body Search Menu
['guns_label'] = '--- Waffen ---',
['inventory_label'] = '--- Inventar ---',
['license_label'] = ' --- Lizenzen ---',
['confiscate'] = '%s konfiszieren',
['confiscate_weapon'] = 'konfisziert %s mit %s Kugeln',
['confiscate_inv'] = 'konfisziere %sx %s',
['confiscate_dirty'] = 'schwarzgeld konfisziert: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'du konfiszierst ~y~%sx~s~ ~b~%s~s~ von ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ wurden von ~y~%s~s~ konfisziert',
['you_confiscated_account'] = 'du konfizierst ~g~$%s~s~ (%s) von ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s)wurde von konfisziert ~y~%s~s~',
['you_confiscated_weapon'] = 'du konfiszierst ~b~%s~s~ von ~b~%s~s~ mit ~o~%s~s~ Kugeln',
['got_confiscated_weapon'] = 'dein ~b~%s~s~ mit ~o~%s~s~ Kugeln wwurde von ~y~%s~s~ konfisziert',
['traffic_offense'] = 'verkehrsvergehen',
['minor_offense'] = 'vergehen',
['average_offense'] = 'straftat',
['major_offense'] = 'schwere Straftat',
['fine_total'] = 'strafe: %s',
-- Vehicle Info Menu
['plate'] = 'kennzeichen: %s',
['owner_unknown'] = 'besitzer: Unbekannt',
['owner'] = 'besitzer: %s',
-- Boss Menu
['open_bossmenu'] = 'Drücke ~INPUT_CONTEXT~ um das Menü zu öffnen',
['quantity_invalid'] = 'ungültige Anzahl',
['have_withdrawn'] = 'du hast ~y~%sx~s~ ~b~%s~s~ mitgenommen',
['have_deposited'] = 'du lagerst ~y~%sx~s~ ~b~%s~s~ ein',
['quantity'] = 'anzahl',
['inventory'] = 'inventar',
['police_stock'] = 'polizeilager',
-- Misc
['remove_prop'] = 'drücke ~INPUT_CONTEXT~ um das Objekt zu entfernen',
['map_blip'] = 'polizeistation',
['unrestrained_timer'] = 'deine Handschellen lösen sich langsam.',
-- Notifications
['alert_police'] = 'Polizei alamieren',
['phone_police'] = 'polizei',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'locker room',
['citizen_wear'] = 'civilian Outfit',
['police_wear'] = 'police Outfit',
['gilet_wear'] = 'orange reflective jacket',
['bullet_wear'] = 'bulletproof vest',
['no_outfit'] = 'there\'s no uniform that fits you!',
['open_cloackroom'] = 'press ~INPUT_CONTEXT~ to change ~y~clothes~s~.',
-- Armory
['remove_object'] = 'withdraw object',
['deposit_object'] = 'deposit object',
['get_weapon'] = 'withdraw weapon from armory',
['put_weapon'] = 'store weapon in armory',
['buy_weapons'] = 'buy weapons',
['armory'] = 'armory',
['open_armory'] = 'press ~INPUT_CONTEXT~ to access the ~y~Armory~s~.',
['armory_owned'] = 'owned',
['armory_free'] = 'free',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armory - Buy weapon',
['armory_componenttitle'] = 'armory - Weapon attatchments',
['armory_bought'] = 'you bought an ~y~%s~s~ for ~g~$%s~s~',
['armory_money'] = 'you cannot afford that weapon',
['armory_hascomponent'] = 'you have that attatchment equiped!',
['get_weapon_menu'] = 'armory - Withdraw Weapon',
['put_weapon_menu'] = 'armory - Store Weapon',
-- Vehicles
['vehicle_menu'] = 'vehicle',
['vehicle_blocked'] = 'all available spawn points are currently blocked!',
['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.',
['garage_title'] = 'vehicle Actions',
['garage_stored'] = 'stored',
['garage_notstored'] = 'not in garage',
['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
['garage_has_stored'] = 'the vehicle has been stored in your garage',
['garage_has_notstored'] = 'no nearby owned vehicles were found',
['garage_notavailable'] = 'your vehicle is not stored in the garage.',
['garage_blocked'] = 'there\'s no available spawn points!',
['garage_empty'] = 'you dont have any vehicles in your garage.',
['garage_released'] = 'your vehicle has been released from the garage.',
['garage_store_nearby'] = 'there is no nearby vehicles.',
['garage_storeditem'] = 'open garage',
['garage_storeitem'] = 'store vehicle in garage',
['garage_buyitem'] = 'vehicle shop',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'vehicle Shop',
['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~',
['vehicleshop_money'] = 'you cannot afford that vehicle',
['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait',
['confirm_no'] = 'no',
['confirm_yes'] = 'yes',
-- Service
['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
['service_not'] = 'you have not entered service! You\'ll have to get changed first.',
['service_anonunce'] = 'service information',
['service_in'] = 'you\'ve entered service, welcome!',
['service_in_announce'] = 'operator ~y~%s~s~ has entered service!',
['service_out'] = 'you have left service.',
['service_out_announce'] = 'operator ~y~%s~s~ has left their service.',
-- Action Menu
['citizen_interaction'] = 'citizen Interaction',
['vehicle_interaction'] = 'vehicle Interaction',
['object_spawner'] = 'object Spawner',
['id_card'] = 'ID Card',
['search'] = 'search',
['handcuff'] = 'cuff / Uncuff',
['drag'] = 'escort',
['put_in_vehicle'] = 'put in Vehicle',
['out_the_vehicle'] = 'drag out from vehicle',
['fine'] = 'fine',
['unpaid_bills'] = 'manage unpaid bills',
['license_check'] = 'manage license',
['license_revoke'] = 'revoke license',
['license_revoked'] = 'your ~b~%s~s~ has been ~y~revoked~s~!',
['licence_you_revoked'] = 'you revoked a ~b~%s~s~ which belonged to ~y~%s~s~',
['no_players_nearby'] = 'there is no player(s) nearby!',
['being_searched'] = 'you are being ~y~searched~s~ by the ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'vehicle Info',
['pick_lock'] = 'lockpick Vehicle',
['vehicle_unlocked'] = 'vehicle ~g~Unlocked~s~',
['no_vehicles_nearby'] = 'there is no vehicles nearby',
['impound'] = 'impound vehicle',
['impound_prompt'] = 'press ~INPUT_CONTEXT~ to cancel the ~y~impound~s~',
['impound_canceled'] = 'you canceled the impound',
['impound_canceled_moved'] = 'the impound has been canceled because the vehicle moved',
['impound_successful'] = 'you have impounded the vehicle',
['search_database'] = 'vehicle information',
['search_database_title'] = 'vehicle information - search with registration number',
['search_database_error_invalid'] = 'that is ~r~not~s~ a ~y~valid~s~ registration number',
-- Traffic interaction
['traffic_interaction'] = 'interaction Traffic',
['cone'] = 'cone',
['barrier'] = 'barrier',
['spikestrips'] = 'spikestrips',
['box'] = 'box',
['cash'] = 'box of cash',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'job: %s',
['sex'] = 'sex: %s',
['dob'] = 'DOB: %s',
['height'] = 'height: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'unknown',
['male'] = 'male',
['female'] = 'female',
-- Body Search Menu
['guns_label'] = '--- Guns ---',
['inventory_label'] = '--- Inventory ---',
['license_label'] = ' --- Licenses ---',
['confiscate'] = 'confiscate %s',
['confiscate_weapon'] = 'confiscate %s with %s bullets',
['confiscate_inv'] = 'confiscate %sx %s',
['confiscate_dirty'] = 'confiscate dirty money: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'you confiscated ~y~%sx~s~ ~b~%s~s~ from ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ were confiscated by ~y~%s~s~',
['you_confiscated_account'] = 'you confiscated ~g~$%s~s~ (%s) from ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s) was confiscated by ~y~%s~s~',
['you_confiscated_weapon'] = 'you confiscated ~b~%s~s~ from ~b~%s~s~ with ~o~%s~s~ bullets',
['got_confiscated_weapon'] = 'your ~b~%s~s~ with ~o~%s~s~ bullets was confiscated by ~y~%s~s~',
['traffic_offense'] = 'traffic Offense',
['minor_offense'] = 'minor Offense',
['average_offense'] = 'average Offense',
['major_offense'] = 'major Offense',
['fine_total'] = 'fine: %s',
-- Vehicle Info Menu
['plate'] = 'plate: %s',
['owner_unknown'] = 'owner: Unknown',
['owner'] = 'owner: %s',
-- Boss Menu
['open_bossmenu'] = 'press ~INPUT_CONTEXT~ to open the menu',
['quantity_invalid'] = 'invalid quantity',
['have_withdrawn'] = 'you have withdrawn ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'you have deposited ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'quantity',
['inventory'] = 'inventory',
['police_stock'] = 'police Stock',
-- Misc
['remove_prop'] = 'press ~INPUT_CONTEXT~ to delete the object',
['map_blip'] = 'police Station',
['unrestrained_timer'] = 'you feel your handcuffs slowly losing grip and fading away.',
-- Notifications
['alert_police'] = 'police alert',
['phone_police'] = 'police',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'Taquilla',
['citizen_wear'] = 'Ropa civil',
['police_wear'] = 'Ropa CNP',
['gilet_wear'] = 'orange reflective jacket',
['bullet_wear'] = 'bulletproof vest',
['no_outfit'] = 'there\'s no uniform that fits you!',
['open_cloackroom'] = 'Presionar ~INPUT_CONTEXT~ para abrir la taquilla',
-- Armory
['remove_object'] = 'take object',
['deposit_object'] = 'deposit object',
['get_weapon'] = 'Coger arma',
['put_weapon'] = 'Depositar arma',
['buy_weapons'] = 'Comprar armas',
['armory'] = 'Arsenal',
['open_armory'] = 'Presionarr ~INPUT_CONTEXT~ para acceder a la armeria',
['armory_owned'] = 'owned',
['armory_free'] = 'free',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armory - Buy weapon',
['armory_componenttitle'] = 'armory - Weapon attatchments',
['armory_bought'] = 'you bought an ~y~%s~s~ for ~g~$%s~s~',
['armory_money'] = 'you cannot afford that weapon',
['armory_hascomponent'] = 'you have that attatchment equiped!',
['get_weapon_menu'] = 'armory - Withdraw Weapon',
['put_weapon_menu'] = 'armory - Store Weapon',
-- Vehicles
['vehicle_menu'] = 'vehicle',
['vehicle_blocked'] = 'all available spawn points are currently blocked!',
['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.',
['garage_title'] = 'vehicle Actions',
['garage_stored'] = 'stored',
['garage_notstored'] = 'not in garage',
['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
['garage_has_stored'] = 'the vehicle has been stored in your garage',
['garage_has_notstored'] = 'no nearby owned vehicles were found',
['garage_notavailable'] = 'your vehicle is not stored in the garage.',
['garage_blocked'] = 'there\'s no available spawn points!',
['garage_empty'] = 'you dont have any vehicles in your garage.',
['garage_released'] = 'your vehicle has been released from the garage.',
['garage_store_nearby'] = 'there is no nearby vehicles.',
['garage_storeditem'] = 'open garage',
['garage_storeitem'] = 'store vehicle in garage',
['garage_buyitem'] = 'vehicle shop',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'vehicle Shop',
['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~',
['vehicleshop_money'] = 'you cannot afford that vehicle',
['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait',
['confirm_no'] = 'no',
['confirm_yes'] = 'yes',
-- Service
['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
['service_not'] = 'you have not entered service! You\'ll have to get changed first.',
['service_anonunce'] = 'service information',
['service_in'] = 'you\'ve entered service, welcome!',
['service_in_announce'] = 'operator ~y~%s~s~ has entered service!',
['service_out'] = 'you have left service.',
['service_out_announce'] = 'operator ~y~%s~s~ has left their service.',
-- Action Menu
['citizen_interaction'] = 'Interacción ciudadana',
['vehicle_interaction'] = 'Interacción vehículo',
['object_spawner'] = 'Colocar objetos',
['id_card'] = 'Documento de identidad',
['search'] = 'Buscar',
['handcuff'] = 'Poner/quitar Esposas',
['drag'] = 'escoltar',
['put_in_vehicle'] = 'Meter en el vehículo',
['out_the_vehicle'] = 'Sacar del vehículo',
['fine'] = 'Multa',
['unpaid_bills'] = 'manage unpaid bills',
['license_check'] = 'manage license',
['license_revoke'] = 'revoke license',
['license_revoked'] = 'your ~b~%s~s~ has been ~y~revoked~s~!',
['licence_you_revoked'] = 'you revoked a ~b~%s~s~ which belonged to ~y~%s~s~',
['no_players_nearby'] = 'no hay jugadores cerca',
['being_searched'] = 'you are being ~y~searched~s~ by the ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'Información del vehículo',
['pick_lock'] = 'Forzar coche',
['vehicle_unlocked'] = 'Vehículo desbloqueado~s~',
['no_vehicles_nearby'] = 'No hay vehículos cerca',
['impound'] = 'impound vehicle',
['impound_prompt'] = 'press ~INPUT_CONTEXT~ to cancel the ~y~impound~s~',
['impound_canceled'] = 'you canceled the impound',
['impound_canceled_moved'] = 'the impound has been canceled because the vehicle moved',
['impound_successful'] = 'you have impounded the vehicle',
['search_database'] = 'vehicle information',
['search_database_title'] = 'vehicle information - search with registration number',
['search_database_error_invalid'] = 'that is ~r~not~s~ a ~y~valid~s~ registration number',
-- Traffic interaction
['traffic_interaction'] = 'Rutas de interacción',
['cone'] = 'Cono',
['barrier'] = 'Barrera',
['spikestrips'] = 'Grada',
['box'] = 'Caja',
['cash'] = 'Dinero',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'job: %s',
['sex'] = 'sex: %s',
['dob'] = 'DOB: %s',
['height'] = 'height: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'unknown',
['male'] = 'male',
['female'] = 'female',
-- Body Search Menu
['guns_label'] = '--- Armas ---',
['inventory_label'] = '--- Inventario ---',
['license_label'] = ' --- Licenses ---',
['confiscate'] = 'confiscar %s',
['confiscate_weapon'] = 'confiscate %s with %s bullets',
['confiscate_inv'] = 'confiscar %sx %s',
['confiscate_dirty'] = 'confiscar dinero negro: <span style="color:red;">€%s</span>',
['you_confiscated'] = 'you confiscated ~y~%sx~s~ ~b~%s~s~ from ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ were confiscated by ~y~%s~s~',
['you_confiscated_account'] = 'you confiscated ~g~€%s~s~ (%s) from ~b~%s~s~',
['got_confiscated_account'] = '~g~€%s~s~ (%s) was confiscated by ~y~%s~s~',
['you_confiscated_weapon'] = 'you confiscated ~b~%s~s~ from ~b~%s~s~ with ~o~%s~s~ bullets',
['got_confiscated_weapon'] = 'your ~b~%s~s~ with ~o~%s~s~ bullets was confiscated by ~y~%s~s~',
['traffic_offense'] = 'Delito de tráfico',
['minor_offense'] = 'Delito menor',
['average_offense'] = 'Delito medio',
['major_offense'] = 'Delito grave',
['fine_total'] = 'Multa total: %s',
-- Vehicle Info Menu
['plate'] = 'n°: %s',
['owner_unknown'] = 'propietario: Desconocido',
['owner'] = 'propietario: %s',
-- Boss Menu
['open_bossmenu'] = 'presionar ~INPUT_CONTEXT~ para abrir el menú',
['quantity_invalid'] = 'cantidad invalida',
['have_withdrawn'] = 'you have withdrawn ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'you have deposited ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'cantidad',
['inventory'] = 'inventario',
['police_stock'] = 'almacen Policial',
-- Misc
['remove_prop'] = 'presionar ~INPUT_CONTEXT~ para eliminar el objeto',
['map_blip'] = 'comisaría de policía',
['unrestrained_timer'] = 'you feel your handcuffs slowly losing grip and fading away.',
-- Notifications
['alert_police'] = 'alerta policia',
['phone_police'] = 'policia',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'vaatelokero',
['citizen_wear'] = 'siviiliasu',
['police_wear'] = 'poliisiasu',
['gilet_wear'] = 'huomioliivi',
['bullet_wear'] = 'luotiliivi',
['no_outfit'] = 'täällä ei ole sinulle sopivaa asua',
['open_cloackroom'] = 'paina ~INPUT_CONTEXT~ vaihtaaksesi ~y~vaatteita~s~.',
-- Armory
['remove_object'] = 'ota esine',
['deposit_object'] = 'talleta esine',
['get_weapon'] = 'ota ase',
['put_weapon'] = 'laita ase pois',
['buy_weapons'] = 'osta aseita',
['armory'] = 'asevarasto',
['open_armory'] = 'paina ~INPUT_CONTEXT~ avataksesi asevarasto',
['armory_owned'] = 'owned',
['armory_free'] = 'free',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armory - Buy weapon',
['armory_componenttitle'] = 'armory - Weapon attatchments',
['armory_bought'] = 'you bought an ~y~%s~s~ for ~g~$%s~s~',
['armory_money'] = 'you cannot afford that weapon',
['armory_hascomponent'] = 'you have that attatchment equiped!',
['get_weapon_menu'] = 'armory - Withdraw Weapon',
['put_weapon_menu'] = 'armory - Store Weapon',
-- Vehicles
['vehicle_menu'] = 'vehicle',
['vehicle_blocked'] = 'all available spawn points are currently blocked!',
['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.',
['garage_title'] = 'vehicle Actions',
['garage_stored'] = 'stored',
['garage_notstored'] = 'not in garage',
['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
['garage_has_stored'] = 'the vehicle has been stored in your garage',
['garage_has_notstored'] = 'no nearby owned vehicles were found',
['garage_notavailable'] = 'your vehicle is not stored in the garage.',
['garage_blocked'] = 'there\'s no available spawn points!',
['garage_empty'] = 'you dont have any vehicles in your garage.',
['garage_released'] = 'your vehicle has been released from the garage.',
['garage_store_nearby'] = 'there is no nearby vehicles.',
['garage_storeditem'] = 'open garage',
['garage_storeitem'] = 'store vehicle in garage',
['garage_buyitem'] = 'vehicle shop',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'vehicle Shop',
['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~',
['vehicleshop_money'] = 'you cannot afford that vehicle',
['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait',
['confirm_no'] = 'no',
['confirm_yes'] = 'yes',
-- Service
['service_max'] = 'you cannot enter service, max officers in service: %s/%s',
['service_not'] = 'you have not entered service! You\'ll have to get changed first.',
['service_anonunce'] = 'service information',
['service_in'] = 'you\'ve entered service, welcome!',
['service_in_announce'] = 'operator ~y~%s~s~ has entered service!',
['service_out'] = 'you have left service.',
['service_out_announce'] = 'operator ~y~%s~s~ has left their service.',
-- Action Menu
['citizen_interaction'] = 'siviilin vuorovaikutus',
['vehicle_interaction'] = 'ajoneuvon vuorovaikutus',
['object_spawner'] = 'objekti spawneri',
['id_card'] = 'henkilöllisyystodistus',
['search'] = 'tutki',
['handcuff'] = 'raudat On/Off',
['drag'] = 'raahaa',
['put_in_vehicle'] = 'laita ajoneuvoon',
['out_the_vehicle'] = 'ota ulos ajoneuvosta',
['fine'] = 'sakko',
['unpaid_bills'] = 'hallinoi maksamattomia laskuja',
['license_check'] = 'hallitse lisenssejä',
['license_revoke'] = 'kumoa lisenssi',
['license_revoked'] = 'sinun ~b~%s~s~ ~y~kumottiin~s~!',
['licence_you_revoked'] = 'sinä kumosit ~b~%s~s~ mikä kuului henkilölle ~y~%s~s~',
['no_players_nearby'] = 'ei pelaajia lähettyvillä',
['being_searched'] = 'you are being ~y~searched~s~ by the ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'ajoneuvon tiedot',
['pick_lock'] = 'tiirikoi ovet',
['vehicle_unlocked'] = 'ajoneuvo ~g~Avattu~s~',
['no_vehicles_nearby'] = 'ei ajoneuvoja lähettyvillä',
['impound'] = 'takavarikoi ajoneuvo',
['impound_prompt'] = 'paina ~INPUT_CONTEXT~ peruaksesi ~y~takavarikointi~s~',
['impound_canceled'] = 'sinä peruit takavarikoinnin',
['impound_canceled_moved'] = 'takavarikointi peruuntui koska ajoneuvo liikku',
['impound_successful'] = 'takavarikoit ajoneuvon',
['search_database'] = 'ajoneuvon tiedot',
['search_database_title'] = 'ajoneuvon tiedot - etsi rekisterinumerolla',
['search_database_error_invalid'] = 'tämä ~r~ei ole~s~ ~y~voimassa oleva~s~ rekisterinumero',
-- Traffic interaction
['traffic_interaction'] = 'liikenteen vuorovaikutus',
['cone'] = 'kartio',
['barrier'] = 'este',
['spikestrips'] = 'piikkimatto',
['box'] = 'laatikko',
['cash'] = 'rahalaatikko',
-- ID Card Menu
['name'] = 'nimi: %s',
['job'] = 'työ: %s',
['sex'] = 'sukupuoli: %s',
['dob'] = 'syntymäaika: %s',
['height'] = 'pituus: %s',
['bac'] = 'alkometri: %s',
['unknown'] = 'tuntematon',
['male'] = 'mies',
['female'] = 'nainen',
-- Body Search Menu
['guns_label'] = '--- Aseet ---',
['inventory_label'] = '--- Reppu ---',
['license_label'] = ' --- Lisenssit ---',
['confiscate'] = 'takavarikoi %s',
['confiscate_weapon'] = 'confiscate %s with %s bullets',
['confiscate_inv'] = 'takavarikoi %sx %s',
['confiscate_dirty'] = 'takavarikoi likainen raha: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'sinä takavarioit ~y~%sx~s~ ~b~%s~s~ pelaajalta ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ takavarikoitiin sinulta pelaajan ~y~%s~s~ toimesta',
['you_confiscated_account'] = 'sinä takavarikoit ~g~$%s~s~ (%s) pelaajalta ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s) takavarikoitiin sinulta pelaajan ~y~%s~s~ toimesta',
['you_confiscated_weapon'] = 'sinä takavarikoit ~b~%s~s~ pelaajalta ~b~%s~s~ jossa oli ~o~%s~s~ panosta',
['got_confiscated_weapon'] = 'sinun ~b~%s~s~ jossa oli ~o~%s~s~ panosta takavarikoitiin sinulta~y~%s~s~',
['traffic_offense'] = 'liikenne rikokset',
['minor_offense'] = 'lievät rikokset',
['average_offense'] = 'keskisuuret rikokset',
['major_offense'] = 'vakavat rikokset',
['fine_total'] = 'sakko: %s',
--Vehicle Info Menu
['plate'] = 'kilpi: %s',
['owner_unknown'] = 'omistaja: Tuntematon',
['owner'] = 'omistaja: %s',
--Boss Menu
['open_bossmenu'] = 'paina ~INPUT_CONTEXT~ avataksesi valikon',
['quantity_invalid'] = 'invalid quantity',
['have_withdrawn'] = 'sinä otit varastosta ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'sinä talletit varastoon ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'määrä',
['inventory'] = 'varasto',
['police_stock'] = 'poliisin Varasto',
-- Misc
['remove_prop'] = 'paina ~INPUT_CONTEXT~ poistaaksesi objektin',
['map_blip'] = 'poliisilaitos',
['unrestrained_timer'] = 'tunnet kuinka hitaasti käsiraudat alkavat löystyä ja irtoavat',
-- Notifications
['alert_police'] = 'hälyytys Poliisi',
['phone_police'] = 'poliisi',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'vestiaire',
['citizen_wear'] = 'tenue Civil',
['police_wear'] = 'tenue Policier',
['gilet_wear'] = 'gilet orange',
['bullet_wear'] = 'gilet pare-balles',
['no_outfit'] = 'il n\'y a pas d\'uniforme à votre taille...',
['open_cloackroom'] = 'appuyez sur ~INPUT_CONTEXT~ pour vous changer',
-- Armory
['remove_object'] = 'prendre Objet',
['deposit_object'] = 'déposer objet',
['get_weapon'] = 'prendre Arme',
['put_weapon'] = 'déposer Arme',
['buy_weapons'] = 'acheter Armes',
['armory'] = 'armurerie',
['open_armory'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder à l\'armurerie',
['armory_owned'] = 'possédé',
['armory_free'] = 'gratuit',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armurerie - Acheter une arme',
['armory_componenttitle'] = 'armurerie - Accessoires d\'armes',
['armory_bought'] = 'vous achetez un ~y~%s~s~ pour ~g~$%s~s~',
['armory_money'] = 'vous ne pouvez pas acheter cette arme',
['armory_hascomponent'] = 'vous avez cet accessoire équipé!',
['get_weapon_menu'] = 'armurerie - Retirer arme',
['put_weapon_menu'] = 'armurerie - Stocker arme',
-- Vehicles
['vehicle_menu'] = 'véhicule',
['vehicle_blocked'] = 'tous les points de spawn sont bloqués!',
['garage_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions Véhicule~s~.',
['garage_title'] = 'actions Véhicules',
['garage_stored'] = 'rangé',
['garage_notstored'] = 'sorti(e)',
['garage_storing'] = 'tentative de suppression du véhicule, assurez-vous que personne ne soit autour.',
['garage_has_stored'] = 'le véhicule a bien été rangé dans le garage',
['garage_has_notstored'] = 'aucun véhicule dans le garage',
['garage_notavailable'] = 'votre véhicule n\'est pas rangé dans le garage.',
['garage_blocked'] = 'la sortie du garage est obstruée!',
['garage_empty'] = 'vous n\'avez aucun véhicule dans le garage.',
['garage_released'] = 'votre véhicule a été sorti.',
['garage_store_nearby'] = 'aucun véhicule a proximité.',
['garage_storeditem'] = 'ouvrir le garage',
['garage_storeitem'] = 'ranger le véhicule',
['garage_buyitem'] = 'magasin véhicule',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder aux ~y~Actions de l\'hélicoptère~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'magasin véhicule',
['vehicleshop_confirm'] = 'voulez-vous acheter ce véhicule?',
['vehicleshop_bought'] = 'vous avez acheté ~y~%s~s~ pour ~r~$%s~s~',
['vehicleshop_money'] = 'vous ne pouvez pas acheter ce véhicule',
['vehicleshop_awaiting_model'] = 'le véhicule est actuellement en ~g~PRÉPARATION~s~ veuillez patienter',
['confirm_no'] = 'non',
['confirm_yes'] = 'oui',
-- Service
['service_max'] = 'vous ne pouvez pas entrer en service, officiers en service: %s/%s',
['service_not'] = 'vous n\'êtes pas en service! Vous devez d\'abord enfiler votre tenue.',
['service_anonunce'] = 'prise de service',
['service_in'] = 'vous êtes en service, bon courage!',
['service_in_announce'] = 'l\'officier ~y~%s~s~ est entré en service!',
['service_out'] = 'vous avez terminé votre service.',
['service_out_announce'] = 'l\'officier ~y~%s~s~ a quitté son service.',
-- Action Menu
['citizen_interaction'] = 'interaction citoyen',
['vehicle_interaction'] = 'interaction véhicule',
['object_spawner'] = 'placer objets',
['id_card'] = 'carte d\'identité',
['search'] = 'fouiller',
['handcuff'] = 'menotter / Démenotter',
['drag'] = 'escorter',
['put_in_vehicle'] = 'mettre dans véhicule',
['out_the_vehicle'] = 'sortir du véhicule',
['fine'] = 'Amende',
['unpaid_bills'] = 'gérer les amendes impayées',
['license_check'] = 'gérer les licences',
['license_revoke'] = 'révoquer la licence',
['license_revoked'] = 'votre ~b~%s~s~ a été ~y~révoqué~s~!',
['licence_you_revoked'] = 'vous avez révoqué un ~b~%s~s~ qui appartenait à ~y~%s~s~',
['no_players_nearby'] = 'aucun joueur à proximité',
['being_searched'] = 'vous êtes ~y~recherché(e)~s~ par la ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'infos véhicule',
['pick_lock'] = 'crocheter véhicule',
['vehicle_unlocked'] = 'véhicule ~g~déverouillé~s~',
['no_vehicles_nearby'] = 'aucun véhicule à proximité',
['impound'] = 'véhicule en fourrière',
['impound_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour annuler la ~y~saisie du véhicule~s~',
['impound_canceled'] = 'vous avez annulé la saisie',
['impound_canceled_moved'] = 'la saisie a été annulée parce que le véhicule a déménagé',
['impound_successful'] = 'vous avez saisi le véhicule',
['search_database'] = 'vehicle information',
['search_database_title'] = 'informations sur le véhicule - recherche avec numéro d\'enregistrement',
['search_database_error_invalid'] = 'Ce n\'est ~r~pas~s~ un ~y~numéro d\'enregistrement valide~s~',
-- Traffic interaction
['traffic_interaction'] = 'interaction routière',
['cone'] = 'plot',
['barrier'] = 'barrière',
['spikestrips'] = 'herse',
['box'] = 'caisse',
['cash'] = 'caisse',
-- ID Card Menu
['name'] = 'nom: %s',
['job'] = 'métier: %s',
['sex'] = 'sexe: %s',
['dob'] = 'DOB: %s',
['height'] = 'taille: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'inconnu',
['male'] = 'homme',
['female'] = 'femme',
-- Body Search Menu
['guns_label'] = '--- Armes ---',
['inventory_label'] = '--- Inventaire ---',
['license_label'] = ' --- Licenses ---',
['confiscate'] = 'confisquer %s',
['confiscate_weapon'] = 'confisqué %s avec %s balles',
['confiscate_inv'] = 'confisquer %sx %s',
['confiscate_dirty'] = 'confisquer argent sale: <span style="color:red;">€%s</span>',
['you_confiscated'] = 'vous avez confisqué ~y~%sx~s~ ~b~%s~s~ à ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ ont été confisqués par ~y~%s~s~',
['you_confiscated_account'] = 'vous avez confisqué ~g~$%s~s~ (%s) à ~b~%s~s~',
['got_confiscated_account'] = '~g~$%s~s~ (%s) ont été confisqués par ~y~%s~s~',
['you_confiscated_weapon'] = 'vous avez confisqué ~b~%s~s~ à ~b~%s~s~ avec ~o~%s~s~ balles',
['got_confiscated_weapon'] = 'votre ~b~%s~s~ avec ~o~%s~s~ balles a été confisqué par ~y~%s~s~',
['traffic_offense'] = 'code de la route',
['minor_offense'] = 'délit mineur',
['average_offense'] = 'délit moyen',
['major_offense'] = 'délit grave',
['fine_total'] = 'amende: %s',
-- Vehicle Info Menu
['plate'] = 'n°: %s',
['owner_unknown'] = 'propriétaire: Inconnu',
['owner'] = 'propriétaire: %s',
-- Boss Menu
['open_bossmenu'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu',
['quantity_invalid'] = 'quantité invalide',
['have_withdrawn'] = 'vous avez retiré ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'vous avez déposé ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'quantité',
['inventory'] = 'inventaire',
['police_stock'] = 'coffre de la police',
-- Misc
['remove_prop'] = 'appuyez sur ~INPUT_CONTEXT~ pour enlever l\'objet',
['map_blip'] = 'Commissariat',
['unrestrained_timer'] = 'vous sentez que vos menottes deviennent fragiles.',
-- Notifications
['alert_police'] = 'alerte police',
['phone_police'] = 'police',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = '라커룸',
['citizen_wear'] = '민간인 복장',
['police_wear'] = '경찰 복장',
['gilet_wear'] = '오렌지 반사 재킷',
['bullet_wear'] = '방탄 조끼',
['no_outfit'] = '당신에게 맞는 유니폼이 없습니다!',
['open_cloackroom'] = '~y~옷~s~을 변경하려면 ~INPUT_CONTEXT~를 누르십시오.',
-- Armory
['remove_object'] = '오브젝트를 빼다',
['deposit_object'] = '오브젝트를 두다',
['get_weapon'] = '병기고에서 무기를 빼다',
['put_weapon'] = '병기고에 무기를 넣다',
['buy_weapons'] = '무기 구매',
['armory'] = '병기고',
['open_armory'] = '~INPUT_CONTEXT~를 눌러 ~y~병기고~s~에 접근하십시오.',
['armory_owned'] = '소유',
['armory_free'] = '자유',
['armory_item'] = '$%s',
['armory_weapontitle'] = '병기고 - 무기 구매',
['armory_componenttitle'] = '병기고 - 무기 부착물',
['armory_bought'] = '당신은 ~g~$%s~s~에 ~y~%s~s~를 구매했습니다',
['armory_money'] = '당신은 이 무기를 살 수 없습니다',
['armory_hascomponent'] = '이 부착물이 장착되어 있습니다!',
['get_weapon_menu'] = '병기고 - 무기 빼다',
['put_weapon_menu'] = '병기고 - 무기 넣다',
-- Vehicles
['vehicle_menu'] = '차량',
['vehicle_blocked'] = '모든 스폰 지점이 차단되었습니다!',
['garage_prompt'] = '~INPUT_CONTEXT~를 눌러 ~y~차량 동작~s~에 액세스하십시오.',
['garage_title'] = '차량 행동',
['garage_stored'] = '저장됨',
['garage_notstored'] = '차고가 아님',
['garage_storing'] = '차량을 제거하려고 합니다. 주변에 아무도 없는지 확인하십시오.',
['garage_has_stored'] = '차량이 차고에 보관되었습니다',
['garage_has_notstored'] = '차고에 차량이 없습니다',
['garage_notavailable'] = '차량이 차고에 저장되어 있지 않습니다',
['garage_blocked'] = '차고 출구가 막혔습니다!',
['garage_empty'] = '차고에 차량이 없습니다.',
['garage_released'] = '차량이 출시되었습니다',
['garage_store_nearby'] = '주변에 차량이 없습니다.',
['garage_storeditem'] = '차고 열기',
['garage_storeitem'] = '차량 정리',
['garage_buyitem'] = '차량 상점',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = '~y~헬리콥터 동작~s~에 액세스하려면 ~INPUT_CONTEXT~를 누릅니다.',
['shop_item'] = '$%s',
['vehicleshop_title'] = '차량 판매점',
['vehicleshop_confirm'] = '이 차량을 사고 싶습니까?',
['vehicleshop_bought'] = '당신은 ~r~$%s~s~에 ~y~%s~s~를 구매했습니다',
['vehicleshop_money'] = '이 차량을 살 수 없습니다',
['vehicleshop_awaiting_model'] = '차량이 현재 ~g~다운로드 및 로딩중입니다~s~. 잠시만 기다려주십시오',
['confirm_no'] = '아니요',
['confirm_yes'] = '',
-- Service
['service_max'] = '서비스에 진입 할 수 없습니다. 최대 임원 : %s/%s',
['service_not'] = '당신은 서비스를 입력하지 않았습니다! 먼저 변경해야합니다.',
['service_anonunce'] = '서비스 정보',
['service_in'] = '당신은 서비스에 들어갔다, 환영합니다!',
['service_in_announce'] = '~y~%s~s~가 서비스에 들어 왔습니다!',
['service_out'] = '당신은 서비스를 떠났습니다.',
['service_out_announce'] = '~y~%s~s~가 서비스를 떠났습니다.',
-- Action Menu
['citizen_interaction'] = '시민 상호 작용',
['vehicle_interaction'] = '차량 상호 작용',
['object_spawner'] = '오브젝트 Spawner',
['id_card'] = '신분증',
['search'] = '수색',
['handcuff'] = '수갑을 채우다 / 수갑을 풀어주다',
['drag'] = '호위',
['put_in_vehicle'] = '차량에 넣다',
['out_the_vehicle'] = '차량을 끌다',
['fine'] = '벌금',
['unpaid_bills'] = '미지급 벌금 관리',
['license_check'] = '라이선스 관리',
['license_revoke'] = '라이선스 취소',
['license_revoked'] = '~b~%s~s~는 ~y~취소~s~입니다!',
['licence_you_revoked'] = '~y~%s~s~에 속하는 ~b~%s~s~를 취소했습니다.',
['no_players_nearby'] = '근처에 플레이어가 없습니다!',
['being_searched'] = '~b~경찰~s~이 당신을 ~y~수색~s~',
-- Vehicle interaction
['vehicle_info'] = '차량 정보',
['pick_lock'] = '차량 락픽',
['vehicle_unlocked'] = '차량 ~g~잠금 해제~s~',
['no_vehicles_nearby'] = '근처에 차량이 없습니다',
['impound'] = '차량을 견인하다',
['impound_prompt'] = '~y~견인~s~을 취소하려면 ~INPUT_CONTEXT~를 누릅니다',
['impound_canceled'] = '당신은 견인을 취소했습니다',
['impound_canceled_moved'] = '차량이 움직였기 때문에 견인이 취소되었습니다',
['impound_successful'] = '당신은 차량을 견인했습니다',
['search_database'] = '차량 정보',
['search_database_title'] = '차량 정보 - 등록번호로 검색',
['search_database_error_invalid'] = '~y~유효한~s~ 등록 번호가 ~r~아닙니다.~s~',
-- Traffic interaction
['traffic_interaction'] = '교통 상호 작용',
['cone'] = '원뿔',
['barrier'] = '장벽',
['spikestrips'] = '스파이크 스트립',
['box'] = '상자',
['cash'] = '현금 상자',
-- ID Card Menu
['name'] = '이름: %s',
['job'] = '직업: %s',
['sex'] = '성별: %s',
['dob'] = '생일: %s',
['height'] = '키: %s',
['bac'] = '혈중 알코올 농도: %s',
['unknown'] = '알 수 없는',
['male'] = '남자',
['female'] = '여자',
-- Body Search Menu
['guns_label'] = '--- 총 ---',
['inventory_label'] = '--- 인벤토리 ---',
['license_label'] = ' --- 라이선스 ---',
['confiscate'] = '%s 을 압수',
['confiscate_weapon'] = '%s 와 %s 총알을 압수',
['confiscate_inv'] = '%sx %s 을 압수',
['confiscate_dirty'] = '더러운 돈을 압수: <span style="color:red;">$%s</span>',
['you_confiscated'] = '당신은 ~y~%sx~s~ ~b~%s~s~을 ~b~%s~s~에게서 압수했습니다',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~이(가) ~y~%s~s~에 압수되었습니다',
['you_confiscated_account'] = '당신은 ~g~$%s~s~ (%s) 를 ~b~%s~s~ 에게서 압수했습니다.',
['got_confiscated_account'] = '~g~$%s~s~ (%s) 이(가) ~y~%s~s~에 압수되었습니다',
['you_confiscated_weapon'] = '당신은 ~b~%s~s~을 ~b~%s~s~에게서 압수하고 ~o~%s~s~ 총알도 압수했습니다.',
['got_confiscated_weapon'] = '당신의 ~b~%s~s~와 ~o~%s~s~ 총알이 ~y~%s~s~에 의해 압수되었습니다.',
['traffic_offense'] = '교통 위반',
['minor_offense'] = '경범죄',
['average_offense'] = '일반 범죄',
['major_offense'] = '심각한 범죄',
['fine_total'] = '벌금: %s',
-- Vehicle Info Menu
['plate'] = '번호판: %s',
['owner_unknown'] = '소유자: 알 수 없는',
['owner'] = '소유자: %s',
-- Boss Menu
['open_bossmenu'] = '~INPUT_CONTEXT~를 눌러 메뉴를 엽니다.',
['quantity_invalid'] = '유효하지 않은 수량',
['have_withdrawn'] = '당신은 ~y~%sx~s~ ~b~%s~s~ 뺐다 ',
['have_deposited'] = '당신은 ~y~%sx~s~ ~b~%s~s~ 넣었다',
['quantity'] = '수량',
['inventory'] = '인벤토리',
['police_stock'] = '경찰 자리',
-- Misc
['remove_prop'] = '~INPUT_CONTEXT~를 눌러 오브젝트를 삭제하십시오.',
['map_blip'] = '경찰서',
['unrestrained_timer'] = '당신의 수갑이 천천히 풀리는 것을 느낍니다.',
-- Notifications
['alert_police'] = '경찰 경보',
['phone_police'] = '경찰',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'szatnia',
['citizen_wear'] = 'ubranie Cywilne',
['police_wear'] = 'mundur',
['gilet_wear'] = 'kamizelka odblaskowa',
['bullet_wear'] = 'kamizelka kuloodporna',
['no_outfit'] = 'brak ubrania',
['open_cloackroom'] = 'naciśnij ~INPUT_CONTEXT~ aby zmienić ~y~ubranie~s~.',
-- Armory
['remove_object'] = 'weź przedmiot',
['deposit_object'] = 'zdeponuj przedmiot',
['get_weapon'] = 'weź broń',
['put_weapon'] = 'odłóż broń',
['buy_weapons'] = 'kup Broń',
['armory'] = 'zbrojownia',
['open_armory'] = 'naciśnij ~INPUT_CONTEXT~ żeby uzyskać dostęp do zbrojowni',
['armory_owned'] = 'owned',
['armory_free'] = 'free',
['armory_item'] = '$%s',
['armory_weapontitle'] = 'armory - Buy weapon',
['armory_componenttitle'] = 'armory - Weapon attatchments',
['armory_bought'] = 'you bought an ~y~%s~s~ for ~g~$%s~s~',
['armory_money'] = 'you cannot afford that weapon',
['armory_hascomponent'] = 'you have that attatchment equiped!',
['get_weapon_menu'] = 'armory - Withdraw Weapon',
['put_weapon_menu'] = 'armory - Store Weapon',
-- Vehicles
['vehicle_menu'] = 'vehicle',
['vehicle_blocked'] = 'all available spawn points are currently blocked!',
['garage_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Vehicle Actions~s~.',
['garage_title'] = 'vehicle Actions',
['garage_stored'] = 'stored',
['garage_notstored'] = 'not in garage',
['garage_storing'] = 'we\'re attempting to remove the vehicle, make sure no players are around it.',
['garage_has_stored'] = 'the vehicle has been stored in your garage',
['garage_has_notstored'] = 'no nearby owned vehicles were found',
['garage_notavailable'] = 'your vehicle is not stored in the garage.',
['garage_blocked'] = 'there\'s no available spawn points!',
['garage_empty'] = 'you dont have any vehicles in your garage.',
['garage_released'] = 'your vehicle has been released from the garage.',
['garage_store_nearby'] = 'there is no nearby vehicles.',
['garage_storeditem'] = 'open garage',
['garage_storeitem'] = 'store vehicle in garage',
['garage_buyitem'] = 'vehicle shop',
['garage_notauthorized'] = 'you\'re not authorized to buy this kind of vehicles.',
['helicopter_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Helicopter Actions~s~.',
['shop_item'] = '$%s',
['vehicleshop_title'] = 'vehicle Shop',
['vehicleshop_confirm'] = 'do you want to buy this vehicle?',
['vehicleshop_bought'] = 'you have bought ~y~%s~s~ for ~r~$%s~s~',
['vehicleshop_money'] = 'you cannot afford that vehicle',
['vehicleshop_awaiting_model'] = 'the vehicle is currently ~g~DOWNLOADING & LOADING~s~ please wait',
['confirm_no'] = 'no',
['confirm_yes'] = 'yes',
-- Service
['service_max'] = 'nie możesz wejść do służby, maksymalna liczba oficerów w służbie: %s/%s',
['service_not'] = 'nie rozpoczynasz służby! Najpierw musisz się przebrać.',
['service_anonunce'] = 'informacje o służbie',
['service_in'] = 'rozpoczynasz służbe, Witaj!',
['service_in_announce'] = 'operator ~y~%s~s~ rozpoczyna służbę!',
['service_out'] = 'opuszczasz służbę.',
['service_out_announce'] = 'operator ~y~%s~s~ opuszcza służbe.',
-- Action Menu
['citizen_interaction'] = 'interakcja z cywilami',
['vehicle_interaction'] = 'interakcja z pojazdami',
['object_spawner'] = 'przedmioty do postawienia',
['id_card'] = 'dowód osobisty',
['search'] = 'przeszukaj',
['handcuff'] = 'zakuj/Rozkuj Kajdanki ',
['drag'] = 'przemieść podejrzanego',
['put_in_vehicle'] = 'wsadź do pojazdu',
['out_the_vehicle'] = 'wyciągnij z pojazdu',
['fine'] = 'mandaty',
['unpaid_bills'] = 'zarządzaj niezapłaconymi rachunkami',
['license_check'] = 'zarządzaj licencjami',
['license_revoke'] = 'unieważnij licencje',
['license_revoked'] = 'twoja licencja ~b~%s~s~ została ~y~unieważniona~s~!',
['licence_you_revoked'] = 'unieważniasz ~b~%s~s~ które należały do ~y~%s~s~',
['no_players_nearby'] = 'brak graczy w pobliżu',
['being_searched'] = 'you are being ~y~searched~s~ by the ~b~Police~s~',
-- Vehicle interaction
['vehicle_info'] = 'informacje o pojeździe',
['pick_lock'] = 'odblokuj pojazd',
['vehicle_unlocked'] = 'pojazd ~g~Odblokowany~s~',
['no_vehicles_nearby'] = 'brak pojazdu w pobliżu',
['impound'] = 'zajmij pojazd',
['impound_prompt'] = 'naciśnij ~INPUT_CONTEXT~ żeby unieważnić ~y~zajęcie~s~',
['impound_canceled'] = 'unieważniasz zajęcie',
['impound_canceled_moved'] = 'zajęcie zostało anulowane, ponieważ pojazd przemieścił się',
['impound_successful'] = 'zajmujesz pojazd',
['search_database'] = 'informacje o pojeździe',
['search_database_title'] = 'informacjeo pojeździe - przeszukaj używając numeru rejestracyjnego',
['search_database_error_invalid'] = 'to ~r~nie~s~ jest ~y~poprawny~s~ rnumer rejestracyjny',
-- Traffic interaction
['traffic_interaction'] = 'interakcje dla ruchu drogowego',
['cone'] = 'pachołek',
['barrier'] = 'barierka',
['spikestrips'] = 'kolczatka',
['box'] = 'pudła',
['cash'] = 'paleta z pieniędzmi',
-- ID Card Menu
['name'] = 'name: %s',
['job'] = 'praca: %s',
['sex'] = 'płeć: %s',
['dob'] = 'data urodzenia: %s',
['height'] = 'wzrost: %s',
['bac'] = 'BAC: %s',
['unknown'] = 'nieznany',
['male'] = 'mężczyzna',
['female'] = 'kobieta',
-- Body Search Menu
['guns_label'] = '--- Bronie ---',
['inventory_label'] = '--- Ekwipunek ---',
['license_label'] = ' --- Licenses ---',
['confiscate'] = 'skonfiskuj %s',
['confiscate_weapon'] = 'skonfiskuj %s z %s kulami',
['confiscate_inv'] = 'skonfiskuj %s x %s',
['confiscate_dirty'] = 'skonfiskuj brudne pieniądze: <span style="color:red;">$%s</span>',
['you_confiscated'] = 'skonfiskowałeś ~y~%sx~s~ ~b~%s~s~ od ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ zostały skonfiskowane przez ~y~%s~s~',
['you_confiscated_account'] = 'skonfiskowałeś ~g~%s$~s~ (%s) od ~b~%s~s~',
['got_confiscated_account'] = '~g~%s$~s~ (%s) zostały skonfiskowane przez ~y~%s~s~',
['you_confiscated_weapon'] = 'skonfiskowałeś ~b~%s~s~ od ~b~%s~s~ z ~o~%s~s~ pociskami',
['got_confiscated_weapon'] = 'twój ~b~%s~s~ z ~o~%s~s~ kulami został skonfiskowany przez ~y~%s~s~',
['traffic_offense'] = 'wykroczenia drogowe',
['minor_offense'] = 'niewielkie wykroczenia',
['average_offense'] = 'średnie wykroczenia',
['major_offense'] = 'duże wykroczenia',
['fine_total'] = 'mandat: %s',
-- Vehicle Info Menu
['plate'] = 'tablica rejestracyjna: %s',
['owner_unknown'] = 'właściciel: Nieznany',
['owner'] = 'właściciel: %s',
-- Boss Menu
['open_bossmenu'] = 'naciśnij ~INPUT_CONTEXT~ aby otworzyć menu',
['quantity_invalid'] = 'nieprawidłowa ilość',
['have_withdrawn'] = 'wyjmujesz z depozytu ~y~%sx~s~ ~b~%s~s~',
['have_deposited'] = 'zdeponowano ~y~%sx~s~ ~b~%s~s~',
['quantity'] = 'ilość',
['inventory'] = 'ekwipunek',
['police_stock'] = 'zapasy policji',
-- Misc
['remove_prop'] = 'naciśnij ~INPUT_CONTEXT~ aby usunąć ten obiekt',
['map_blip'] = 'komisariat Policji',
['unrestrained_timer'] = 'czujesz, że twoje kajdanki powoli tracą przyczepność i znikają.',
-- Notifications
['alert_police'] = 'ostrzeż policję',
['phone_police'] = 'police',
}
-151
View File
@@ -1,151 +0,0 @@
Translations = {
-- Cloakroom
['cloakroom'] = 'omklädningsrum',
['citizen_wear'] = 'civila kläder',
['police_wear'] = 'polisuniform',
['gilet_wear'] = 'reflektiv väst',
['bullet_wear'] = 'skottsäker väst',
['no_outfit'] = 'det finns ingen uniform som passar dig!',
['open_cloackroom'] = 'tryck ~INPUT_CONTEXT~ för att välja ~y~kläder~s~.',
-- Armory
['remove_object'] = 'ta ut objekt',
['deposit_object'] = 'lägg in objekt',
['get_weapon'] = 'ta ut vapen',
['put_weapon'] = 'lägg in vapen',
['buy_weapons'] = 'köp vapen',
['armory'] = 'vapenförråd',
['open_armory'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~vapenförrådet~s~.',
['armory_owned'] = 'ägd',
['armory_free'] = 'gratis',
['armory_item'] = '%s SEK',
['armory_weapontitle'] = 'vapenförråd - Köp vapen',
['armory_componenttitle'] = 'vapenförråd - Vapen tillbehör',
['armory_bought'] = 'du köpte ~y~%s~s~ för ~g~%s SEK~s~',
['armory_money'] = 'du har inte råd med det vapnet',
['armory_hascomponent'] = 'du har redan det tillbehöret!',
['get_weapon_menu'] = 'vapenförråd - Ta ut vapen',
['put_weapon_menu'] = 'vapenförråd - Spara vapen',
-- Vehicles
['vehicle_menu'] = 'fordon',
['vehicle_blocked'] = 'det finns ingen tillgänglig plats att ställa ut fordonet på!',
['garage_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~garaget~s~.',
['garage_title'] = 'garage',
['garage_stored'] = 'inställt',
['garage_notstored'] = 'uttaget',
['garage_storing'] = 'vi håller på att ställa in ditt fordon, se till att ingen är i närheten.',
['garage_has_stored'] = 'fordonet har ställts in i garaget',
['garage_has_notstored'] = 'inget ägt fordon finns i närheten',
['garage_notavailable'] = 'ditt fordon är inte inställt i ditt garage.',
['garage_blocked'] = 'det finns ingen tillgänglig plats att ställa ut fordonet på!',
['garage_empty'] = 'du har inga fordon i ditt garage.',
['garage_released'] = 'ditt fordon har tagits ut från garaget.',
['garage_store_nearby'] = 'det finns inget fordon i närheten.',
['garage_storeditem'] = 'öppna garage',
['garage_storeitem'] = 'ställ in fordon',
['garage_buyitem'] = 'fordonshandel',
['garage_notauthorized'] = 'du har inte tillgång till att köpa dessa fordon.',
['helicopter_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~helikoptergaraget~s~.',
['shop_item'] = '%s SEK',
['vehicleshop_title'] = 'fordonshandel',
['vehicleshop_confirm'] = 'vill du köpa detta fordon?',
['vehicleshop_bought'] = 'du köpte ~y~%s~s~ för ~g~%s SEK~s~',
['vehicleshop_money'] = 'du har inte råd med detta fordon',
['vehicleshop_awaiting_model'] = 'fordonet ~g~LADDAS NED OCH LADDAS IN~s~ var god vänta',
['confirm_no'] = 'nej',
['confirm_yes'] = 'ja',
-- Service
['service_max'] = 'du kan inte gå tjänst, poliser i tjänst: %s/%s',
['service_not'] = 'du är inte i tjänst! Byt om för att gå in i tjänst.',
['service_anonunce'] = 'tjänsteinformation',
['service_in'] = 'du deltog i tjänst, välkommen!',
['service_in_announce'] = 'operatör ~y~%s~s~ har deltagit tjänst!',
['service_out'] = 'du har lämnat tjänst.',
['service_out_announce'] = 'operatör ~y~%s~s~ har lämnat deras tjänst.',
-- Action Menu
['citizen_interaction'] = 'handlingar mot civila',
['vehicle_interaction'] = 'handlingar på bilar',
['object_spawner'] = 'ta fram ett objekt',
['id_card'] = 'ID-Kort',
['search'] = 'sök igenom',
['handcuff'] = 'handbojor',
['drag'] = 'dra',
['put_in_vehicle'] = 'sätt in i fordon',
['out_the_vehicle'] = 'dra ut ur fordon',
['fine'] = 'Ge böter',
['unpaid_bills'] = 'se obetalda räkningar',
['license_check'] = 'se licenser',
['license_revoke'] = 'återkalla licenser',
['license_revoked'] = 'ditt ~b~%s~s~ har blivit ~y~återkallat~s~!',
['licence_you_revoked'] = 'du återkallade ett ~b~%s~s~ som tillhörde ~y~%s~s~',
['no_players_nearby'] = 'det finns ingen i närheten',
['being_searched'] = 'du blir ~y~visiterad~s~ av ~b~Polisen~s~',
-- Vehicle interaction
['vehicle_info'] = 'fordon',
['pick_lock'] = 'bryt upp fordon',
['vehicle_unlocked'] = 'fordonet har ~g~låsts upp~s~',
['no_vehicles_nearby'] = 'inga fordon i närheten',
['impound'] = 'bärga fordonet',
['impound_prompt'] = 'tryck ~INPUT_CONTEXT~ för att avbryta ~y~bärgningen~s~',
['impound_canceled'] = 'du avbröt bärgningen',
['impound_canceled_moved'] = 'bärgningen avbröts på grund av att fordonet har rört sig',
['impound_successful'] = 'du har bärgat fordonet',
['search_database'] = 'fordonsuppgifter',
['search_database_title'] = 'fordonsuppgifter - sök med registreringsnummer',
['search_database_error_invalid'] = 'det är ~r~inte~s~ ett ~y~giltigt~s~ registreringsnummer',
-- Traffic interaction
['traffic_interaction'] = 'trafiksåtgärder',
['cone'] = 'kon',
['barrier'] = 'barriär',
['spikestrips'] = 'spikmatta',
['box'] = 'låda',
['cash'] = 'låda med pengar',
-- ID Card Menu
['name'] = 'namn: %s',
['job'] = 'jobb: %s',
['sex'] = 'kön: %s',
['dob'] = 'födelsedatum: %s',
['height'] = 'längd: %s',
['bac'] = 'alkohol i blodet: %s',
['unknown'] = 'okänt',
['male'] = 'man',
['female'] = 'kvinna',
-- Body Search Menu
['guns_label'] = '--- Vapen ---',
['inventory_label'] = '--- Inventory ---',
['license_label'] = ' --- Licenser ---',
['confiscate'] = 'beslagta %s',
['confiscate_weapon'] = 'beslagta %s med %s skott',
['confiscate_inv'] = 'beslagta %sx %s',
['confiscate_dirty'] = 'beslagta svarta pengar: <span style="color:red;">%s SEK</span>',
['you_confiscated'] = 'du beslagtog ~y~%sx~s~ ~b~%s~s~ från ~b~%s~s~',
['got_confiscated'] = '~y~%sx~s~ ~b~%s~s~ beslagtogs av ~y~%s~s~',
['you_confiscated_account'] = 'du beslagtog ~g~%s SEK~s~ (%s) från ~b~%s~s~',
['got_confiscated_account'] = '~g~%s SEK~s~ (%s) beslagtogs av ~y~%s~s~',
['you_confiscated_weapon'] = 'du beslagtog ~b~%s~s~ från ~b~%s~s~ med ~o~%s~s~ skott',
['got_confiscated_weapon'] = 'din ~b~%s~s~ med ~o~%s~s~ skott beslagtogs av ~y~%s~s~',
['traffic_offense'] = 'brott mot trafikregler',
['minor_offense'] = 'mindre lagbrott',
['average_offense'] = 'medel lagbrott',
['major_offense'] = 'grovt lagbrott',
['fine_total'] = 'böter: %s',
-- Vehicle Info Menu
['plate'] = 'reg nummer: %s',
['owner_unknown'] = 'ägare: Okänt',
['owner'] = 'ägare: %s',
-- Boss Menu
['open_bossmenu'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn',
['quantity_invalid'] = 'otillgängligt antal',
['have_withdrawn'] = 'du har tagit ut ~y~x%s~s~ ~b~%s~s~',
['have_deposited'] = 'du har lagrat ~y~x%s~s~ ~b~%s~s~',
['quantity'] = 'antal',
['inventory'] = 'förråd',
['police_stock'] = 'polisförråd',
-- Misc
['remove_prop'] = 'tryck ~INPUT_CONTEXT~ för att ta bort objektet',
['map_blip'] = 'polisstation',
['unrestrained_timer'] = 'dina handklovar har försvunnit',
-- Notifications
['alert_police'] = 'meddela polisen',
['phone_police'] = 'polisen',
}
-89
View File
@@ -1,89 +0,0 @@
USE `es_extended`;
INSERT INTO `addon_account` (name, label, shared) VALUES
('society_police', 'Police', 1)
;
INSERT INTO `datastore` (name, label, shared) VALUES
('society_police', 'Police', 1)
;
INSERT INTO `addon_inventory` (name, label, shared) VALUES
('society_police', 'Police', 1)
;
INSERT INTO `jobs` (name, label) VALUES
('police', 'LSPD')
;
INSERT INTO `job_grades` (job_name, grade, name, label, salary, skin_male, skin_female) VALUES
('police',0,'recruit','Recrue',20,'{}','{}'),
('police',1,'officer','Officier',40,'{}','{}'),
('police',2,'sergeant','Sergent',60,'{}','{}'),
('police',3,'lieutenant','Lieutenant',85,'{}','{}'),
('police',4,'boss','Commandant',100,'{}','{}')
;
CREATE TABLE `fine_types` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`label` varchar(255) DEFAULT NULL,
`amount` int(11) DEFAULT NULL,
`category` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `fine_types` (label, amount, category) VALUES
('Usage abusif du klaxon',30,0),
('Franchir une ligne continue',40,0),
('Circulation à contresens',250,0),
('Demi-tour non autorisé',250,0),
('Circulation hors-route',170,0),
('Non-respect des distances de sécurité',30,0),
('Arrêt dangereux / interdit',150,0),
('Stationnement gênant / interdit',70,0),
('Non respect de la priorité à droite',70,0),
('Non-respect à un véhicule prioritaire',90,0),
('Non-respect d\'un stop',105,0),
('Non-respect d\'un feu rouge',130,0),
('Dépassement dangereux',100,0),
('Véhicule non en état',100,0),
('Conduite sans permis',1500,0),
('Délit de fuite',800,0),
('Excès de vitesse < 5 kmh',90,0),
('Excès de vitesse 5-15 kmh',120,0),
('Excès de vitesse 15-30 kmh',180,0),
('Excès de vitesse > 30 kmh',300,0),
('Entrave de la circulation',110,1),
('Dégradation de la voie publique',90,1),
('Trouble à l\'ordre publique',90,1),
('Entrave opération de police',130,1),
('Insulte envers / entre civils',75,1),
('Outrage à agent de police',110,1),
('Menace verbale ou intimidation envers civil',90,1),
('Menace verbale ou intimidation envers policier',150,1),
('Manifestation illégale',250,1),
('Tentative de corruption',1500,1),
('Arme blanche sortie en ville',120,2),
('Arme léthale sortie en ville',300,2),
('Port d\'arme non autorisé (défaut de license)',600,2),
('Port d\'arme illégal',700,2),
('Pris en flag lockpick',300,2),
('Vol de voiture',1800,2),
('Vente de drogue',1500,2),
('Fabriquation de drogue',1500,2),
('Possession de drogue',650,2),
('Prise d\'ôtage civil',1500,2),
('Prise d\'ôtage agent de l\'état',2000,2),
('Braquage particulier',650,2),
('Braquage magasin',650,2),
('Braquage de banque',1500,2),
('Tir sur civil',2000,3),
('Tir sur agent de l\'état',2500,3),
('Tentative de meurtre sur civil',3000,3),
('Tentative de meurtre sur agent de l\'état',5000,3),
('Meurtre sur civil',10000,3),
('Meurte sur agent de l\'état',30000,3),
('Meurtre involontaire',1800,3),
('Escroquerie à l\'entreprise',2000,2)
;
-515
View File
@@ -1,515 +0,0 @@
local self = ESX.Modules['job_police']
RegisterNetEvent('esx_policejob:confiscatePlayerItem')
AddEventHandler('esx_policejob:confiscatePlayerItem', function(target, itemType, itemName, amount)
local _source = source
local sourceXPlayer = ESX.GetPlayerFromId(_source)
local targetXPlayer = ESX.GetPlayerFromId(target)
if sourceXPlayer.job.name ~= 'police' then
print(('esx_policejob: %s attempted to confiscate!'):format(xPlayer.identifier))
return
end
if itemType == 'item_standard' then
local targetItem = targetXPlayer.getInventoryItem(itemName)
local sourceItem = sourceXPlayer.getInventoryItem(itemName)
-- does the target player have enough in their inventory?
if targetItem.count > 0 and targetItem.count <= amount then
-- can the player carry the said amount of x item?
if sourceXPlayer.canCarryItem(itemName, sourceItem.count) then
targetXPlayer.removeInventoryItem(itemName, amount)
sourceXPlayer.addInventoryItem (itemName, amount)
sourceXPlayer.showNotification(_U('you_confiscated', amount, sourceItem.label, targetXPlayer.name))
targetXPlayer.showNotification(_U('got_confiscated', amount, sourceItem.label, sourceXPlayer.name))
else
sourceXPlayer.showNotification(_U('quantity_invalid'))
end
else
sourceXPlayer.showNotification(_U('quantity_invalid'))
end
elseif itemType == 'item_account' then
targetXPlayer.removeAccountMoney(itemName, amount)
sourceXPlayer.addAccountMoney (itemName, amount)
sourceXPlayer.showNotification(_U('you_confiscated_account', amount, itemName, targetXPlayer.name))
targetXPlayer.showNotification(_U('got_confiscated_account', amount, itemName, sourceXPlayer.name))
elseif itemType == 'item_weapon' then
if amount == nil then amount = 0 end
targetXPlayer.removeWeapon(itemName, amount)
sourceXPlayer.addWeapon (itemName, amount)
sourceXPlayer.showNotification(_U('you_confiscated_weapon', ESX.GetWeaponLabel(itemName), targetXPlayer.name, amount))
targetXPlayer.showNotification(_U('got_confiscated_weapon', ESX.GetWeaponLabel(itemName), amount, sourceXPlayer.name))
end
end)
RegisterNetEvent('esx_policejob:handcuff')
AddEventHandler('esx_policejob:handcuff', function(target)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'police' then
TriggerClientEvent('esx_policejob:handcuff', target)
else
print(('esx_policejob: %s attempted to handcuff a player (not cop)!'):format(xPlayer.identifier))
end
end)
RegisterNetEvent('esx_policejob:drag')
AddEventHandler('esx_policejob:drag', function(target)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'police' then
TriggerClientEvent('esx_policejob:drag', target, source)
else
print(('esx_policejob: %s attempted to drag (not cop)!'):format(xPlayer.identifier))
end
end)
RegisterNetEvent('esx_policejob:putInVehicle')
AddEventHandler('esx_policejob:putInVehicle', function(target)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'police' then
TriggerClientEvent('esx_policejob:putInVehicle', target)
else
print(('esx_policejob: %s attempted to put in vehicle (not cop)!'):format(xPlayer.identifier))
end
end)
RegisterNetEvent('esx_policejob:OutVehicle')
AddEventHandler('esx_policejob:OutVehicle', function(target)
local xPlayer = ESX.GetPlayerFromId(source)
if xPlayer.job.name == 'police' then
TriggerClientEvent('esx_policejob:OutVehicle', target)
else
print(('esx_policejob: %s attempted to drag out from vehicle (not cop)!'):format(xPlayer.identifier))
end
end)
RegisterNetEvent('esx_policejob:getStockItem')
AddEventHandler('esx_policejob:getStockItem', function(itemName, count)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
local inventoryItem = inventory.getItem(itemName)
-- is there enough in the society?
if count > 0 and inventoryItem.count >= count then
-- can the player carry the said amount of x item?
if xPlayer.canCarryItem(itemName, count) then
inventory.removeItem(itemName, count)
xPlayer.addInventoryItem(itemName, count)
xPlayer.showNotification(_U('have_withdrawn', count, inventoryItem.label))
else
xPlayer.showNotification(_U('quantity_invalid'))
end
else
xPlayer.showNotification(_U('quantity_invalid'))
end
end)
end)
RegisterNetEvent('esx_policejob:putStockItems')
AddEventHandler('esx_policejob:putStockItems', function(itemName, count)
local xPlayer = ESX.GetPlayerFromId(source)
local sourceItem = xPlayer.getInventoryItem(itemName)
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
local inventoryItem = inventory.getItem(itemName)
-- does the player have enough of the item?
if sourceItem.count >= count and count > 0 then
xPlayer.removeInventoryItem(itemName, count)
inventory.addItem(itemName, count)
xPlayer.showNotification(_U('have_deposited', count, inventoryItem.label))
else
xPlayer.showNotification(_U('quantity_invalid'))
end
end)
end)
ESX.RegisterServerCallback('esx_policejob:getOtherPlayerData', function(source, cb, target, notify)
local xPlayer = ESX.GetPlayerFromId(target)
if notify then
xPlayer.showNotification(_U('being_searched'))
end
if xPlayer then
local data = {
name = xPlayer.getName(),
job = xPlayer.job.label,
grade = xPlayer.job.grade_label,
inventory = xPlayer.getInventory(),
accounts = xPlayer.getAccounts(),
weapons = xPlayer.getLoadout()
}
if self.Config.EnableESXIdentity then
data.dob = xPlayer.get('dateofbirth')
data.height = xPlayer.get('height')
if xPlayer.get('sex') == 'm' then data.sex = 'male' else data.sex = 'female' end
end
TriggerEvent('esx_status:getStatus', target, 'drunk', function(status)
if status then
data.drunk = ESX.Math.Round(status.percent)
end
if self.Config.EnableLicenses then
TriggerEvent('esx_license:getLicenses', target, function(licenses)
data.licenses = licenses
cb(data)
end)
else
cb(data)
end
end)
end
end)
ESX.RegisterServerCallback('esx_policejob:getFineList', function(source, cb, category)
MySQL.Async.fetchAll('SELECT * FROM fine_types WHERE category = @category', {
['@category'] = category
}, function(fines)
cb(fines)
end)
end)
ESX.RegisterServerCallback('esx_policejob:getVehicleInfos', function(source, cb, plate)
MySQL.Async.fetchAll('SELECT owner FROM owned_vehicles WHERE plate = @plate', {
['@plate'] = plate
}, function(result)
local retrivedInfo = {plate = plate}
if result[1] then
local xPlayer = ESX.GetPlayerFromIdentifier(result[1].owner)
-- is the owner online?
if xPlayer then
retrivedInfo.owner = xPlayer.getName()
cb(retrivedInfo)
elseif self.Config.EnableESXIdentity then
MySQL.Async.fetchAll('SELECT firstname, lastname FROM users WHERE identifier = @identifier', {
['@identifier'] = result[1].owner
}, function(result2)
if result2[1] then
retrivedInfo.owner = ('%s %s'):format(result2[1].firstname, result2[1].lastname)
cb(retrivedInfo)
else
cb(retrivedInfo)
end
end)
else
cb(retrivedInfo)
end
else
cb(retrivedInfo)
end
end)
end)
ESX.RegisterServerCallback('esx_policejob:getArmoryWeapons', function(source, cb)
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
local weapons = store.get('weapons')
if weapons == nil then
weapons = {}
end
cb(weapons)
end)
end)
ESX.RegisterServerCallback('esx_policejob:addArmoryWeapon', function(source, cb, weaponName, removeWeapon)
local xPlayer = ESX.GetPlayerFromId(source)
if removeWeapon then
xPlayer.removeWeapon(weaponName)
end
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
local weapons = store.get('weapons') or {}
local foundWeapon = false
for i=1, #weapons, 1 do
if weapons[i].name == weaponName then
weapons[i].count = weapons[i].count + 1
foundWeapon = true
break
end
end
if not foundWeapon then
table.insert(weapons, {
name = weaponName,
count = 1
})
end
store.set('weapons', weapons)
cb()
end)
end)
ESX.RegisterServerCallback('esx_policejob:removeArmoryWeapon', function(source, cb, weaponName)
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.addWeapon(weaponName, 500)
TriggerEvent('esx_datastore:getSharedDataStore', 'society_police', function(store)
local weapons = store.get('weapons') or {}
local foundWeapon = false
for i=1, #weapons, 1 do
if weapons[i].name == weaponName then
weapons[i].count = (weapons[i].count > 0 and weapons[i].count - 1 or 0)
foundWeapon = true
break
end
end
if not foundWeapon then
table.insert(weapons, {
name = weaponName,
count = 0
})
end
store.set('weapons', weapons)
cb()
end)
end)
ESX.RegisterServerCallback('esx_policejob:buyWeapon', function(source, cb, weaponName, type, componentNum)
local xPlayer = ESX.GetPlayerFromId(source)
local authorizedWeapons = {}
for i=1, xPlayer.job.grade, 1 do
local weapons = self.Config.AuthorizedWeapons[i]
for j=1, #weapons, 1 do
authorizedWeapons[#authorizedWeapons + 1] = weapons[j]
end
end
for k,v in ipairs(authorizedWeapons) do
if v.weapon == weaponName then
selectedWeapon = v
break
end
end
if not selectedWeapon then
print(('esx_policejob: %s attempted to buy an invalid weapon.'):format(xPlayer.identifier))
cb(false)
else
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_police', function(account)
-- Weapon
if type == 1 then
if account.money >= selectedWeapon.price then
account.removeMoney(selectedWeapon.price)
xPlayer.addWeapon(weaponName, 100)
cb(true)
else
cb(false)
end
-- Weapon Component
elseif type == 2 then
local price = selectedWeapon.components[componentNum]
local weaponNum, weapon = ESX.GetWeapon(weaponName)
local component = weapon.components[componentNum]
if component then
if account.money >= price then
account.removeMoney(price)
xPlayer.addWeaponComponent(weaponName, component.name)
cb(true)
else
cb(false)
end
else
print(('esx_policejob: %s attempted to buy an invalid weapon component.'):format(xPlayer.identifier))
cb(false)
end
end
end)
end
end)
ESX.RegisterServerCallback('esx_policejob:canBuyVehicle', function(source, cb, model, type)
local xPlayer = ESX.GetPlayerFromId(source)
local price = self.GetPriceFromHash(GetHashKey(model), xPlayer.job.grade, type)
-- vehicle model not found
if price == -1 then
cb(false)
else
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_police', function(account)
if account.money >= price then
cb(true)
else
cb(false)
end
end)
end
end)
RegisterNetEvent('esx_policejob:buyJobVehicle')
AddEventHandler('esx_policejob:buyJobVehicle', function(vehicleProps, type)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
local price = self.GetPriceFromHash(vehicleProps.model, xPlayer.job.grade, type)
-- vehicle model not found
if price == -1 then
print(('esx_policejob: %s attempted to exploit the shop! (invalid vehicle model)'):format(xPlayer.identifier))
else
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_police', function(account)
if account.money >= price then
account.removeMoney(price)
MySQL.Async.execute('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (@owner, @vehicle, @plate, @type, @job, @stored)', {
['@owner'] = xPlayer.identifier,
['@vehicle'] = json.encode(vehicleProps),
['@plate'] = vehicleProps.plate,
['@type'] = type,
['@job'] = xPlayer.job.name,
['@stored'] = true
})
else
print(('esx_policejob: %s attempted to exploit the shop! (not enough money)'):format(xPlayer.identifier))
end
end)
end
end)
ESX.RegisterServerCallback('esx_policejob:storeNearbyVehicle', function(source, cb, nearbyVehicles)
local xPlayer = ESX.GetPlayerFromId(source)
local foundPlate, foundNum
for k,v in ipairs(nearbyVehicles) do
local result = MySQL.Sync.fetchAll('SELECT plate FROM owned_vehicles WHERE owner = @owner AND plate = @plate AND job = @job', {
['@owner'] = xPlayer.identifier,
['@plate'] = v.plate,
['@job'] = xPlayer.job.name
})
if result[1] then
foundPlate, foundNum = result[1].plate, k
break
end
end
if not foundPlate then
cb(false)
else
MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = true WHERE owner = @owner AND plate = @plate AND job = @job', {
['@owner'] = xPlayer.identifier,
['@plate'] = foundPlate,
['@job'] = xPlayer.job.name
}, function (rowsChanged)
if rowsChanged == 0 then
print(('esx_policejob: %s has exploited the garage!'):format(xPlayer.identifier))
cb(false)
else
cb(true, foundNum)
end
end)
end
end)
ESX.RegisterServerCallback('esx_policejob:getStockItems', function(source, cb)
TriggerEvent('esx_addoninventory:getSharedInventory', 'society_police', function(inventory)
cb(inventory.items)
end)
end)
ESX.RegisterServerCallback('esx_policejob:getPlayerInventory', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
local items = xPlayer.inventory
cb({items = items})
end)
AddEventHandler('playerDropped', function()
-- Save the source in case we lose it (which happens a lot)
local playerId = source
-- Did the player ever join?
if playerId then
local xPlayer = ESX.GetPlayerFromId(playerId)
-- Is it worth telling all clients to refresh?
if xPlayer and xPlayer.job.name == 'police' then
Citizen.Wait(5000)
TriggerClientEvent('esx_policejob:updateBlip', -1)
end
end
end)
RegisterNetEvent('esx_policejob:spawned')
AddEventHandler('esx_policejob:spawned', function()
local xPlayer = ESX.GetPlayerFromId(playerId)
if xPlayer and xPlayer.job.name == 'police' then
Citizen.Wait(5000)
TriggerClientEvent('esx_policejob:updateBlip', -1)
end
end)
RegisterNetEvent('esx_policejob:forceBlip')
AddEventHandler('esx_policejob:forceBlip', function()
TriggerClientEvent('esx_policejob:updateBlip', -1)
end)
AddEventHandler('onResourceStart', function(resource)
if resource == GetCurrentResourceName() then
Citizen.Wait(5000)
TriggerClientEvent('esx_policejob:updateBlip', -1)
end
end)
AddEventHandler('onResourceStop', function(resource)
if resource == GetCurrentResourceName() then
TriggerEvent('esx_phone:removeNumber', 'police')
end
end)
-8
View File
@@ -1,8 +0,0 @@
local self = ESX.Modules['job_police']
if self.Config.EnableESXService then
TriggerEvent('esx_service:activateService', 'police', self.Config.MaxInService)
end
TriggerEvent('esx_society:registerSociety', 'police', 'Police', 'society_police', 'society_police', 'society_police', {type = 'public'})
TriggerEvent('esx_phone:registerNumber', 'police', _U('alert_police'), true, true)
-31
View File
@@ -1,31 +0,0 @@
ESX.Modules['job_police'] = {};
local self = ESX.Modules['job_police']
-- Properties
self.Config = ESX.EvalFile(GetCurrentResourceName(), 'modules/job_police/data/config.lua', {
vector3 = vector3
})['Config']
self.GetPriceFromHash = function(vehicleHash, jobGrade, type)
local authorizedVehicles = {}
for i=1, jobGrade, 1 do
local vehicles = self.Config.AuthorizedVehicles[type][i]
for j=1, #vehicles, 1 do
authorizedVehicles[#authorizedVehicles + 1] = vehicles[j]
end
end
for k,v in ipairs(authorizedVehicles) do
if GetHashKey(v.model) == vehicleHash then
return v.price
end
end
return -1
end
-71
View File
@@ -1,71 +0,0 @@
local self = ESX.Modules['menu_default']
AddEventHandler('esx:nui_ready', function()
ESX.CreateFrame('menu_default', 'nui://' .. GetCurrentResourceName() .. '/modules/menu_default/data/html/ui.html')
end)
ESX.Modules['input'].On('pressed', 0, 18, function(lastTime)
if (GetGameTimer() - lastTime) < 150 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'ENTER'})
end)
ESX.Modules['input'].On('pressed', 0, 177, function(lastTime)
if (GetGameTimer() - lastTime) < 150 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'BACKSPACE'})
end)
ESX.Modules['input'].On('pressed', 0, 27, function(lastTime)
if (GetGameTimer() - lastTime) < 300 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'TOP'})
end)
ESX.Modules['input'].On('pressed', 0, 173, function(lastTime)
if (GetGameTimer() - lastTime) < 300 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'DOWN'})
end)
ESX.Modules['input'].On('pressed', 0, 174, function(lastTime)
if (GetGameTimer() - lastTime) < 300 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'LEFT'})
end)
ESX.Modules['input'].On('pressed', 0, 175, function(lastTime)
if (GetGameTimer() - lastTime) < 300 then return end
ESX.SendFrameMessage('menu_default', {action = 'controlPressed', control = 'RIGHT'})
end)
AddEventHandler('menu_default:message:menu_submit', function(data)
local menu = ESX.UI.Menu.GetOpened(self.MenuType, data._namespace, data._name)
if menu.submit ~= nil then
menu.submit(data, menu)
end
end)
AddEventHandler('menu_default:message:menu_cancel', function(data)
local menu = ESX.UI.Menu.GetOpened(self.MenuType, data._namespace, data._name)
if menu.cancel ~= nil then
menu.cancel(data, menu)
end
end)
AddEventHandler('menu_default:message:menu_change', function(data)
local menu = ESX.UI.Menu.GetOpened(self.MenuType, data._namespace, data._name)
for i=1, #data.elements, 1 do
menu.setElement(i, 'value', data.elements[i].value)
if data.elements[i].selected then
menu.setElement(i, 'selected', true)
else
menu.setElement(i, 'selected', false)
end
end
if menu.change ~= nil then
menu.change(data, menu)
end
end)
-11
View File
@@ -1,11 +0,0 @@
local self = ESX.Modules['menu_default']
ESX.UI.Menu.RegisterType(self.MenuType, self.OpenMenu, self.CloseMenu)
ESX.Modules['input'].RegisterControl(0, 18)
ESX.Modules['input'].RegisterControl(0, 177)
ESX.Modules['input'].RegisterControl(0, 27)
ESX.Modules['input'].RegisterControl(0, 173)
ESX.Modules['input'].RegisterControl(0, 174)
ESX.Modules['input'].RegisterControl(0, 175)
-26
View File
@@ -1,26 +0,0 @@
ESX.Modules['menu_default'] = {};
local self = ESX.Modules['menu_default']
self.GUI = {}
self.GUI.Time = 0
self.MenuType = 'default'
self.OpenMenu = function(namespace, name, data)
ESX.SendFrameMessage('menu_default', {
action = 'openMenu',
namespace = namespace,
name = name,
data = data
})
end
self.CloseMenu = function(namespace, name)
ESX.SendFrameMessage('menu_default', {
action = 'closeMenu',
namespace = namespace,
name = name,
data = data
})
end
@@ -1,197 +0,0 @@
@font-face {
font-family: bankgothic;
src: url('../fonts/bankgothic.ttf');
}
@font-face {
font-family: sweetsansprobold;
src: url('../fonts/SweetSansProBold.ttf');
}
@font-face {
font-family: sweetsansprothin;
src: url('../fonts/SweetSansProThin.ttf');
}
@font-face {
font-family: sweetsansprolight;
src: url('../fonts/SweetSansProLight.ttf');
}
.menu {
background-color: rgba(0, 0, 0, 0.6);
border-radius: 5px;
min-width: 400px;
color: #fff;
position: absolute;
}
.menu.align-left {
left: 40;
top: 50%;
transform: translate(0, -50%);
}
.menu.align-top-left {
left: 40;
top: 40;
}
.menu.align-top {
left: 50%;
top: 40;
transform: translate(-50%, 0);
}
.menu.align-top-right {
right: 10;
top: 40;
}
.menu.align-right {
right: 40;
top: 50%;
transform: translate(0, -50%);
}
.menu.align-bottom-right {
right: 40;
bottom: 40;
}
.menu.align-bottom {
left: 50%;
bottom: 40;
transform: translate(-50%, 0);
}
.menu.align-bottom-left {
left: 40;
bottom: 40;
}
.menu.align-center {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.menu .head {
height: 75px;
line-height: 75px;
background-color: rgba(0, 0, 0, 0.8);
background-image: url(../img/bg_brick.png);
background-size:cover ;
border-bottom: 0.5px dotted rgba(255, 255, 255, 0.4);
border-radius: 5px 5px 5px 5px;
font-family: sweetsansprolight;
text-align: center;
font-size: 1.8em;
text-transform: uppercase;
color: #fff;
animation: neon 5s linear infinite;
padding-bottom: 2px;
}
.menu .menu-items {
font-family: sweetsansprothin;
max-height: 600px;
overflow-y: auto;
border-radius: 5px 5px 5px 5px;
}
.menu .menu-items .menu-item {
border: 1px solid transparent;
height: 40px;
display: block;
background-color: rgba(0, 0, 0, 0.2);
height: 32px;
line-height: 32px;
color: #fff;
text-align: center;
}
.menu .menu-items .menu-item.selected {
background-color: rgba(0, 0, 0, 0.6);
border:1px solid rgba(11, 165, 239);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
.menu .menu-items .menu-item.selected:first-child {
background-color: rgba(0, 0, 0, 0.6);
border: 1px solid rgba(11, 165, 239);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
.menu .menu-items .menu-item.selected:last-child {
background-color: rgba(0, 0, 0, 0.6);
border: 1px solid rgba(11, 165, 239);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 40px rgba(255, 255, 255, 0.7);
}
::-webkit-scrollbar-thumb:hover {
-webkit-box-shadow: inset 0 0 50px rgba(8, 3, 87, 0.7);
}
@keyframes neon {
20%,
24%,
55% {
color: #111;
text-shadow: none;
}
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 5px #0ba5ef, 0 0 15px #0ba5ef, 0 0 20px #0ba5ef, 0 0 40px #0ba5ef, 0 0 60px #00aeff, 0 0 10px #0ba5ef, 0 0 98px #0ba5ef;
color: #6fc9f3;
}
}
@keyframes border-flicker {
0% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
2% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
4% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
8% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
70% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
100% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(16,134,232,0.73);
}
}
@@ -1,196 +0,0 @@
@font-face {
font-family: bankgothic;
src: url('../fonts/bankgothic.ttf');
}
@font-face {
font-family: sweetsansprobold;
src: url('../fonts/SweetSansProBold.ttf');
}
@font-face {
font-family: sweetsansprothin;
src: url('../fonts/SweetSansProThin.ttf');
}
@font-face {
font-family: sweetsansprolight;
src: url('../fonts/SweetSansProLight.ttf');
}
.menu {
background-color: rgba(255, 255, 255, 0.7);
border-radius: 5px;
min-width: 400px;
color: rgb(0, 0, 0);
position: absolute;
}
.menu.align-left {
left: 40;
top: 50%;
transform: translate(0, -50%);
}
.menu.align-top-left {
left: 40;
top: 40;
}
.menu.align-top {
left: 50%;
top: 40;
transform: translate(-50%, 0);
}
.menu.align-top-right {
right: 10;
top: 40;
}
.menu.align-right {
right: 40;
top: 50%;
transform: translate(0, -50%);
}
.menu.align-bottom-right {
right: 40;
bottom: 40;
}
.menu.align-bottom {
left: 50%;
bottom: 40;
transform: translate(-50%, 0);
}
.menu.align-bottom-left {
left: 40;
bottom: 40;
}
.menu.align-center {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.menu .head {
height: 75px;
line-height: 75px;
background-color: rgba(255, 255, 255, 0.8);
background-image: url(../img/bg_brick_white.png);
background-size:cover ;
border-bottom: 0.5px dotted rgba(255, 255, 255, 0.4);
border-radius: 5px 5px 5px 5px;
font-family: sweetsansprolight;
text-align: center;
font-size: 1.8em;
text-transform: uppercase;
color: rgb(219, 219, 219);
animation: neon 5s linear infinite;
padding-bottom: 2px;
}
.menu .menu-items {
font-family: sweetsansprothin;
max-height: 600px;
overflow-y: auto;
border-radius: 5px 5px 5px 5px;
}
.menu .menu-items .menu-item {
height: 40px;
display: block;
background-color: rgba(255, 255, 255, 0.6);
height: 32px;
line-height: 32px;
color: rgb(0, 0, 0);
text-align: center;
}
.menu .menu-items .menu-item.selected {
background-color: rgba(255, 255, 255, 0.9);
border:1px solid rgb(245, 13, 13);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
.menu .menu-items .menu-item.selected:first-child {
background-color: rgba(255, 255, 255, 0.7);
border:1px solid rgb(245, 13, 13);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
.menu .menu-items .menu-item.selected:last-child {
background-color: rgba(255, 255, 255, 0.7);
border:1px solid rgb(245, 13, 13);
border-radius: 5px 5px 5px 5px;
animation: border-flicker 4s linear infinite;
}
::-webkit-scrollbar {
width: 12px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 40px rgba(255, 255, 255, 0.7);
}
::-webkit-scrollbar-thumb:hover {
-webkit-box-shadow: inset 0 0 50px rgba(87, 3, 7, 0.7);
}
@keyframes neon {
20%,
24%,
55% {
color: #111;
text-shadow: none;
}
0%,
19%,
21%,
23%,
25%,
54%,
56%,
100% {
text-shadow: 0 0 5px #b80404, 0 0 15px #b80404, 0 0 20px #b80404, 0 0 40px #b80404, 0 0 60px #b80404, 0 0 10px #b80404, 0 0 98px #b80404;
color: #d30909;
}
}
@keyframes border-flicker {
0% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
2% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
4% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
8% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
70% {
opacity:0.8;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
100% {
opacity:1;
box-shadow: 0px 0px 8px 4px rgba(245, 13, 13,0.73);
}
}

Some files were not shown because too many files have changed in this diff Show More