mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-09-01 10:48:52 +00:00
Merge pull request #745 from ESX-Org/revert-737-develop
Revert "pt-PT Translation pt.lua"
This commit is contained in:
+4
-4
@@ -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
@@ -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
@@ -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"/> {{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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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();
|
||||
|
||||
})();
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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'] = '花園銀行',
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
local self = ESX.Modules['accessories']
|
||||
|
||||
self.Init()
|
||||
@@ -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
|
||||
@@ -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),
|
||||
}}
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -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~',
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
USE `es_extended`;
|
||||
|
||||
ALTER TABLE `users` ADD COLUMN `accessories` LONGTEXT NULL DEFAULT NULL;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['accessories']
|
||||
|
||||
@@ -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']
|
||||
|
||||
@@ -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`)
|
||||
);
|
||||
@@ -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)
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['addonaccount']
|
||||
|
||||
@@ -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
|
||||
@@ -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`)
|
||||
);
|
||||
@@ -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)
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['addoninventory']
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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`)
|
||||
);
|
||||
@@ -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)
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['datastore']
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
local self = ESX.Modules['hud']
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
ESX.Modules['hud'] = {};
|
||||
local self = ESX.Modules['hud']
|
||||
|
||||
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['hud']
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
local self = ESX.Modules['hud']
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
ESX.Modules['hud'] = {};
|
||||
local self = ESX.Modules['hud']
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
local self = ESX.Modules['input']
|
||||
@@ -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)
|
||||
@@ -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 +0,0 @@
|
||||
local self = ESX.Modules['input']
|
||||
@@ -1 +0,0 @@
|
||||
local self = ESX.Modules['input']
|
||||
@@ -1,2 +0,0 @@
|
||||
ESX.Modules['input'] = {}
|
||||
local self = ESX.Modules['input']
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -1,2 +0,0 @@
|
||||
local self = ESX.Modules['interact']
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
local self = ESX.Modules['interact']
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
ESX.Modules['interact'] = {};
|
||||
local self = ESX.Modules['interact']
|
||||
|
||||
@@ -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)
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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'] = '경찰',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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)
|
||||
;
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user