From 1f0a23516e9f47b57490fd11a316ace3058c585e Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 9 Jul 2025 21:31:55 +0200 Subject: [PATCH] ed --- resources/[housing]/brutal_housing/config.lua | 18 +- resources/[housing]/brutal_keys/.fxap | Bin 0 -> 178 bytes resources/[housing]/brutal_keys/README.md | 1 + resources/[housing]/brutal_keys/cl_utils.lua | 85 ++ .../[housing]/brutal_keys/client/client.lua | Bin 0 -> 15897 bytes .../[housing]/brutal_keys/client/desktop.ini | Bin 0 -> 246 bytes .../[housing]/brutal_keys/client/nui.lua | Bin 0 -> 1664 bytes resources/[housing]/brutal_keys/config.lua | 155 +++ .../brutal_keys/core/client-core.lua | 68 ++ .../[housing]/brutal_keys/core/desktop.ini | Bin 0 -> 246 bytes .../brutal_keys/core/server-core.lua | 271 +++++ resources/[housing]/brutal_keys/desktop.ini | Bin 0 -> 246 bytes .../[housing]/brutal_keys/fxmanifest.lua | 61 + .../brutal_keys/html/assets/basic_key.svg | 3 + .../brutal_keys/html/assets/basic_vehicle.svg | 3 + .../[housing]/brutal_keys/html/assets/bin.png | Bin 0 -> 7639 bytes .../brutal_keys/html/assets/desktop.ini | Bin 0 -> 246 bytes .../brutal_keys/html/assets/door_line.svg | 6 + .../[housing]/brutal_keys/html/assets/key.svg | 5 + .../brutal_keys/html/assets/panel_border.svg | 3 + .../brutal_keys/html/assets/people.png | Bin 0 -> 6950 bytes .../brutal_keys/html/assets/selected_key.svg | 3 + .../brutal_keys/html/assets/vehicle_key.svg | 12 + .../[housing]/brutal_keys/html/desktop.ini | Bin 0 -> 246 bytes .../[housing]/brutal_keys/html/index.html | 97 ++ .../[housing]/brutal_keys/html/script.js | 637 ++++++++++ .../[housing]/brutal_keys/html/style.css | 1032 +++++++++++++++++ .../[housing]/brutal_keys/locales/ar.json | 13 + .../[housing]/brutal_keys/locales/cs.json | 13 + .../[housing]/brutal_keys/locales/de.json | 13 + .../[housing]/brutal_keys/locales/desktop.ini | Bin 0 -> 246 bytes .../[housing]/brutal_keys/locales/en.json | 13 + .../[housing]/brutal_keys/locales/fr.json | 13 + .../[housing]/brutal_keys/locales/hu.json | 13 + .../[housing]/brutal_keys/locales/it.json | 13 + .../[housing]/brutal_keys/locales/nl.json | 13 + .../[housing]/brutal_keys/locales/pl.json | 13 + .../[housing]/brutal_keys/locales/pt.json | 13 + .../[housing]/brutal_keys/locales/ro.json | 13 + .../[housing]/brutal_keys/locales/ru.json | 13 + .../[housing]/brutal_keys/locales/sp.json | 13 + .../[housing]/brutal_keys/locales/sv.json | 13 + .../[housing]/brutal_keys/locales/tr.json | 13 + .../[housing]/brutal_keys/server/desktop.ini | Bin 0 -> 246 bytes .../[housing]/brutal_keys/server/server.lua | Bin 0 -> 14724 bytes resources/[housing]/brutal_keys/sv_utils.lua | 25 + 46 files changed, 2671 insertions(+), 9 deletions(-) create mode 100644 resources/[housing]/brutal_keys/.fxap create mode 100644 resources/[housing]/brutal_keys/README.md create mode 100644 resources/[housing]/brutal_keys/cl_utils.lua create mode 100644 resources/[housing]/brutal_keys/client/client.lua create mode 100644 resources/[housing]/brutal_keys/client/desktop.ini create mode 100644 resources/[housing]/brutal_keys/client/nui.lua create mode 100644 resources/[housing]/brutal_keys/config.lua create mode 100644 resources/[housing]/brutal_keys/core/client-core.lua create mode 100644 resources/[housing]/brutal_keys/core/desktop.ini create mode 100644 resources/[housing]/brutal_keys/core/server-core.lua create mode 100644 resources/[housing]/brutal_keys/desktop.ini create mode 100644 resources/[housing]/brutal_keys/fxmanifest.lua create mode 100644 resources/[housing]/brutal_keys/html/assets/basic_key.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/basic_vehicle.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/bin.png create mode 100644 resources/[housing]/brutal_keys/html/assets/desktop.ini create mode 100644 resources/[housing]/brutal_keys/html/assets/door_line.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/key.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/panel_border.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/people.png create mode 100644 resources/[housing]/brutal_keys/html/assets/selected_key.svg create mode 100644 resources/[housing]/brutal_keys/html/assets/vehicle_key.svg create mode 100644 resources/[housing]/brutal_keys/html/desktop.ini create mode 100644 resources/[housing]/brutal_keys/html/index.html create mode 100644 resources/[housing]/brutal_keys/html/script.js create mode 100644 resources/[housing]/brutal_keys/html/style.css create mode 100644 resources/[housing]/brutal_keys/locales/ar.json create mode 100644 resources/[housing]/brutal_keys/locales/cs.json create mode 100644 resources/[housing]/brutal_keys/locales/de.json create mode 100644 resources/[housing]/brutal_keys/locales/desktop.ini create mode 100644 resources/[housing]/brutal_keys/locales/en.json create mode 100644 resources/[housing]/brutal_keys/locales/fr.json create mode 100644 resources/[housing]/brutal_keys/locales/hu.json create mode 100644 resources/[housing]/brutal_keys/locales/it.json create mode 100644 resources/[housing]/brutal_keys/locales/nl.json create mode 100644 resources/[housing]/brutal_keys/locales/pl.json create mode 100644 resources/[housing]/brutal_keys/locales/pt.json create mode 100644 resources/[housing]/brutal_keys/locales/ro.json create mode 100644 resources/[housing]/brutal_keys/locales/ru.json create mode 100644 resources/[housing]/brutal_keys/locales/sp.json create mode 100644 resources/[housing]/brutal_keys/locales/sv.json create mode 100644 resources/[housing]/brutal_keys/locales/tr.json create mode 100644 resources/[housing]/brutal_keys/server/desktop.ini create mode 100644 resources/[housing]/brutal_keys/server/server.lua create mode 100644 resources/[housing]/brutal_keys/sv_utils.lua diff --git a/resources/[housing]/brutal_housing/config.lua b/resources/[housing]/brutal_housing/config.lua index eaab6bdfa..5917b0e42 100644 --- a/resources/[housing]/brutal_housing/config.lua +++ b/resources/[housing]/brutal_housing/config.lua @@ -13,7 +13,7 @@ Config = { Core = 'QBCORE', -- 'ESX' / 'QBCORE' | Other core setting on the 'core' folder. VoiceSytem = 'yaca-voice', -- "pma-voice" / "mumble" / "SaltyChat" Inventory = 'qb_inventory_new', -- 'ox_inventory' / 'qb_inventory_old'/ 'qb_inventory_new' / 'quasar_inventory' / 'chezza_inventory' / 'codem_inventory' / 'core_inventory' // Custom can be add in the cl_utils.lua!!! - Wardrobe = 'default', -- 'default' / 'ak47_clothing' / 'codem_apperance' / 'fivem_appearance' / 'illenium_appearance' / 'qb_clothing' / 'raid_clothes' / 'rcore_clothes' / 'rcore_clothing' / 'sleek_clothestore' / 'tgiann_clothing' // Custom can be add in the cl_utils.lua!!! + Wardrobe = 'illenium_appearance', -- 'default' / 'ak47_clothing' / 'codem_apperance' / 'fivem_appearance' / 'illenium_appearance' / 'qb_clothing' / 'raid_clothes' / 'rcore_clothes' / 'rcore_clothing' / 'sleek_clothestore' / 'tgiann_clothing' // Custom can be add in the cl_utils.lua!!! TextUI = 'ox_lib', -- false / 'brutal_textui' / 'ox_lib' / 'okokTextUI' / 'ESXTextUI' / 'QBDrawText' // Custom can be add in the cl_utils.lua!!! BrutalKeys = false, -- Buy here: https://store.brutalscripts.com BrutalPoliceJob = false, -- Buy here: https://store.brutalscripts.com | Better connection @@ -36,14 +36,14 @@ Config = { Blips = { available = true, - availableHouse = {label = "Available House", size = 0.7, sprite = 40, color = 2}, - availableGarage = {label = "Available Garage", size = 0.7, sprite = 357, color = 2}, + availableHouse = {label = "Kaufbares Haus", size = 0.7, sprite = 40, color = 2}, + availableGarage = {label = "Kaufbare Garage", size = 0.7, sprite = 357, color = 2}, owned = true, - myHouse = {label = "My House", size = 0.7, sprite = 40, color = 53}, - myGarage = {label = "My Garage", size = 0.7, sprite = 357, color = 53}, - hasKeyHouse = {label = "House", size = 0.7, sprite = 40, color = 53}, - hasKeyGarage = {label = "House", size = 0.7, sprite = 40, color = 53}, - ownedHouse = {label = "House", size = 0.7, sprite = 40, color = 1}, + myHouse = {label = "Mein Haus", size = 0.7, sprite = 40, color = 53}, + myGarage = {label = "Meine Garage", size = 0.7, sprite = 357, color = 53}, + hasKeyHouse = {label = "Haus", size = 0.7, sprite = 40, color = 53}, + hasKeyGarage = {label = "Haus", size = 0.7, sprite = 40, color = 53}, + ownedHouse = {label = "Haus", size = 0.7, sprite = 40, color = 1}, ownedGarage = {label = "Garage", size = 0.7, sprite = 357, color = 1}, police = true, burglarAlarm = {label = "Einbruch Alarm", size = 1.0, sprite = 161, color = 1}, @@ -171,7 +171,7 @@ Config = { MyProperties = { Command = 'myproperties', Suggestion = 'To manage your propertys', - Control = '', -- Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + Control = 'F7', -- Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ }, ServerDestroy = { diff --git a/resources/[housing]/brutal_keys/.fxap b/resources/[housing]/brutal_keys/.fxap new file mode 100644 index 0000000000000000000000000000000000000000..8d12bf19c12764c7360d58cc153623825281c351 GIT binary patch literal 178 zcmV;j08Rf!SV2$$0000000qodhBv)G>)_6$>3SV0OFmR zyn~?y@{@5BJ;3QXVI50Z_~0Q@ws)^8iNq$>2kR&8U>TB5f2kYZ|hHT%e0;6hz^<&JuDYLM?&IV3TF`rNDQe|6aWAK literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/README.md b/resources/[housing]/brutal_keys/README.md new file mode 100644 index 000000000..cecf3b394 --- /dev/null +++ b/resources/[housing]/brutal_keys/README.md @@ -0,0 +1 @@ +Please follow the instructions: https://docs.brutalscripts.com \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/cl_utils.lua b/resources/[housing]/brutal_keys/cl_utils.lua new file mode 100644 index 000000000..36b8ece68 --- /dev/null +++ b/resources/[housing]/brutal_keys/cl_utils.lua @@ -0,0 +1,85 @@ +ESX = Core +QBCore = Core + +-- Buy here: (4€+VAT) https://store.brutalscripts.com +function notification(title, text, time, type) + if Config.BrutalNotify then + exports['brutal_notify']:SendAlert(title, text, time, type) + else + -- Put here your own notify and set the Config.BrutalNotify to false + SetNotificationTextEntry("STRING") + AddTextComponentString(text) + DrawNotification(0,1) + + -- Default ESX Notify: + --TriggerEvent('esx:showNotification', text) + + -- Default QB Notify: + --TriggerEvent('QBCore:Notify', text, 'info', 5000) + + -- OKOK Notify: + -- exports['okokNotify']:Alert(title, text, time, type, false) + + end +end + +function TextUIFunction(type, text) + if type == 'open' then + if Config.TextUI:lower() == 'ox_lib' then + lib.showTextUI(text) + elseif Config.TextUI:lower() == 'okoktextui' then + exports['okokTextUI']:Open(text, 'darkblue', 'right') + elseif Config.TextUI:lower() == 'esxtextui' then + ESX.TextUI(text) + elseif Config.TextUI:lower() == 'qbdrawtext' then + exports['qb-core']:DrawText(text,'left') + elseif Config.TextUI:lower() == 'brutal_textui' then + exports['brutal_textui']:Open(text, "blue") + end + elseif type == 'hide' then + if Config.TextUI:lower() == 'ox_lib' then + lib.hideTextUI() + elseif Config.TextUI:lower() == 'okoktextui' then + exports['okokTextUI']:Close() + elseif Config.TextUI:lower() == 'esxtextui' then + ESX.HideUI() + elseif Config.TextUI:lower() == 'qbdrawtext' then + exports['qb-core']:HideText() + elseif Config.TextUI:lower() == 'brutal_textui' then + exports['brutal_textui']:Close() + end + end +end + +function PoliceAlert(coords, plate) + local x,y,z = table.unpack(coords) + local streetLabel = GetStreetNameFromHashKey(GetStreetNameAtCoord(x,y,z)) + + if GetResourceState("brutal_policejob") == "started" then + TriggerServerEvent('brutal_policejob:server:citizencall', 'create', "Vehicle jacking", coords, streetLabel) + end +end + +function OpenMenuUtil() + InMenu = true + SetNuiFocus(true, true) + + Citizen.CreateThread(function() + while InMenu do + N_0xf4f2c0d4ee209e20() -- it's disable the AFK camera zoom + Citizen.Wait(15000) + end + end) + + DisplayRadar(false) +end + +function DisableMinimap() + DisplayRadar(false) + -- Here you can add a trigger to hide your HUD system +end + +function EnableMinimap() + DisplayRadar(true) + -- Here you can add a trigger to enable your HUD system +end \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/client/client.lua b/resources/[housing]/brutal_keys/client/client.lua new file mode 100644 index 0000000000000000000000000000000000000000..863584375ae212779114def758b367df2745da18 GIT binary patch literal 15897 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 literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/client/desktop.ini b/resources/[housing]/brutal_keys/client/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/client/nui.lua b/resources/[housing]/brutal_keys/client/nui.lua new file mode 100644 index 0000000000000000000000000000000000000000..92491eac13f96e076d7a0f190ed1fc07a1c0b631 GIT binary patch literal 1664 zcmV-`27mcRSV2$$000000Fsb*NGA5|UA(m)OR;6p2LOcBP+Ys7RD;jc=q^zg>uC}l z(TqrR)-In4fq-b89P^R<@=o)*{l|4GOjhQ33Fmz3bWk5W^xOLg1HDS81SvQ0K>YCc z*9$+<7cP75H#;Gs+!>CSL*3J~%!dVC5F-v~z#LiGjI<=PYY%O7wOz$iy)4x^o#0)e zI8UQGclj7JxG?bxvikQ|p$)swbe6q39_xKg{8g`4bd#vZ=_m==shbjI^Gx+|4>Y0Z zrXKgq@XnWVj}5N?%Qq`wvIOi|q-iF81pX!uINMP=czP>`D0<3G^ha^Sbm@fFLZ-#^`f%q2wbUHz-IB<&CKj_Sv69LNCCqf zH-DL(H?;;vs-_A5vdqYylUXAZHt&M)U|fZ|&O7=d6=W4q-P@#18Nztag}pUEmKRdE zK1Opyiq6xwI+*=!4Pua#F=vwGi7SN(JnSXz2U)RI=y^mL=l|MY|MPKG{_Mjftc`H zz%M3ml;=+VW6%P;o`bO~9T#?feRr%F!byRx!3{pKXC|4MBymuFr?66DU4JTF`zE$2 zCOcR~4@=5CubM}6bLky8?pF{yU;ZS=13IZ5K^><#!>)niu(>pXIhM}6w||d5D*d$0 z%TLBEnPT!)!$o;u53<1?@QVS6->n_&Wg-+VogP?$O*yKZK0N=>^<0;u5%Mq`fwy_+ zh>b|SVJ@4|oVD1RVIvj)^8!W`v_ps;rgkRCArlG_0(~@b+UjWydLQy#_X}Cj5+PW6 zL(mOK1#!SwiJinyR34I0u#Fu|y8_&1XA}WGsY;N-KY%PXLMn%?^c{!ePCGU8Tj3&+ zC4l5lmyXyIPkE)p;-$yyy2`TX$5|geh7EbC?l{)E7S5X&1aehRoWFilCZvb#Rd?%iZ+(x(P3CrKlvhwV-mp@kPJ6zJQ%;Qd z37xa|2t5}&BV*ORpq32OiaE(kd~rD-U&g(Q2BG3{ds;5T1dL310HV=I#8=60UgWN* zj~_ASZ-V1yI~NpmvpbLAezFg(!P&Rs@UsWfAd_RfSw?RD_6kMdM&>o7Op{73zTAri z8}Ahw0#PnlG^=p)w`)KwTMoyt6KDjtoB}+SA#~U_O!Hc5h(q)hjlu86Q{HZ*osvii%rfMEwm76nbt7r_z)GXr zcUc7hklI&d+_r|_t5XJwT=PSO5jcXsK6^VnNFwQ1S4TnU`}+BU9B=4dMt-ZyK04Ic zn%kAm-g6L8IYwaoZJ$$~4ovy5>TPEft<(=^KnoWpAxPnv<}#w!$R-fJpZ(Sr*zDRK zkf30^1wca+Ns43nWo> cl_utils.lua + AdminGroups = {'superadmin', 'admin', 'mod', 'god'}, -- Admin groups + + DataStorage = { + --[[ + optimized = Saves the data when the script is restarted, the server is shut down or restarted, or during a scheduled server restart. + events: "txAdmin:events:serverShuttingDown" & "txAdmin:events:scheduledRestart" or fixed restart times. + resource_heavy = all data will be saved immediately, this is very stressful for the server so we don't recommend using this, but the choice is up to you. + ]]-- + + Type = "optimized", -- "optimized" / "resource_heavy" + Restarts = {}, -- example: "11:59" | Save the data 1 minute before restart. Save data at 15:59 instead of 16:00 + }, + + CopyPrice = 500, -- Key copy price + UseVehicleKeySystem = false, -- true / false | false = the full vehicle key system is switched off. + DriveWithKey = true, -- If true, players can only drive the car if they have a key, IF false, they can drive the car anytime they find it unlocked. + LockPicking = {maxTry = 1, item = "lockpick"}, -- maxTry = maximum try per vehicle | item = item or "" + Hotwiring = {maxTry = 1, successrate = 25, item = "screwdriver"}, -- maxTry = maximum try per vehicle | successrate = 10 = 10% | item = item or "" + AlertPolice = {use = true, chance = 10}, -- chance 10 = 10% | Supports Brutal Policejob basically to modity it open the cl_utils.lua file + UseKeyProp = true, -- Use the key prop in the player's hand when closing or opening a vehicle + LostVehicleKeys = { + npc = vector4(-354.5593, -128.0446, 39.4307, 65.9746), -- npc VECTOR4! coords + model = "ig_benny", -- npc type + blip = {use = true, label = "Lost Vehicle Keys", size = 1.0, sprite = 186, color = 1}, + price = 2500 -- if they lost all of their keys then the price is higher + }, + + QuickKeys = { + ['everyone'] = { -- no one needs a key to drive those vehicles + "adder", "bmx" + }, + + ['police'] = { -- player in the job do not need a key to drive the vehicle + "police", "police2", "police3", "policeb", "pbus" + }, + + ['ambulance'] = { -- player in the job do not need a key to drive the vehicle + "ambulance", + }, + }, + + Commands = { + MyKeys = { + Command = 'mykeys', + Suggestion = 'To manage your keys', + Control = '', -- Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + }, + + VehicleKey = { + Command = 'vkey', + Suggestion = 'To open the nearest vehicle', + Control = '', -- 'G' | Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + }, + + Lockpicking = { + Command = 'lockpick', + Suggestion = 'Lockpicking the nearest vehicle', + Control = '', -- Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + }, + + Hotwiring = { + Command = 'hotwiring', + Suggestion = 'To start the vehicle without keys', + Control = '', -- Controls list: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + }, + + -- Admin -- + + StaffMode = { + Command = 'kstaff', + Suggestion = 'To switch Key System Staff mode ON/OFF', + }, + + AddKey = { -- /addkey [ID] [KEY-ID] [label] + Command = 'addkey', + Suggestion = 'To add key', + }, + + RemoveKey = { -- /removekey [ID] [KEY-ID] + Command = 'removekey', + Suggestion = 'To remove key', + }, + + AddVehicleKey = { -- /addvehiclekey [ID] [PLATE] + Command = 'addvehiclekey', + Suggestion = 'To add vehicle key', + }, + + AddVehicleTemporaryKey = { -- /addtempkey [ID] [PLATE] + Command = 'addtempkey', + Suggestion = 'To add vehicle temporary key', + }, + + RemoveVehicleKey = { -- /removevehiclekey [ID] [PLATE] + Command = 'removevehiclekey', + Suggestion = 'To remove vehicle key', + }, + }, + + ----------------------------------------------------------- + -----------------------| TRANSLATE |----------------------- + ----------------------------------------------------------- + + NUILanguage = "en", -- "en", "es", "fr", "de", "pt", "it", "pl", "nl", "ru", "tr", "hu", "ro", "cs", "sv", "ar" + + MoneyForm = '$', -- Money form + + Texts = { + [1] = {'[E] - Lost Key', 38, 'Open the lost key menu'}, + }, + + -- Notify function EDITABLE >> cl_utils.lua + Notify = { + [1] = {"Keys", "Staff mode: ON", 5000, "success"}, + [2] = {"Keys", "Staff mode: OFF", 5000, "error"}, + [3] = {"Keys", "You got a new key!", 5000, "info"}, + [4] = {"Keys", "A key has been deleted!", 5000, "success"}, + [5] = {"Keys", "You gave them a key:", 5000, "info"}, + [6] = {"Keys", "You copied a key!", 5000, "success"}, + [7] = {"Keys", "You got a key from:", 5000, "info"}, + [8] = {"Keys", "Successful lock change!", 5000, "success"}, + [9] = {"Keys", "Only the vehicle owner can change!", 5000, "error"}, + [10] = {"Keys", "You don't have enough money!", 5000, "error"}, + [11] = {"Keys", "You have no car / you have keys to all your cars!", 5000, "error"}, + [12] = {"Keys", "No vehicle near you!", 5000, "error"}, + [13] = {"Keys", "The vehicle is open!", 5000, "error"}, + [14] = {"Keys", "Someone is sitting in the car!", 5000, "error"}, + [15] = {"Keys", "You have reached the maximum amount of keys!", 5000, "error"}, + [16] = {"Keys", "This person already has a temporary key for this car!", 5000, "error"}, + [17] = {"Keys", "To reduce the server load, you will have to wait a little!", 5000, "error"}, + [18] = {"Keys", "Plate: 3-8 characters", 5000, "error"}, + [19] = {"Keys", "Invalid Player ID!", 5000, "error"}, + [20] = {"Keys", "You can't try again!", 5000, "error"}, + [21] = {"Keys", "You have to sit in the driver's seat!", 5000, "error"}, + [22] = {"Keys", "You did it! You've started the engine!", 5000, "success"}, + [23] = {"Keys", "Unfortunately the safety lock would not let you start the engine!", 5000, "error"}, + [24] = {"Keys", "You need: Lockpick", 5000, "error"}, + [25] = {"Keys", "You need: Screwdriver", 5000, "error"}, + }, +} \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/core/client-core.lua b/resources/[housing]/brutal_keys/core/client-core.lua new file mode 100644 index 000000000..939af1c6b --- /dev/null +++ b/resources/[housing]/brutal_keys/core/client-core.lua @@ -0,0 +1,68 @@ +Core = nil + +if Config['Core']:upper() == 'ESX' then + local _esx_ = 'new' -- 'new' / 'old' + + if _esx_ then + Core = exports['es_extended']:getSharedObject() + else + while Core == nil do + TriggerEvent('esx:getSharedObject', function(obj) Core = obj end) + Citizen.Wait(0) + end + end + + LoadedEvent = 'esx:playerLoaded' + ReviveEvent = 'esx_ambulancejob:revive' + JobUpdateEvent = 'esx:setJob' + TSCB = Core.TriggerServerCallback + + function GetPlayerJobDatas() + return Core.GetPlayerData().job + end + + function GetPlayersFunction() + return Core.Game.GetPlayers() + end + + function GetVehiclePropertiesFunction(vehicle) + return Core.Game.GetVehicleProperties(vehicle) + end + + function SetVehiclePropertiesFunction(vehicle, properties) + return Core.Game.SetVehicleProperties(vehicle, properties) + end + + function GetClosestVehicleFunction(coords, modelFilter) + return Core.Game.GetClosestVehicle(coords, modelFilter) + end + +elseif Config['Core']:upper() == 'QBCORE' then + Core = exports['qb-core']:GetCoreObject() + + LoadedEvent = 'QBCore:Client:OnPlayerLoaded' + ReviveEvent = 'hospital:client:Revive' + JobUpdateEvent = 'QBCore:Client:OnJobUpdate' + TSCB = Core.Functions.TriggerCallback + + function GetPlayerJobDatas() + return Core.Functions.GetPlayerData().job + end + + function GetPlayersFunction() + return Core.Functions.GetPlayers() + end + + function GetVehiclePropertiesFunction(vehicle) + return Core.Functions.GetVehicleProperties(vehicle) + end + + function SetVehiclePropertiesFunction(vehicle, properties) + return Core.Functions.SetVehicleProperties(vehicle, properties) + end + + function GetClosestVehicleFunction(coords, modelFilter) + return Core.Functions.GetClosestVehicle(coords, modelFilter) + end + +end \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/core/desktop.ini b/resources/[housing]/brutal_keys/core/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/core/server-core.lua b/resources/[housing]/brutal_keys/core/server-core.lua new file mode 100644 index 000000000..51c04ff5f --- /dev/null +++ b/resources/[housing]/brutal_keys/core/server-core.lua @@ -0,0 +1,271 @@ +Core = nil + +if Config['Core']:upper() == 'ESX' then + local _esx_ = 'new' -- 'new' / 'old' + + if _esx_ == 'new' then + Core = exports['es_extended']:getSharedObject() + else + Core = nil + TriggerEvent('esx:getSharedObject', function(obj) Core = obj end) + while Core == nil do + Citizen.Wait(0) + end + end + + RESCB = Core.RegisterServerCallback + GETPFI = Core.GetPlayerFromId + RUI = Core.RegisterUsableItem + SetJobEvent = 'esx:setJob' + onPlayerDeath = 'esx:onPlayerDeath' + SQLData = { + player_vehicles = 'owned_vehicles', + } + + function GetIdentifier(source) + local xPlayer = GETPFI(source) + while xPlayer == nil do + Citizen.Wait(1000) + xPlayer = GETPFI(source) + end + return xPlayer.identifier + end + + function GetPlayerByIdentifier(identifier) + return Core.GetPlayerFromIdentifier(identifier) + end + + function GetAccountMoney(source,account) + local xPlayer = GETPFI(source) + if account == 'bank' then + return xPlayer.getAccount(account).money + elseif account == 'money' then + return xPlayer.getMoney() + end + end + + function AddMoneyFunction(source, account, amount) + local xPlayer = GETPFI(source) + if account == 'bank' then + xPlayer.addAccountMoney('bank', amount) + elseif account == 'money' then + xPlayer.addMoney(amount) + end + end + + function RemoveAccountMoney(source, account, amount) + local xPlayer = GETPFI(source) + if account == 'bank' then + xPlayer.removeAccountMoney('bank', amount) + elseif account == 'money' then + xPlayer.removeMoney(amount) + end + end + + function GetItemCount(source, item) + local xPlayer = GETPFI(source) + + if _esx_ == 'new' then + return xPlayer.getInventoryItem(item).count + else + if string.sub(item, 0, 6):lower() == 'weapon' then + local loadoutNum, weapon = xPlayer.getWeapon(item:upper()) + + if weapon then + return true + else + return false + end + else + return xPlayer.getInventoryItem(item).count + end + end + end + + function RemoveItem(source, item, amount) + local xPlayer = GETPFI(source) + if _esx_ == 'new' then + xPlayer.removeInventoryItem(item, amount) + else + if string.sub(item, 0, 6):lower() == 'weapon' then + xPlayer.removeWeapon(item) + else + xPlayer.removeInventoryItem(item, amount) + end + end + end + + function AddItem(source, item, count, info) + local xPlayer = GETPFI(source) + if _esx_ == 'new' then + xPlayer.addInventoryItem(item, count, info) + else + if string.sub(item, 0, 6):lower() == 'weapon' then + xPlayer.addWeapon(item, 90) + else + xPlayer.addInventoryItem(item, count) + end + end + end + + function GetPlayerNameFunction(source) + local name + if Config.SteamName then + name = GetPlayerName(source) or 'No Data' + else + local xPlayer = GETPFI(source) + name = xPlayer.getName() or 'No Data' + end + return name + end + + function GetPlayerJob(source) + local xPlayer = GETPFI(source) + return xPlayer.job.name + end + + function CreateCoreJob(name, label, grades) + Core.CreateJob(name, label, grades) + end + + function SetCoreJob(source, job, grade) + local xPlayer = GETPFI(source) + xPlayer.setJob(job, grade) + end + + function SetCoreJobOffline(identifier, job, grade) + MySQL.update('UPDATE users SET job = ?, job_grade = ? WHERE identifier = ?', {job, grade, identifier}) + end + + function GetPlayersFunction() + return Core.GetPlayers() + end + +elseif Config['Core']:upper() == 'QBCORE' then + + Core = exports['qb-core']:GetCoreObject() + + RESCB = Core.Functions.CreateCallback + GETPFI = Core.Functions.GetPlayer + RUI = Core.Functions.CreateUseableItem + SetJobEvent = 'QBCore:Server:SetGang' + onPlayerDeath = GetResourceState("brutal_ambulancejob") == "started" and 'onPlayerDeath' or 'hospital:server:SetDeathStatus' + SQLData = { + player_vehicles = 'player_vehicles', + } + + function GetIdentifier(source) + local xPlayer = GETPFI(source) + while xPlayer == nil do + Citizen.Wait(1000) + xPlayer = GETPFI(source) + end + return xPlayer.PlayerData.citizenid + end + + function GetPlayerByIdentifier(identifier) + return Core.Functions.GetPlayerByCitizenId(identifier) + end + + function GetAccountMoney(source, account) + local xPlayer = GETPFI(source) + if account == 'bank' then + return xPlayer.PlayerData.money.bank + elseif account == 'money' then + return xPlayer.PlayerData.money.cash + end + end + + function AddMoneyFunction(source, account, amount) + local xPlayer = GETPFI(source) + if account == 'bank' then + xPlayer.Functions.AddMoney('bank', amount) + elseif account == 'money' then + xPlayer.Functions.AddMoney('cash', amount) + end + end + + function RemoveAccountMoney(source, account, amount) + local xPlayer = GETPFI(source) + if account == 'bank' then + xPlayer.Functions.RemoveMoney('bank', amount) + elseif account == 'money' then + xPlayer.Functions.RemoveMoney('cash', amount) + end + end + + function GetItemCount(source, item) + local xPlayer = GETPFI(source) + local items = xPlayer.Functions.GetItemByName(item) + local item_count = 0 + if items ~= nil then + item_count = items.amount + else + item_count = 0 + end + return item_count + end + + function RemoveItem(source, item, amount) + local xPlayer = GETPFI(source) + xPlayer.Functions.RemoveItem(item, amount) + end + + function AddItem(source, item, count, info) + local xPlayer = GETPFI(source) + xPlayer.Functions.AddItem(item, count, nil, info) + end + + function GetPlayerNameFunction(source) + local name + if Config.SteamName then + name = GetPlayerName(source) + else + local xPlayer = GETPFI(source) + name = xPlayer.PlayerData.charinfo.firstname..' '..xPlayer.PlayerData.charinfo.lastname + end + return name + end + + function GetPlayerJob(source) + local xPlayer = GETPFI(source) + return xPlayer.PlayerData.gang.name + end + + function CreateCoreJob(name, label, grades) + Core.Functions.AddGang(name, + { + label = label, + grades = grades, + }) + end + + function UpdateCoreJob(name, label, grades) + Core.Functions.UpdateGang(name, { + label = label, + grades = grades, + }) + end + + function RemoveCoreJob(name) + Core.Functions.RemoveGang(name) + end + + function SetCoreJob(source, job, grade) + local xPlayer = GETPFI(source) + xPlayer.Functions.SetGang(job, grade) + end + + function SetCoreJobOffline(identifier, job) + local joblabel = "None" + if Gangs[job] ~= nil and Gangs[job].label ~= nil then + joblabel = Gangs[job].label + end + + MySQL.update('UPDATE players SET gang = ? WHERE citizenid = ?', {json.encode({grade = {level = 0, name = "Member"}, name = job, isboss = false, label = joblabel}), identifier}) + end + + function GetPlayersFunction() + return Core.Functions.GetPlayers() + end +end \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/desktop.ini b/resources/[housing]/brutal_keys/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/fxmanifest.lua b/resources/[housing]/brutal_keys/fxmanifest.lua new file mode 100644 index 000000000..7c3739d50 --- /dev/null +++ b/resources/[housing]/brutal_keys/fxmanifest.lua @@ -0,0 +1,61 @@ +fx_version 'cerulean' +games { 'gta5' } +lua54 'yes' + +author 'Keres & Dév' +description 'Brutal Keys - store.brutalscripts.com' +version '1.0.5' + +client_scripts { + 'config.lua', + 'core/client-core.lua', + 'cl_utils.lua', + 'client/*.lua' +} + +server_scripts { + '@mysql-async/lib/MySQL.lua', + 'config.lua', + 'core/server-core.lua', + 'sv_utils.lua', + 'server/*.lua', +} + +shared_script { + '@ox_lib/init.lua' +} + +export 'addKey' +export 'removeKey' +export 'addVehicleKey' +export 'addVehicleTemporaryKey' +export 'getPlayerKey' +export 'OpenKeysMenu' + + +ui_page "html/index.html" +files { + "html/index.html", + "html/style.css", + "html/script.js", + "html/assets/**", + 'locales/*.json', +} + +dependencies { + 'lockpick', -- https://github.com/baguscodestudio/lockpick + 'mx_fixwiring', -- https://github.com/mxlolshop/minigameFixWiring/tree/main/Fix%20Wiring/FiveM/mx_fixwiring + '/server:5181', -- ⚠️PLEASE READ⚠️; Requires at least SERVER build 5181 + '/gameBuild:2189', -- ⚠️PLEASE READ⚠️; Requires at least GAME build 2189. +} + +escrow_ignore { + 'config.lua', + 'cl_utils.lua', + 'sv_utils.lua', + 'core/client-core.lua', + 'core/server-core.lua', + 'stream/*.ydr', + 'stream/*.ytyp', +} +dependency '/assetpacks' \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/html/assets/basic_key.svg b/resources/[housing]/brutal_keys/html/assets/basic_key.svg new file mode 100644 index 000000000..fe41699d1 --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/basic_key.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/[housing]/brutal_keys/html/assets/basic_vehicle.svg b/resources/[housing]/brutal_keys/html/assets/basic_vehicle.svg new file mode 100644 index 000000000..78b06cb77 --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/basic_vehicle.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/[housing]/brutal_keys/html/assets/bin.png b/resources/[housing]/brutal_keys/html/assets/bin.png new file mode 100644 index 0000000000000000000000000000000000000000..57b59d38c9f8a47f767f81b744cb1923b08f07cd GIT binary patch literal 7639 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 literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/html/assets/desktop.ini b/resources/[housing]/brutal_keys/html/assets/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/html/assets/door_line.svg b/resources/[housing]/brutal_keys/html/assets/door_line.svg new file mode 100644 index 000000000..7759b567d --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/door_line.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/[housing]/brutal_keys/html/assets/key.svg b/resources/[housing]/brutal_keys/html/assets/key.svg new file mode 100644 index 000000000..4b8d54f3d --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/key.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/[housing]/brutal_keys/html/assets/panel_border.svg b/resources/[housing]/brutal_keys/html/assets/panel_border.svg new file mode 100644 index 000000000..b93f7497a --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/panel_border.svg @@ -0,0 +1,3 @@ + +
+
diff --git a/resources/[housing]/brutal_keys/html/assets/people.png b/resources/[housing]/brutal_keys/html/assets/people.png new file mode 100644 index 0000000000000000000000000000000000000000..eb940515860459c5bd81d314e3d2aa00f3b06e99 GIT binary patch literal 6950 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 literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/html/assets/selected_key.svg b/resources/[housing]/brutal_keys/html/assets/selected_key.svg new file mode 100644 index 000000000..b0c77cc05 --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/selected_key.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/[housing]/brutal_keys/html/assets/vehicle_key.svg b/resources/[housing]/brutal_keys/html/assets/vehicle_key.svg new file mode 100644 index 000000000..dee0095df --- /dev/null +++ b/resources/[housing]/brutal_keys/html/assets/vehicle_key.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/resources/[housing]/brutal_keys/html/desktop.ini b/resources/[housing]/brutal_keys/html/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/html/index.html b/resources/[housing]/brutal_keys/html/index.html new file mode 100644 index 000000000..ba146598f --- /dev/null +++ b/resources/[housing]/brutal_keys/html/index.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + Brutal Keys + + + + +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+ + +
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + + + + + diff --git a/resources/[housing]/brutal_keys/html/script.js b/resources/[housing]/brutal_keys/html/script.js new file mode 100644 index 000000000..545c21980 --- /dev/null +++ b/resources/[housing]/brutal_keys/html/script.js @@ -0,0 +1,637 @@ +BGBlur = true +ActionsOpen = false +ChangedKeys = [] +DoorNotify = false +CurrentKeyPage = 1 + +let translations = {}; + +async function loadTranslations(lang) { + try { + const response = await fetch(`../locales/${lang}.json`); + translations = await response.json(); + updateText() + } catch (error) { + console.error("Error loading translation:", error); + } +} + +function updateText() { + document.querySelectorAll("[data-i18n]").forEach(element => { + const key = element.getAttribute("data-i18n"); + + if (element.hasAttribute("placeholder")) { + element.setAttribute("placeholder", translations[key]); + } else { + element.innerHTML = translations[key]; + } + }); +} + +function t(key) { + return translations[key] || key; +} + +window.addEventListener('message', function(event) { + let data = event.data + + if (data.action == "NUILanguage") { + loadTranslations(data.language); + } + else if (data.action === "OpenKeysMenu") { + MyKeys = data.mykeys + CreateKeyMenu() + BackgroundBlur("plugin_1", 'key_panel') + if (ActionsOpen){ + BackgroundBlur("plugin_1", 'key_panel', true) + MakeKeysDraggable() + } + else{ + BackgroundBlur("plugin_1", 'key_panel') + } + ChangedKeys = [] + } + if (data.action === "OpenLostKeyMenu") { + MyVehicles = data.myvehicles + VehicleKeyPrice = data.price + Currency = data.currencyform + CreateKeyPurchaseMenu() + show('key_purchase_menu') + BackgroundBlur("plugin_2", 'key_purchase_panel') + } + if (data.action === "DoorState") { + DoorState = data.status + if (DoorState == 'unlocked'){ + $(".key_notify .text").html(t('doors_unlocked')) + document.getElementById('line').classList.remove("red") + } + else{ + $(".key_notify .text").html(t('doors_locked')) + document.getElementById('line').classList.add("red") + } + $('.key_notify').css('display', 'block') + $('.key_notify .container').css('animation', 'container 1s ease both') + if (DoorNotify){ + clearTimeout(DoorNotify) + } + DoorNotify = setTimeout(() => { + $('.key_notify .container').css('animation', 'reverse_container 1s ease both') + setTimeout(() => { + $('.key_notify').css('display', 'none') + DoorNotify = false + }, 800); + }, 4000); + } + else if (data.action === "close") { + Close() + } +}) + +document.onkeydown = function(data) { + if (event.key == 'Escape') { + Close() + } +} + +function Close(){ + CloseKeyMenu() + hide('key_purchase_menu') + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "close", table:ChangedKeys})) + ChangedKeys = [] +} + +function CreateKeyPurchaseMenu(){ + $('.vehicles_container').html('') + for (let i = 0; i < MyVehicles.length; i++) { + $('.vehicles_container').append(` +
+
+
${MyVehicles[i].plate}
+
${VehicleKeyPrice.toLocaleString('hu-HU')+' '+Currency}
+ +
+ `) + } +} + +function SendBuyKeyForVehicle(plate){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "lostKey", plate})) +} + +function CreateKeyMenu(){ + $('.key_menu').css('display', 'block') + $('.key_menu .animation_element').css('animation', 'animation_element 1s ease both') + $('.key_menu .overflow_container').css('animation', 'overflow_container 1s ease both') + $('.key_menu .panel').css('animation', 'panel 1s ease both') + + CreatePageSelector() + InsertDataToPanel() +} + +function SendChangeLock(keyid){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "changeLock", keyid, table:ChangedKeys})) + ChangedKeys = [] +} + +function SendCopy(keyid){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "copyKey", keyid, table:ChangedKeys})) + ChangedKeys = [] +} + +function SendDeleteAll(keyid, plate){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteAll", keyid, table:ChangedKeys, plate})) + ChangedKeys = [] +} + +function CloseKeyMenu(){ + $('.key_menu .animation_element').css('animation', 'reverse_animation_element 1s ease both') + $('.key_menu .overflow_container').css('animation', 'reverse_overflow_container 1s ease both') + $('.key_menu .panel').css('animation', 'reverse_panel 1s ease both') + + if (ActionsOpen){ + document.getElementById('actions_btn').classList.remove("active") + $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') + + $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both') + + MakeKeysNotDraggable() + + setTimeout(() => { + ActionsOpen = false + BackgroundBlur("plugin_1", 'key_panel') + $('.actions_section').css('display', 'none') + }, 400); + } + + setTimeout(() => { + $('.key_menu').css('display', 'none') + }, 700); +} + +function ChooseKeyPage(element, number){ + MakeKeysNotDraggable() + CurrentKeyPage = number+1 + for (let i = 0; i < NumberOfPages; i++) { + document.getElementById("page_"+i).classList.remove("choosed") + } + element.classList.add("choosed") + InsertDataToPanel() + if (ActionsOpen){ + MakeKeysDraggable() + } +} + +function CreatePageSelector(){ + BiggestSlot = 1 + for (let i = 0; i < MyKeys.length; i++) { + if (MyKeys[i].slot > BiggestSlot){ + BiggestSlot = MyKeys[i].slot + } + } + NumberOfPages = (BiggestSlot-(BiggestSlot%24))/24+1 + + $(".page_selector_container").html('') + if (NumberOfPages > 1){ + for (let i = 0; i < NumberOfPages; i++) { + if (CurrentKeyPage-1 == i){ + $(".page_selector_container").append(` +
+ `) + } + else{ + $(".page_selector_container").append(` +
+ `) + } + } + } +} + +function InsertDataToPanel(){ + $('.keys_container').html('') + for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { + if (MyKeys.length != 0){ + for (let _i = 0; _i < MyKeys.length; _i++) { + if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ + let options = {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit"}; + let date = new Date(MyKeys[_i].time * 1000); + $('.keys_container').append(` +
+
+
${MyKeys[_i].quantity>1?MyKeys[_i].quantity:''}
+
${MyKeys[_i].label}
+ ${MyKeys[_i].type == 'temporary_key'?`
`:''} + +
+ `) + break + } + else if(_i+1 == MyKeys.length){ + $('.keys_container').append(` +
+
+
+ `) + break + } + } + } + else{ + $('.keys_container').append(` +
+
+
+ `) + } + } + document.querySelectorAll(".key_image").forEach(el => { + const dropdownMenu = new bootstrap.Dropdown(el); + el.addEventListener("contextmenu", function (event) { + event.preventDefault(); + document.querySelectorAll(".key_image").forEach(otherEl => { + if (otherEl !== el) { + new bootstrap.Dropdown(otherEl).hide(); + } + }); + dropdownMenu.show(); + }); + + document.addEventListener("click", function () { + dropdownMenu.hide(); + }); + }); +} + +function MakeKeysDraggable(){ + for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { + for (let _i = 0; _i < MyKeys.length; _i++) { + if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ + dragElement(document.getElementById('key_'+i), 'key_'+i, MyKeys[_i].id, _i) + } + } + } +} + +function MakeKeysNotDraggable(){ + for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { + for (let _i = 0; _i < MyKeys.length; _i++) { + if (MyKeys[_i] != undefined && MyKeys[_i].slot-1 == i){ + document.getElementById('key_'+i).onmousedown = null + } + } + } +} + +function CreateActionPage(){ + if (!ActionsOpen){ + ActionsOpen = true + document.getElementById('actions_btn').classList.add("active") + $('.key_menu .overflow_container').css('transform', 'translate(-100px, -50%)') + BackgroundBlur("plugin_1", 'key_panel', true) + + $('#actions_panel').css('height', $('.key_menu .panel').height()+'px') + $('.actions_section #actions_panel').css('animation', 'actions_panel 0.3s ease both') + $('.actions_section').css('display', 'block') + + MakeKeysDraggable() + + TriggerCallback('getClosestPlayers', {}).done((cb) => { + ClosestPlayers = cb + $('.people_container').html('') + if (ClosestPlayers.length > 0){ + for (let i = 0; i < ClosestPlayers.length; i++) { + $('.people_container').append(` +
+
+
+
ID ${ClosestPlayers[i].id}
+
+ `) + } + } + else{ + $('.people_container').append(` +
+
+
x
+
+ `) + } + }); + } + else{ + document.getElementById('actions_btn').classList.remove("active") + $('.key_menu .overflow_container').css('transform', 'translate(0px, -50%)') + + $('.actions_section #actions_panel').css('animation', 'reverse_actions_panel 0.3s both') + + MakeKeysNotDraggable() + + setTimeout(() => { + ActionsOpen = false + BackgroundBlur("plugin_1", 'key_panel') + $('.actions_section').css('display', 'none') + }, 400); + } +} + +function TriggerCallback(event, data) { + data.action = event; + return $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify(data)).promise(); +} + +function BackgroundBlur(element, target, value) { + if (BGBlur){ + var bodyRect = document.body.getBoundingClientRect(); + let elemRect = getTotalBoundingBox(target); + + if (!elemRect) return; + + let offset = []; + if (value){ + offset = [ + (elemRect.top - bodyRect.top)-2, + ((elemRect.right - bodyRect.right) * (-1))-150, + (elemRect.bottom - bodyRect.bottom)+2, + (elemRect.left - bodyRect.left)-100 + ]; + } + else{ + offset = [ + (elemRect.top - bodyRect.top)-2, + ((elemRect.right - bodyRect.right) * (-1))-1, + (elemRect.bottom - bodyRect.bottom)+2, + (elemRect.left - bodyRect.left)-1 + ]; + } + + $('#' + element).css('clip-path', `inset(${offset[0]}px ${offset[1]}px calc(100% - ${offset[2]}px) ${offset[3]}px)`); + } + else{ + $('#' + element).css('display', 'none') + } + +} + +function getTotalBoundingBox(target) { + const elem = document.getElementById(target); + if (!elem) return null; + + let elemRect = elem.getBoundingClientRect(); + let minX = elemRect.left; + let minY = elemRect.top; + let maxX = elemRect.right; + let maxY = elemRect.bottom; + + + Array.from(elem.children).forEach(child => { + let childRect = child.getBoundingClientRect(); + minX = Math.min(minX, childRect.left!=0?childRect.left:99999); + minY = Math.min(minY, childRect.top!=0?childRect.top:99999); + maxX = Math.max(maxX, childRect.right); + maxY = Math.max(maxY, childRect.bottom); + }); + + + return { + width: maxX - minX, + height: maxY - minY, + left: minX, + top: minY, + right: maxX, + bottom: maxY + }; +} + +function show(element) { + $("#" + element).css("display", "block") + document.getElementById(element).style.animation = "showmenu 0.35s ease"; +} + +function hide(element) { + document.getElementById(element).style.animation = "hidemenu 0.3s ease"; + setTimeout(function() { + $("#" + element).css("display", "none") + }, 300) +} + +function isNumber(evt) { + evt = (evt) ? evt : window.event + var charCode = (evt.which) ? evt.which : evt.keyCode + if (charCode > 31 && (charCode < 48 || charCode > 57)) { + return false + } + return true +} + +////////////////////////////////////////////// DRAGGING ////////////////////////////////////////////////// + +OGPos = {} + +function dragElement(elmnt, item, keyid, index) { + var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; + + if (OGPos[item] == null){ + OGPos[item] = { x: null, y: null } + OGPos[item].x = elmnt.offsetLeft + OGPos[item].y = elmnt.offsetTop + } + + elmnt.onmousedown = dragMouseDown + + function dragMouseDown(e) { + e = e || window.event; + e.preventDefault(); + + pos3 = e.clientX; + pos4 = e.clientY; + document.onmouseup = closeDragElement; + document.onmousemove = elementDrag; + } + + function elementDrag(e) { + e = e || window.event + e.preventDefault() + + pos1 = pos3 - e.clientX + pos2 = pos4 - e.clientY + pos3 = e.clientX + pos4 = e.clientY + + elmnt.style.opacity = "0.8" + + elmnt.style.top = (elmnt.offsetTop - pos2) + "px" + elmnt.style.left = (elmnt.offsetLeft - pos1) + "px" + + if (elementsOverlap(elmnt, document.getElementById("key_panel"), true) == false && elementsOverlap(elmnt, document.getElementById("actions_panel")) == false){ + closeDragElement(e) + } + + for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { + if (document.getElementById("empty_"+i) != undefined){ + if (elementsOverlapPrecise(document.getElementById("empty_"+i), e.clientX, e.clientY) == false){ + document.getElementById('empty_'+i).classList.remove("hovered") + } + else{ + document.getElementById('empty_'+i).classList.add("hovered") + } + } + } + + for (let i = 0; i < ClosestPlayers.length; i++) { + if (elementsOverlapPrecise(document.getElementById("player_"+i), e.clientX, e.clientY) == false){ + document.getElementById('player_'+i).classList.remove("hovered") + } + else{ + document.getElementById('player_'+i).classList.add("hovered") + } + } + + if (elementsOverlapPrecise(document.getElementById("key_delete"), e.clientX, e.clientY) == false){ + document.getElementById('key_delete').classList.remove("hovered") + } + else{ + document.getElementById('key_delete').classList.add("hovered") + } + } + + function closeDragElement(e) { + UseElement(elmnt, item, e.clientX, e.clientY, keyid, index) + elmnt.style.opacity = "1" + document.onmouseup = null; + document.onmousemove = null; + } +} + +function UseElement(elmnt, item, X, Y, keyid, index){ + let elm = elmnt + + for (let i = (CurrentKeyPage*24)-24; i < CurrentKeyPage*24; i++) { + if (document.getElementById("empty_"+i) != undefined){ + if (elementsOverlapPrecise(document.getElementById("empty_"+i), X, Y) == false){ + document.getElementById('empty_'+i).classList.remove("hovered") + } + else{ + for (const key in ChangedKeys) { + if (ChangedKeys[key].keyid == keyid){ + ChangedKeys.splice(key, 1) + } + } + for (const key in MyKeys) { + if (MyKeys[key].id == keyid){ + if (MyKeys[key].oldSlot == undefined || MyKeys[key].oldSlot != i+1){ + ChangedKeys.push({keyid: keyid, slot:i+1, plate:MyKeys[key].plate}) + break + } + } + } + + MakeKeysNotDraggable() + if (MyKeys[index].oldSlot == undefined){ + MyKeys[index].oldSlot = MyKeys[index].slot + } + MyKeys[index].slot = i+1 + InsertDataToPanel() + MakeKeysDraggable() + return + } + } + } + + for (let i = 0; i < ClosestPlayers.length; i++) { + if (elementsOverlapPrecise(document.getElementById("player_"+i), X, Y)){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "giveKey", playerid:ClosestPlayers[i].id, keyid, table:ChangedKeys})) + document.getElementById('player_'+i).classList.remove("hovered") + ChangedKeys = [] + return + } + } + + if (elementsOverlapPrecise(document.getElementById("key_delete"), X, Y)){ + $.post('https://' + GetParentResourceName() + '/UseButton', JSON.stringify({action: "deleteKey", keyid, table:ChangedKeys, plate:MyKeys[index].plate})) + document.getElementById('key_delete').classList.remove("hovered") + ChangedKeys = [] + return + } + + /* if (elementsOverlap(elm, document.getElementById("head_box")) && Damages.head){ + ItemAnim(elm, item) + } + else if(elementsOverlap(elm, document.getElementById("head_box")) && Damages.head == false){ + WrongItemAnim(elm, item) + } + else{ + elm.style.top = OGPos[item].y + "px" + elm.style.left = OGPos[item].x + "px" + }*/ + + elm.style.top = OGPos[item].y + "px" + elm.style.left = OGPos[item].x + "px" +} + +function ItemAnim(elm, item, part){ + elm.style.animation = 'none'; + elm.offsetHeight; + elm.style.animation = "itemuseanim 1.2s"; + setTimeout(function(){ + elm.style.top = OGPos[item].y + "px" + elm.style.left = OGPos[item].x + "px" + elm.style.animation = 'none'; + Close() + },1200) + + $.post('https://'+GetParentResourceName()+'/UseButton', JSON.stringify({action:"MedicerMenu", type:"useitem", item, you:Mediceryou, part})) +} + +function WrongItemAnim(elm, item){ + elm.style.animation = 'none'; + elm.offsetHeight; + elm.style.animation = "itemnotuseanim 0.8s"; + setTimeout(function(){ + elm.style.top = OGPos[item].y + "px" + elm.style.left = OGPos[item].x + "px" + elm.style.animation = 'none'; + },800) +} + +function elementsOverlap(el1, el2, value) { + const domRect1 = el1.getBoundingClientRect(); + const domRect2 = el2.getBoundingClientRect(); + + if (value){ + return !( + domRect1.top+50 > domRect2.bottom || + domRect1.right-50 < domRect2.left || + domRect1.bottom-50 < domRect2.top || + domRect1.left-50 > domRect2.right + ); + } + else{ + return !( + domRect1.top+50 > domRect2.bottom || + domRect1.right-50 < domRect2.left || + domRect1.bottom-50 < domRect2.top || + domRect1.left+50 > domRect2.right + ); + } +} + +function elementsOverlapPrecise(el1, X, Y) { + const domRect1 = el1.getBoundingClientRect(); + + return !( + domRect1.top > Y || + domRect1.right < X || + domRect1.bottom < Y || + domRect1.left > X + ); + +} diff --git a/resources/[housing]/brutal_keys/html/style.css b/resources/[housing]/brutal_keys/html/style.css new file mode 100644 index 000000000..f57b2f4f8 --- /dev/null +++ b/resources/[housing]/brutal_keys/html/style.css @@ -0,0 +1,1032 @@ +@import url('https://fonts.cdnfonts.com/css/futura-pt'); + +body{ + font-family: 'Oswald', sans-serif; + user-select: none; + background: none; + font-display: fallback; +} + +:root{ + --main_color: rgb(251, 133, 16); + --background_color: rgb(34, 34, 39); + --text_color: white; +} + +button{ + outline: none; + border: none; + cursor: pointer; + transition: all 0.2s; +} + +button:disabled{ + opacity: 0.6; + cursor: none; +} + +button:hover{ + cursor: pointer; + filter: brightness(110%); +} + +button:disabled:hover{ + filter: none; +} + +button:active{ + transition: all 0.05s; + filter: brightness(70%); + scale: 0.9; +} + +button:disabled:active{ + filter: none; + scale: 1; +} + +::-webkit-scrollbar { + display: none; + width: 10px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #2129326b; + border-radius: 3vh; + border: solid 1px rgba(255, 255, 255, 0.432); +} + +hr{ + height: 2px; + background-color: white; +} + +.input-group input{ + background-color: rgba(255, 255, 255, 0.137); + color: white; + border: solid 2px rgba(211, 211, 211, 0.705); + outline: none; + text-align: center; + font-weight: 400; + font-size: 22px !important; + padding-top: 10px !important; +} + +.input-group input::placeholder{ + color: #ffffff8e; +} + +.input-group input:focus{ + color: white; + background-color: rgba(255, 255, 255, 0.267); + border: solid 2px rgba(211, 211, 211, 0.959); + outline: none; + box-shadow: none; +} + +.input-group input:disabled{ + background-color: rgba(52, 63, 73, 0.295); + color: #b1b1b1; + border: none; + outline: none; + text-align: center; +} + +.custom-checkbox .form-check-label{ + color: white; + font-size: 24px; + font-weight: 500; +} + +.custom-checkbox .form-check-input{ + height: 25px; + width: 25px; + background-color: rgba(255, 255, 255, 0.205); + border: solid 2px #D3D3D3; +} + +.custom-checkbox .form-check-input:checked{ + border: solid 3px #ffffff; + background-color: #79cfe0b2; + background-image: none; +} + +.range::-webkit-slider-thumb{ + -webkit-appearance: none; + appearance: none; + height: 15px; + width: 15px; + background: rgba(255, 255, 255, 0.7); + transform: rotate(45deg); + cursor: pointer; + box-shadow: none; + border: solid 2px white; + transition: 0.3s; +} + +.range::-webkit-slider-thumb:active{ + background: #32EBBE; +} + +.range{ + -webkit-appearance: none; + width: 80%; + height: 3px; + border-radius: 10px; + outline: none; + background-color: #B7B7B7; +} + +.custom-control.ios-switch { + scale: 1.6; + margin-bottom: 15px; +} + +.custom-control.ios-switch .ios-switch-control-input { + display: none; +} + +.custom-control.ios-switch .ios-switch-control-input:active~.ios-switch-control-indicator::after { + width: 20px; +} + +.custom-control.ios-switch .ios-switch-control-input:checked~.ios-switch-control-indicator { + border: 10px solid #79cfe0; + background: #79cfe0; +} + +.custom-control.ios-switch .ios-switch-control-input:checked~.ios-switch-control-indicator::after { + top: -8px; + left: 8px; +} + +.custom-control.ios-switch .ios-switch-control-input:checked:active~.ios-switch-control-indicator::after { + left: 4px; +} + +.custom-control.ios-switch .ios-switch-control-indicator { + display: inline-block; + position: relative; + margin: 0 10px; + top: 4px; + width: 36px; + height: 20px; + background: rgb(51, 49, 70); + border-radius: 16px; + transition: 0.3s; + border: 2px solid rgb(54, 72, 94); +} + +.custom-control.ios-switch .ios-switch-control-indicator::after { + content: ''; + display: block; + position: absolute; + width: 16px; + height: 16px; + border-radius: 16px; + transition: 0.3s; + top: 0px; + left: 0px; + background: rgb(236, 236, 236); +} + +.dropdown .dropdown-menu{ + position: absolute !important; + background-color: rgba(61, 61, 61, 0.705); + backdrop-filter: blur(20px); + border: none; + max-height: 200px; + overflow-y: auto; + border-radius: 0px; + padding: 10px; + z-index: 999999 !important; + padding-bottom: 20px; +} + +.dropdown .dropdown-menu .dropdown-item{ + color: white; + height: 40px; + transition: all 0.3s ease; + line-height: 30px; + font-size: 23px; + font-weight: 300; + border: solid 1px white; + text-align: center; + font-family: 'Futura PT', sans-serif; + text-shadow: 5px 1px 0px rgba(0, 0, 0, 0.479); +} + +.dropdown .dropdown-menu .dropdown-item:hover{ + background-color: rgba(192, 192, 192, 0.493); +} + +.dropdown .dropdown-menu .dropdown-item img{ + height: 35px; + width: 35px; + margin-top: -5px; + margin-left: -10px; + border-radius: 6px; +} + +.dropdown .dropdown-menu .time{ + position: absolute; + bottom: 0px; + right: 10px; + font-size: 15px; + font-family: 'Futura PT', sans-serif; + color: white; + font-weight: 300; +} + +/* //////////////////////////////////////////////////////// MAIN THINGS \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ + +.key_menu{ + display: none; +} + +.key_menu .animation_element{ + position: absolute; + top: 150%; + left: -50%; + height: 150%; + width: 140%; + transform: translate(-50%, -50%) rotate(-45deg); + background-color: white; + animation: animation_element 1.5s ease both; + z-index: 10000; +} + +@keyframes animation_element { + 99%{ + opacity: 1; + } + 100%{ + transform: translate(150%, -200%) rotate(-45deg); + opacity: 0; + } +} + +@keyframes reverse_animation_element { + 0%{ + transform: translate(150%, -200%) rotate(-45deg); + } + 99%{ + opacity: 1; + } + 100%{ + opacity: 0; + } +} + +.key_menu .overflow_container{ + position: absolute; + top: 50%; + right: 40px; + transform: translate(0%, -50%); + height: 690px; + width: 420px; + overflow: hidden; + transition: all 0.3s ease; + z-index: 100; + animation: overflow_container 2.5s both; +} + +@keyframes overflow_container { + 99%{ + overflow: hidden; + } + 100%{ + overflow: visible; + } +} + +@keyframes reverse_overflow_container { + 99%{ + overflow: hidden; + } + 100%{ + overflow: hidden; + } +} + +.key_menu .panel{ + position: absolute; + top: 50%; + left: 50%; + height: 670px; + width: 400px; + transform: translate(-50%, -50%); + background-color: rgba(61, 61, 61, 0.425); + backdrop-filter: blur(25px); + font-family: 'Futura PT', sans-serif; + animation: panel 1.5s ease both; +} + +@keyframes panel { + 0%{ + opacity: 0; + } + 20%{ + opacity: 0; + } + 40%{ + opacity: 1; + } +} + +@keyframes reverse_panel { + 0%{ + opacity: 1; + } + 22%{ + opacity: 1; + } + 50%{ + opacity: 0; + } + 100%{ + opacity: 0; + } +} + +.panel .panel_border_top{ + position: absolute; + top: -10px; + left: -10px; + height: 25px; + width: 25px; + background-image: url('assets/panel_border.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.panel .panel_border_bottom{ + position: absolute; + bottom: -10px; + right: -10px; + transform: rotate(180deg); + height: 25px; + width: 25px; + background-image: url('assets/panel_border.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.panel .top_line{ + position: absolute; + top: 16px; + left: 14px; + height: 1px; + width: 230px; + background-color: rgba(255, 255, 255, 0.37); + animation: top_line 4s ease; +} + +@keyframes top_line { + 0%{ + transform: scaleX(70%) translateX(-20%); + } + 100%{ + transform: scaleX(100%); + } +} + +.panel .top_box{ + position: absolute; + top: 14px; + left: 14px; + height: 4px; + width: 4px; + background-color: rgba(255, 255, 255, 0.616); +} + +.panel .title{ + position: absolute; + top: 20px; + left: 20px; + font-weight: 400; + font-size: 43px; + line-height: 48px; + color: #FFFFFF; + text-shadow: 6px 1px 0px rgba(0, 0, 0, 0.30); +} + +.panel .action_btn{ + position: relative; + float: right; + height: 45px; + padding-inline: 15px; + font-weight: 300; + font-size: 22px; + line-height: 24px; + color: #FFFFFF; + text-shadow: 5px 1px 0px rgba(0, 0, 0, 0.40); + background-color: transparent; + filter: brightness(100%); + opacity: 1; + overflow: hidden; +} + +.panel .action_btn:hover::before, .key_menu .panel .action_btn:hover::after{ + filter: brightness(100%); +} + +.action_btn::before, .action_btn::after{ + content: ""; + position: absolute; + height: 15px; + width: 15px; + background-image: url('assets/panel_border.svg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + filter: brightness(70%); + transition: all 0.3s ease; +} + +.panel .action_btn::before{ + top: 0px; + left: 0px; +} + +.panel .action_btn::after{ + bottom: 0px; + right: 0px; + transform: rotate(180deg); +} + +.panel .action_btn .bg{ + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: #21cc9a; + box-shadow: 0px 0px 10px 0px #21cc99a8; + z-index: -10; + transform: scaleX(0.01) rotate(-55deg); + transition: all 0.6s ease; + opacity: 0; +} + +.panel .action_btn.active .bg{ + transform: scaleX(2) rotate(-55deg); + opacity: 1; +} + +.panel .action_btn .line{ + position: absolute; + bottom: 7px; + left: 10px; + height: 1px; + width: 60%; + background-color: white; + transition: all 0.6s ease; +} + +.panel .action_btn:hover .line{ + transform: scaleX(1.17) translateX(5px); +} + +.panel .page_selector_container{ + position: absolute; + top: 70px; + left: 20px; +} + +.panel .page_selector_container .page_element{ + display: inline-block; + width: 0px; + height: 0px; + border-style: solid; + border-width: 20px 25px 0 0; + border-color: #32ebbd4d #32ebbd transparent transparent; + margin-inline: 3px; + transition: all 0.3s ease; + background-color: transparent; + cursor: pointer; + outline: rgba(255, 255, 255, 0.747); +} + +.panel .page_selector_container .page_element.choosed{ + border-color: #32EBBE #32EBBE transparent transparent; + outline: solid 2px rgba(255, 255, 255, 0.747); + border-width: 20px 40px 0 0; +} + +.page_element:hover{ + filter: brightness(110%); +} + +.page_element:active{ + transition: all 0.05s; + filter: brightness(70%); + scale: 0.9; +} + +.key_menu .panel .keys_container{ + position: relative; + margin-top: 85px; + height: 580px; + width: 100%; + display: flex; + flex-wrap: wrap; + padding-inline: 10px; + margin-bottom: 20px; + padding-bottom: 8px; +} + +.key_menu .panel .keys_container .key_element{ + position: relative; + height: 78px; + width: 78px; + margin-top: 16px; + margin-inline: 8px; + transition: background-color 0.3s ease; + cursor: pointer; +} + +.key_menu .panel .keys_container .key_element.hovered{ + background-color: rgba(121, 215, 190, 0.349); + border: solid 1px rgba(255, 255, 255, 0.247); +} + +.key_menu .panel .keys_container .key_element .key_border{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 80px; + width: 80px; + background-image: url('assets/basic_key.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.key_menu .panel .keys_container .key_element.hovered .key_border{ + background-image: url('assets/selected_key.svg'); + filter: brightness(0) saturate(100%) invert(73%) sepia(96%) saturate(177%) hue-rotate(109deg) brightness(92%) contrast(86%); +} + +.key_menu .panel .keys_container .key_element .number{ + position: absolute; + top: 3px; + right: 5px; + font-style: normal; + font-weight: 400; + font-size: 20px; + line-height: 20px; + text-align: center; + color: rgba(255, 255, 255, 0.65); + text-shadow: 4px 1px 0px rgba(0, 0, 0, 0.24); +} + +.key_menu .panel .keys_container .key_element.hovered .number{ + color: white; +} + +.key_menu .panel .keys_container .key_element .temporary{ + position: absolute; + top: 5px; + left: 5px; + width: 0; + height: 0; + border-style: solid; + border-width: 10px 10px 0 0; + border-color: #32EBBE #32ebbd3d transparent transparent; + animation: temporary 4s ease-in-out infinite; +} + +@keyframes temporary { + 50%{ + border-color: #32ebbd3d #32EBBE transparent transparent; + } +} + +.key_menu .panel .keys_container .key_element .name{ + position: absolute; + bottom: 5px; + width: 100%; + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 14px; + text-align: center; + color: rgba(255, 255, 255, 0.65); + text-shadow: 4px 1px 0px rgba(0, 0, 0, 0.24); +} + +.key_menu .panel .keys_container .key_element .key_image{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 80%; + width: 80%; + background-image: url('assets/key.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.key_menu .panel .keys_container .key_element .key_image.vehicle{ + background-image: url('assets/vehicle_key.svg'); +} + +.key_menu .panel .keys_container .key_element .dropdown{ + position: absolute; + height: 100%; + width: 100%; +} + +.key_menu .panel .keys_container .key_element .dropdown .dropdown_btn{ + position: absolute; + height: 100%; + width: 100%; + background-color: transparent; +} + +.actions_section{ + display: none; +} + +.key_menu .actions_section #actions_panel{ + position: absolute; + top: 50%; + right: 20px; + transform: translate(0%, -50%); + width: 110px; + background-color: rgba(61, 61, 61, 0.425); + backdrop-filter: blur(25px); + font-family: 'Futura PT', sans-serif; + z-index: 10; + overflow-y: auto; + border-top: solid white 3px; + transition: all 0.3s ease; +} + +@keyframes actions_panel { + 0%{ + transform: translate(0px, -50%) scale(1, 0.0); + } + 100%{ + transform: translate(0px, -50%); + } +} + +@keyframes reverse_actions_panel { + 0%{ + transform: translate(0px, -50%); + } + 100%{ + transform: translate(0px, -50%) scale(1, 0.0); + } +} + +.key_menu .actions_section #actions_panel .key_deleting{ + position: relative; + margin: 16px; + height: 80px; + width: 80px; + background-image: url('assets/selected_key.svg'); + background-repeat: no-repeat; + background-position: center; + filter: brightness(0) saturate(100%) invert(49%) sepia(41%) saturate(4609%) hue-rotate(329deg) brightness(99%) contrast(97%); + transition: all 0.3s ease; +} + +.key_menu .actions_section #actions_panel .key_deleting.hovered{ + background-color: #f9545485; +} + +.key_menu .actions_section #actions_panel .key_deleting .bg{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 78px; + width: 78px; + background-image: repeating-linear-gradient(45deg, #f95454 0, #f95454 11px, transparent 0, transparent 50%); + background-size: 30px 30px; + background-color: rgba(0, 0, 0, 0.342); + opacity: 0.3; +} + +.key_menu .actions_section #actions_panel .key_deleting .bin{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 40%; + width: 40%; + background-image: url('assets/bin.png'); + background-repeat: no-repeat; + background-position: center; + background-size: contain; +} + +.key_menu .actions_section #actions_panel hr{ + border: none; + height: 2px; + background-color: rgba(255, 255, 255, 0.671); + opacity: 1; + width: 70%; + margin-left: 15%; +} + +.key_menu .actions_section #actions_panel .people_container{ + position: relative; + width: 100%; +} + +.key_menu .actions_section #actions_panel .people_container .people_element{ + position: relative; + height: 78px; + width: 78px; + margin-bottom: 16px; + margin-inline: 16px; + transition: all 0.3s ease; + cursor: pointer; +} + +.key_menu .actions_section #actions_panel .people_container .people_element.hovered{ + background-color: rgba(255, 255, 255, 0.253); +} + +.key_menu .actions_section #actions_panel .people_container .people_element .element_border{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 80px; + width: 80px; + background-image: url('assets/basic_key.svg'); + background-repeat: no-repeat; + background-position: center; +} + +.key_menu .actions_section #actions_panel .people_container .people_element.hovered .element_border{ + background-image: url('assets/selected_key.svg'); +} + +.key_menu .actions_section #actions_panel .people_container .people_element .people_image{ + position: absolute; + top: 40%; + left: 50%; + transform: translate(-50%, -50%); + height: 70%; + width: 70%; + background-image: url('assets/people.png'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; +} + +.key_menu .actions_section #actions_panel .people_container .people_element .id{ + position: absolute; + bottom: 0px; + width: 100%; + font-style: normal; + font-weight: 400; + font-size: 18px; + line-height: 24px; + text-align: center; + color: rgb(255, 255, 255); + text-shadow: 4px 1px 0px rgba(0, 0, 0, 0.24); +} + +.key_menu .actions_section #actions_panel .people_container .people_element .text{ + position: absolute; + top: 45%; + transform: translate(0%, -50%); + width: 100%; + font-style: normal; + font-weight: 400; + font-size: 65px; + text-align: center; + color: rgba(255, 255, 255, 0.404); +} + +.key_purchase_menu{ + display: none; +} + +.key_purchase_menu .panel{ + position: absolute; + top: 50%; + left: 50%; + width: 400px; + transform: translate(-50%, -50%); + background-color: rgba(61, 61, 61, 0.425); + backdrop-filter: blur(25px); + font-family: 'Futura PT', sans-serif; + animation: panel 1.5s ease both; +} + +.key_purchase_menu .panel .description{ + position: absolute; + top: 65px; + left: 20px; + font-weight: 200; + font-size: 15px; + line-height: 17px; + color: #ffffffb6; + width: 300px; +} + +.key_purchase_menu .panel .vehicles_container{ + position: relative; + margin-top: 40px; + max-height: 570px; + width: 100%; + display: flex; + flex-wrap: wrap; + padding-inline: 8px; + margin-bottom: 10px; + padding-bottom: 16px; + overflow-y: auto; +} + +.key_purchase_menu .panel .vehicles_container .vehicle_element{ + position: relative; + height: 60px; + width: 380px; + margin-top: 16px; + margin-inline: 8px; + background-color: rgba(255, 255, 255, 0.171); + backdrop-filter: blur(60px); +} + +.key_purchase_menu .panel .vehicles_container .vehicle_element .plate{ + position: absolute; + top: 50%; + left: 20px; + transform: translate(0%, -50%); + color: white; + font-size: 23px; + text-shadow: 5px 1px 0px rgba(0, 0, 0, 0.397); + font-weight: 300; +} + +.key_purchase_menu .panel .vehicles_container .vehicle_element .price{ + position: absolute; + top: 50%; + right: 120px; + transform: translate(0%, -50%); + color: #79D7BE; + font-size: 23px; + font-weight: 500; +} + +.key_purchase_menu .panel .vehicles_container .vehicle_element .action_btn{ + position: absolute; + top: 50%; + right: 15px; + transform: translate(0%, -50%); +} + +.key_purchase_menu .panel .vehicles_container .vehicle_element .element_border{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + height: 60px; + width: 370px; + background-image: url('assets/basic_vehicle.svg'); + background-repeat: no-repeat; + background-position: center; + background-size: contain; +} + +@keyframes showmenu { + 0%{ + opacity: 0; + } +} + +@keyframes hidemenu { + 100%{ + opacity: 0; + } +} + +.key_notify{ + position: absolute; + bottom: 50px; + right: 200px; + height: 60px; + width: 220px; + font-family: 'Futura PT', sans-serif; + display: none; +} + +.key_notify .container{ + position: absolute; + top: 50%; + left: 50%; + height: 100%; + width: 100%; + transform: translate(-50%, -50%); + background-color: #3d3d3dd8; + animation: container 1s ease both; + overflow: hidden; +} + +@keyframes container { + 0%{ + width: 0%; + transform: translate(-50%, -50%) scaleX(0); + } + 40%{ + transform: translate(-50%, -50%) scaleX(1); + } + 100%{ + width: 100%; + } +} + +@keyframes reverse_container { + 0%{ + width: 100%; + } + 60%{ + transform: translate(-50%, -50%) scaleX(1); + } + 100%{ + width: 0%; + transform: translate(-50%, -50%) scaleX(0); + } +} + + +.key_notify .container::before, .key_notify .container::after{ + content: ""; + position: absolute; + height: 20px; + width: 20px; + background-image: url('assets/panel_border.svg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; +} + +.key_notify .container::before{ + top: 0px; + left: 0px; +} + +.key_notify .container::after{ + bottom: 0px; + right: 0px; + transform: rotate(180deg); +} + +.key_notify .text{ + position: absolute; + top: 35%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + color: white; + font-size: 20px; + text-shadow: 5px 1px 0px rgba(0, 0, 0, 0.397); + white-space: nowrap; +} + +.key_notify .line{ + position: absolute; + bottom: 10px; + left: 50%; + transform: translate(-50%, 0%); + height: 10px; + width: 200px; + background-image: url('assets/door_line.svg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; +} + +.key_notify .line.red{ + filter: brightness(0) saturate(100%) invert(52%) sepia(82%) saturate(3630%) hue-rotate(329deg) brightness(100%) contrast(97%); +} + +.key_notify .line .prog_line{ + position: absolute; + left: 7%; + width: 93%; + height: 100%; + background-color: #79D7BE; + animation: prog_line 2s ease both; +} + +@keyframes prog_line { + 0%{ + width: 0; + } + 100%{ + width: 93%; + } +} \ No newline at end of file diff --git a/resources/[housing]/brutal_keys/locales/ar.json b/resources/[housing]/brutal_keys/locales/ar.json new file mode 100644 index 000000000..3e6da1d11 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/ar.json @@ -0,0 +1,13 @@ +{ + "keys": "مفتاح", + "actions": "الإجراءات
", + "back": "رجوع
", + "buy_keys": "شراء مفتاح", + "buy_keys_des": "هنا يمكنك شراء مفتاح جديد إذا فقدت جميع المفاتيح.", + "doors_unlocked": "الباب مفتوح", + "doors_locked": "الباب مغلق", + "buy": "شراء", + "copy": "نسخ", + "change_lock": "تغيير القفل", + "delete_all": "حذف الكل" +} diff --git a/resources/[housing]/brutal_keys/locales/cs.json b/resources/[housing]/brutal_keys/locales/cs.json new file mode 100644 index 000000000..5f4e28f3c --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/cs.json @@ -0,0 +1,13 @@ +{ + "keys": "KLÍČ", + "actions": "AKCE
", + "back": "ZPĚT
", + "buy_keys": "KOUPIT KLÍČ", + "buy_keys_des": "Zde si můžeš koupit nový klíč, pokud jsi všechny ztratil.", + "doors_unlocked": "DVEŘE OTEVŘENÉ", + "doors_locked": "DVEŘE ZAVŘENÉ", + "buy": "KOUPIT", + "copy": "KOPÍROVAT", + "change_lock": "ZMĚNIT ZÁMEK", + "delete_all": "SMAZAT VŠE" +} diff --git a/resources/[housing]/brutal_keys/locales/de.json b/resources/[housing]/brutal_keys/locales/de.json new file mode 100644 index 000000000..5a8448e71 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/de.json @@ -0,0 +1,13 @@ +{ + "keys": "SCHLUSS", + "actions": "AKTIONEN
", + "back": "ZURUCK
", + "buy_keys": "KAUF SCHLUSS", + "buy_keys_des": "Hier kannst du einen neuen Schluss kaufen, wenn alle verloren sind.", + "doors_unlocked": "TUR OFFEN", + "doors_locked": "TUR ZU", + "buy": "KAUFEN", + "copy": "KOPIEREN", + "change_lock": "SCHLOSS WECHSEL", + "delete_all": "ALLES LOSCHEN" +} diff --git a/resources/[housing]/brutal_keys/locales/desktop.ini b/resources/[housing]/brutal_keys/locales/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/locales/en.json b/resources/[housing]/brutal_keys/locales/en.json new file mode 100644 index 000000000..836704e6f --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/en.json @@ -0,0 +1,13 @@ +{ + "keys": "KEYS", + "actions": "ACTIONS
", + "back": "BACK
", + "buy_keys": "BUY KEYS", + "buy_keys_des": "Here you can buy keys for your vehicles if you have managed to lose all of them.", + "doors_unlocked": "DOORS UNLOCKED", + "doors_locked": "DOORS LOCKED", + "buy": "BUY", + "copy": "COPY", + "change_lock": "CHANGE LOCK", + "delete_all": "DELETE ALL" +} diff --git a/resources/[housing]/brutal_keys/locales/fr.json b/resources/[housing]/brutal_keys/locales/fr.json new file mode 100644 index 000000000..cad03c324 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/fr.json @@ -0,0 +1,13 @@ +{ + "keys": "CLE", + "actions": "ACTIONS
", + "back": "RETOUR
", + "buy_keys": "ACHAT CLE", + "buy_keys_des": "Ici, tu peux acheter une nouvelle cle si toutes sont perdues.", + "doors_unlocked": "PORTE OUVERTE", + "doors_locked": "PORTE FERME", + "buy": "ACHETER", + "copy": "COPIER", + "change_lock": "CHANGER SERRURE", + "delete_all": "SUPPRIMER TOUT" +} diff --git a/resources/[housing]/brutal_keys/locales/hu.json b/resources/[housing]/brutal_keys/locales/hu.json new file mode 100644 index 000000000..8871af6c8 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/hu.json @@ -0,0 +1,13 @@ +{ + "keys": "KULCS", + "actions": "MŰVELETEK
", + "back": "VISSZA
", + "buy_keys": "VÁSÁRLÁS", + "buy_keys_des": "Itt vásárolhatsz kulcsokat a járműveidhez, ha az összeset elvesztetted.", + "doors_unlocked": "AJTÓK NYITVA", + "doors_locked": "AJTÓK ZÁRVA", + "buy": "VÁSÁRLÁS", + "copy": "MÁSOLÁS", + "change_lock": "ZÁRCSERE", + "delete_all": "ÖSSZES TÖRLÉSE" +} diff --git a/resources/[housing]/brutal_keys/locales/it.json b/resources/[housing]/brutal_keys/locales/it.json new file mode 100644 index 000000000..3273cdb10 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/it.json @@ -0,0 +1,13 @@ +{ + "keys": "CHIAVE", + "actions": "AZIONI
", + "back": "INDIETRO
", + "buy_keys": "COMPRA CHIAVE", + "buy_keys_des": "Qui puoi comprare una nuova chiave se le hai perse tutte.", + "doors_unlocked": "PORTA APERTA", + "doors_locked": "PORTA CHIUSA", + "buy": "COMPRA", + "copy": "COPIA", + "change_lock": "CAMBIA SERRATURA", + "delete_all": "ELIMINA TUTTO" +} diff --git a/resources/[housing]/brutal_keys/locales/nl.json b/resources/[housing]/brutal_keys/locales/nl.json new file mode 100644 index 000000000..8de839bcc --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/nl.json @@ -0,0 +1,13 @@ +{ + "keys": "SLEUTEL", + "actions": "ACTIES
", + "back": "TERUG
", + "buy_keys": "KOOP SLEUTEL", + "buy_keys_des": "Hier kun je een nieuwe sleutel kopen als je alles kwijt bent.", + "doors_unlocked": "DEUR OPEN", + "doors_locked": "DEUR DICHT", + "buy": "KOPEN", + "copy": "KOPIEREN", + "change_lock": "VERVANG SLOT", + "delete_all": "VERWIJDER ALLES" +} diff --git a/resources/[housing]/brutal_keys/locales/pl.json b/resources/[housing]/brutal_keys/locales/pl.json new file mode 100644 index 000000000..cabbde79c --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/pl.json @@ -0,0 +1,13 @@ +{ + "keys": "KLUCZ", + "actions": "AKCJE
", + "back": "WSTECZ
", + "buy_keys": "KUP KLUCZ", + "buy_keys_des": "Tutaj mozesz kupic nowy klucz, jesli zgubiles wszystkie.", + "doors_unlocked": "DRZWI OTWARTE", + "doors_locked": "DRZWI ZAMKNIETE", + "buy": "KUP", + "copy": "KOPIUJ", + "change_lock": "ZMIEN ZAMEK", + "delete_all": "USUN WSZYSTKO" +} diff --git a/resources/[housing]/brutal_keys/locales/pt.json b/resources/[housing]/brutal_keys/locales/pt.json new file mode 100644 index 000000000..25aead284 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/pt.json @@ -0,0 +1,13 @@ +{ + "keys": "CHAVE", + "actions": "ACOES
", + "back": "VOLTAR
", + "buy_keys": "COMPRAR CHAVE", + "buy_keys_des": "Aqui voce pode comprar uma nova chave se perdeu todas.", + "doors_unlocked": "PORTA ABERTA", + "doors_locked": "PORTA FECHADA", + "buy": "COMPRAR", + "copy": "COPIAR", + "change_lock": "TROCAR FECHADURA", + "delete_all": "APAGAR TUDO" +} diff --git a/resources/[housing]/brutal_keys/locales/ro.json b/resources/[housing]/brutal_keys/locales/ro.json new file mode 100644 index 000000000..30b149657 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/ro.json @@ -0,0 +1,13 @@ +{ + "keys": "CHEIE", + "actions": "ACȚIUNI
", + "back": "ÎNAPOI
", + "buy_keys": "CUMPĂRĂ CHEIE", + "buy_keys_des": "Aici poți cumpăra o nouă cheie dacă le-ai pierdut pe toate.", + "doors_unlocked": "UȘA DESCHISĂ", + "doors_locked": "UȘA ÎNCHISĂ", + "buy": "CUMPĂRĂ", + "copy": "COPIAZĂ", + "change_lock": "SCHIMBĂ LACĂTUL", + "delete_all": "ȘTERGE TOT" +} diff --git a/resources/[housing]/brutal_keys/locales/ru.json b/resources/[housing]/brutal_keys/locales/ru.json new file mode 100644 index 000000000..8f123132c --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/ru.json @@ -0,0 +1,13 @@ +{ + "keys": "КЛЮЧ", + "actions": "ДЕЙСТВИЯ
", + "back": "НАЗАД
", + "buy_keys": "КУПИТЬ КЛЮЧ", + "buy_keys_des": "Здесь можно купить новый ключ, если все потеряны.", + "doors_unlocked": "ДВЕРЬ ОТКРЫТА", + "doors_locked": "ДВЕРЬ ЗАКРЫТА", + "buy": "КУПИТЬ", + "copy": "КОПИРОВАТЬ", + "change_lock": "СМЕНИТЬ ЗАМОК", + "delete_all": "УДАЛИТЬ ВСЕ" +} diff --git a/resources/[housing]/brutal_keys/locales/sp.json b/resources/[housing]/brutal_keys/locales/sp.json new file mode 100644 index 000000000..e73d566ac --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/sp.json @@ -0,0 +1,13 @@ +{ + "keys": "LLAVE", + "actions": "ACCIONES
", + "back": "ATRAS
", + "buy_keys": "COMPRAR LLAVE", + "buy_keys_des": "Aqui puedes comprar una nueva llave si perdiste todas.", + "doors_unlocked": "PUERTA ABIERTA", + "doors_locked": "PUERTA CERRADA", + "buy": "COMPRAR", + "copy": "COPIAR", + "change_lock": "CAMBIO CERRADURA", + "delete_all": "BORRAR TODO" +} diff --git a/resources/[housing]/brutal_keys/locales/sv.json b/resources/[housing]/brutal_keys/locales/sv.json new file mode 100644 index 000000000..d5e80a192 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/sv.json @@ -0,0 +1,13 @@ +{ + "keys": "NYCKEL", + "actions": "ÅTGÄRDER
", + "back": "TILLBAKA
", + "buy_keys": "KÖP NYCKEL", + "buy_keys_des": "Här kan du köpa en ny nyckel om du har tappat alla.", + "doors_unlocked": "DÖRR ÖPPEN", + "doors_locked": "DÖRR LÅST", + "buy": "KÖP", + "copy": "KOPIERA", + "change_lock": "BYT LÅS", + "delete_all": "RADERA ALLT" +} diff --git a/resources/[housing]/brutal_keys/locales/tr.json b/resources/[housing]/brutal_keys/locales/tr.json new file mode 100644 index 000000000..b59364444 --- /dev/null +++ b/resources/[housing]/brutal_keys/locales/tr.json @@ -0,0 +1,13 @@ +{ + "keys": "ANAHTAR", + "actions": "EYLEMLER
", + "back": "GERI
", + "buy_keys": "ANAHTAR AL", + "buy_keys_des": "Buradan tum anahtarlarini kaybettiysen yeni bir tane alabilirsin.", + "doors_unlocked": "KAPI ACIK", + "doors_locked": "KAPI KAPALI", + "buy": "AL", + "copy": "KOPYALA", + "change_lock": "KILIT DEGISTIR", + "delete_all": "HEPSINI SIL" +} diff --git a/resources/[housing]/brutal_keys/server/desktop.ini b/resources/[housing]/brutal_keys/server/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..704fc3d2f053200a76a5e2820c8ebebaff73789a GIT binary patch literal 246 zcmY+8y9&Zk5Cx|e{D*viglJ(Qq*5ZO6fKQK2vGxS#HjfBPHv&dviI&|&S7`NY&lVL zHs)qYXXIQt(6VR9zJWWB wI(JJq{jT>cSjaTItbbJGjSuH_P#27i#LN4fg#X{==aH$5)xFJ;>@-~a0mK+7hX4Qo literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/server/server.lua b/resources/[housing]/brutal_keys/server/server.lua new file mode 100644 index 0000000000000000000000000000000000000000..16a27222fde9e5c804a8cbd1c6c62d36013c3814 GIT binary patch literal 14724 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 literal 0 HcmV?d00001 diff --git a/resources/[housing]/brutal_keys/sv_utils.lua b/resources/[housing]/brutal_keys/sv_utils.lua new file mode 100644 index 000000000..f69a65847 --- /dev/null +++ b/resources/[housing]/brutal_keys/sv_utils.lua @@ -0,0 +1,25 @@ +function StaffCheck(source) + local staff = false + + if Config.Core:upper() == 'ESX'then + local player = Core.GetPlayerFromId(source) + local playerGroup = player.getGroup() + + for i, Group in ipairs(Config.AdminGroups) do + if playerGroup == Group then + staff = true + break + end + end + elseif Config.Core:upper() == 'QBCORE' then + + for i, Group in ipairs(Config.AdminGroups) do + if Core.Functions.HasPermission(source, Group) or IsPlayerAceAllowed(source, Group) or IsPlayerAceAllowed(source, 'command') then + staff = true + break + end + end + end + + return staff +end \ No newline at end of file