From 664fa04d1a64abeabc0d28c04b1e27d2f95f8369 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 9 Jul 2025 20:17:42 +0200 Subject: [PATCH] ed --- resources/[notify]/okokNotify/.gitattributes | 2 - resources/[notify]/okokNotify/README.md | 62 - resources/[notify]/okokNotify/client.lua | 40 - resources/[notify]/okokNotify/fxmanifest.lua | 19 - resources/[notify]/okokNotify/html/scripts.js | 94 - resources/[notify]/okokNotify/html/sound.mp3 | Bin 7104 -> 0 bytes resources/[notify]/okokNotify/html/styles.css | 139 -- resources/[notify]/okokNotify/html/ui.html | 16 - resources/[notify]/okokTextUI/README.md | 166 -- resources/[notify]/okokTextUI/client.lua | 31 - resources/[notify]/okokTextUI/fxmanifest.lua | 20 - resources/[notify]/okokTextUI/web/scripts.js | 89 - resources/[notify]/okokTextUI/web/sound.mp3 | Bin 201240 -> 0 bytes resources/[notify]/okokTextUI/web/styles.css | 268 --- resources/[notify]/okokTextUI/web/ui.html | 22 - resources/[standalone]/okokChatV2/.fxap | Bin 178 -> 0 bytes resources/[standalone]/okokChatV2/README.md | 7 - resources/[standalone]/okokChatV2/client.lua | 225 --- resources/[standalone]/okokChatV2/config.lua | 349 ---- .../[standalone]/okokChatV2/fxmanifest.lua | 37 - resources/[standalone]/okokChatV2/server.lua | 1521 ----------------- .../[standalone]/okokChatV2/web/styles.css | 410 ----- resources/[test]/okokCrafting/.fxap | Bin 178 -> 0 bytes resources/[test]/okokCrafting/README.md | 7 - resources/[test]/okokCrafting/cl_utils.lua | 249 --- resources/[test]/okokCrafting/client.lua | Bin 18208 -> 0 bytes resources/[test]/okokCrafting/config.lua | 595 ------- resources/[test]/okokCrafting/fxmanifest.lua | 42 - resources/[test]/okokCrafting/locales/de.lua | 133 -- resources/[test]/okokCrafting/locales/en.lua | 133 -- resources/[test]/okokCrafting/locales/fr.lua | 133 -- resources/[test]/okokCrafting/locales/gr.lua | 133 -- resources/[test]/okokCrafting/locales/pt.lua | 133 -- .../[test]/okokCrafting/okokcrafting.sql | 2 - resources/[test]/okokCrafting/server.lua | Bin 16574 -> 0 bytes resources/[test]/okokCrafting/sv_utils.lua | 590 ------- resources/[test]/okokCrafting/web/click.mp3 | Bin 5014 -> 0 bytes resources/[test]/okokCrafting/web/scripts.js | 998 ----------- resources/[test]/okokCrafting/web/styles.css | 589 ------- resources/[test]/okokCrafting/web/ui.html | 125 -- 40 files changed, 7379 deletions(-) delete mode 100644 resources/[notify]/okokNotify/.gitattributes delete mode 100644 resources/[notify]/okokNotify/README.md delete mode 100644 resources/[notify]/okokNotify/client.lua delete mode 100644 resources/[notify]/okokNotify/fxmanifest.lua delete mode 100644 resources/[notify]/okokNotify/html/scripts.js delete mode 100644 resources/[notify]/okokNotify/html/sound.mp3 delete mode 100644 resources/[notify]/okokNotify/html/styles.css delete mode 100644 resources/[notify]/okokNotify/html/ui.html delete mode 100644 resources/[notify]/okokTextUI/README.md delete mode 100644 resources/[notify]/okokTextUI/client.lua delete mode 100644 resources/[notify]/okokTextUI/fxmanifest.lua delete mode 100644 resources/[notify]/okokTextUI/web/scripts.js delete mode 100644 resources/[notify]/okokTextUI/web/sound.mp3 delete mode 100644 resources/[notify]/okokTextUI/web/styles.css delete mode 100644 resources/[notify]/okokTextUI/web/ui.html delete mode 100644 resources/[standalone]/okokChatV2/.fxap delete mode 100644 resources/[standalone]/okokChatV2/README.md delete mode 100644 resources/[standalone]/okokChatV2/client.lua delete mode 100644 resources/[standalone]/okokChatV2/config.lua delete mode 100644 resources/[standalone]/okokChatV2/fxmanifest.lua delete mode 100644 resources/[standalone]/okokChatV2/server.lua delete mode 100644 resources/[standalone]/okokChatV2/web/styles.css delete mode 100644 resources/[test]/okokCrafting/.fxap delete mode 100644 resources/[test]/okokCrafting/README.md delete mode 100644 resources/[test]/okokCrafting/cl_utils.lua delete mode 100644 resources/[test]/okokCrafting/client.lua delete mode 100644 resources/[test]/okokCrafting/config.lua delete mode 100644 resources/[test]/okokCrafting/fxmanifest.lua delete mode 100644 resources/[test]/okokCrafting/locales/de.lua delete mode 100644 resources/[test]/okokCrafting/locales/en.lua delete mode 100644 resources/[test]/okokCrafting/locales/fr.lua delete mode 100644 resources/[test]/okokCrafting/locales/gr.lua delete mode 100644 resources/[test]/okokCrafting/locales/pt.lua delete mode 100644 resources/[test]/okokCrafting/okokcrafting.sql delete mode 100644 resources/[test]/okokCrafting/server.lua delete mode 100644 resources/[test]/okokCrafting/sv_utils.lua delete mode 100644 resources/[test]/okokCrafting/web/click.mp3 delete mode 100644 resources/[test]/okokCrafting/web/scripts.js delete mode 100644 resources/[test]/okokCrafting/web/styles.css delete mode 100644 resources/[test]/okokCrafting/web/ui.html diff --git a/resources/[notify]/okokNotify/.gitattributes b/resources/[notify]/okokNotify/.gitattributes deleted file mode 100644 index dfe077042..000000000 --- a/resources/[notify]/okokNotify/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto diff --git a/resources/[notify]/okokNotify/README.md b/resources/[notify]/okokNotify/README.md deleted file mode 100644 index 93460351e..000000000 --- a/resources/[notify]/okokNotify/README.md +++ /dev/null @@ -1,62 +0,0 @@ -Hi, thank you for buying my script, I'm very grateful! - -To display a notification you should call it like below: - -# Client side - -exports['okokNotify']:Alert("Title", "Message", Time, 'type') - -# Server side - -TriggerClientEvent('okokNotify:Alert', source, "Title", "Message", Time, 'type') - - -[Time] - 1000 = 1 second | 5000 = 5 seconds - -Types: - - success (green) - - info (blue) - - warning (yellow) - - error (red) - - phone (orange) - - neutral (grey) - -How to add new colors: - -1. Open styles.css and add the following to the last line. - -/* Example Notification */ - -.example-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f11c"; - color: #color_code; -} - -.example { - background-color: rgba(20, 20, 20, 0.85); - color: #color_code; - padding: 5px 5px 5px 5px; -} - -.example-border { - border-left: 4px solid #color_code; -} - -To know the content code navigate to https://fontawesome.com/v5.15/icons?d=gallery&p=2, select an icon and copy it's code. - -2. Open scripts.js and add the following to the line 76. - -else if (event.data.type == 'type') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('type-icon') - $(`.wrapper-${number}`).addClass('type type-border') - sound.play(); -} - -Don't forget to change the type to the same name as you choose for "example". - -If you need help contact me on discord: https://discord.gg/Knw8UyqxbQ \ No newline at end of file diff --git a/resources/[notify]/okokNotify/client.lua b/resources/[notify]/okokNotify/client.lua deleted file mode 100644 index ad8698768..000000000 --- a/resources/[notify]/okokNotify/client.lua +++ /dev/null @@ -1,40 +0,0 @@ -function Alert(title, message, time, type) - SendNUIMessage({ - action = 'open', - title = title, - type = type, - message = message, - time = time, - }) -end - -RegisterNetEvent('okokNotify:Alert') -AddEventHandler('okokNotify:Alert', function(title, message, time, type) - Alert(title, message, time, type) -end) - --- Example Commands - Delete them - -RegisterCommand('success', function() - exports['okokNotify']:Alert("SUCCESS", "You have sent 420€ to Tommy!", 5000, 'success') -end) - -RegisterCommand('info', function() - exports['okokNotify']:Alert("INFO", "The Casino has opened!", 5000, 'info') -end) - -RegisterCommand('error', function() - exports['okokNotify']:Alert("ERROR", "Please try again later!", 5000, 'error') -end) - -RegisterCommand('warning', function() - exports['okokNotify']:Alert("WARNING", "You are getting nervous!", 5000, 'warning') -end) - -RegisterCommand('phone', function() - exports['okokNotify']:Alert("SMS", "Tommy: Where are you?", 5000, 'phonemessage') -end) - -RegisterCommand('longtext', function() - exports['okokNotify']:Alert("LONG MESSAGE", "Lorem ipsum dolor sit amet, consectetur adipiscing elit e pluribus unum.", 5000, 'neutral') -end) \ No newline at end of file diff --git a/resources/[notify]/okokNotify/fxmanifest.lua b/resources/[notify]/okokNotify/fxmanifest.lua deleted file mode 100644 index d789b4b43..000000000 --- a/resources/[notify]/okokNotify/fxmanifest.lua +++ /dev/null @@ -1,19 +0,0 @@ -fx_version 'adamant' - -game 'gta5' - -author 'okok' -- Discord: okok#3488 -description 'okokNotify' -version '1.0' - -ui_page 'html/ui.html' - -client_scripts { - 'client.lua', -} - -files { - 'html/*.*' -} - -export 'Alert' \ No newline at end of file diff --git a/resources/[notify]/okokNotify/html/scripts.js b/resources/[notify]/okokNotify/html/scripts.js deleted file mode 100644 index 128af9c8c..000000000 --- a/resources/[notify]/okokNotify/html/scripts.js +++ /dev/null @@ -1,94 +0,0 @@ -$(function () { - var sound = new Audio('sound.mp3'); - sound.volume = 0.2; - window.addEventListener('message', function (event) { - if (event.data.action == 'open') { - var number = Math.floor((Math.random() * 1000) + 1); - $('.toast').append(` -
-
-
-
- ${event.data.message} -
-
-
`) - $(`.wrapper-${number}`).css({ - "margin-bottom": "10px", - "width": "275px", - "margin": "0 0 8px -180px", - "border-radius": "10px" - }) - $('.notification_main-'+number).addClass('main') - $('.text-'+number).css({ - "font-size": "14px" - }) - - if (event.data.type == 'success') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('success-icon') - $(`.wrapper-${number}`).addClass('success success-border') - - } else if (event.data.type == 'info') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('info-icon') - $(`.wrapper-${number}`).addClass('info info-border') - } else if (event.data.type == 'error') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('error-icon') - $(`.wrapper-${number}`).addClass('error error-border') - sound.play(); - - } else if (event.data.type == 'warning') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('warning-icon') - $(`.wrapper-${number}`).addClass('warning warning-border') - sound.play(); - } else if (event.data.type == 'phonemessage') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('phonemessage-icon') - $(`.wrapper-${number}`).addClass('phonemessage phonemessage-border') - } else if (event.data.type == 'neutral') { - $(`.title-${number}`).html(event.data.title).css({ - "font-size": "16px", - "font-weight": "600" - }) - $(`.notification_main-${number}`).addClass('neutral-icon') - $(`.wrapper-${number}`).addClass('neutral neutral-border') - - } - anime({ - targets: `.wrapper-${number}`, - translateX: -50, - duration: 750, - easing: 'spring(1, 70, 100, 10)', - }) - setTimeout(function () { - anime({ - targets: `.wrapper-${number}`, - translateX: 500, - duration: 750, - easing: 'spring(1, 80, 100, 0)' - }) - setTimeout(function () { - $(`.wrapper-${number}`).remove() - }, 750) - }, event.data.time) - } - }) -}) \ No newline at end of file diff --git a/resources/[notify]/okokNotify/html/sound.mp3 b/resources/[notify]/okokNotify/html/sound.mp3 deleted file mode 100644 index dcf02928edc4babccf8fdd7a3f2efc8a52638450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7104 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 J{_o$w{{riJALal6 diff --git a/resources/[notify]/okokNotify/html/styles.css b/resources/[notify]/okokNotify/html/styles.css deleted file mode 100644 index ddfcee9e1..000000000 --- a/resources/[notify]/okokNotify/html/styles.css +++ /dev/null @@ -1,139 +0,0 @@ -body { - margin-top: 100px; - font-family: 'Roboto', sans-serif; - overflow: hidden; -} - -.toast { - width: 100px; - float: right; -} - -.wrapper { - width: 100px; - height: auto; - background-color: #1e1e1e; - float: right; -} - -.main { - margin: 12px 16px 12px 56px; - position: relative; -} - -.main::before { - font-size: 24px; - top: calc(50% - 12px); - left: -40px; - line-height: 24px; - position: absolute; -} - -/* Success Notification*/ - -.success-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f058"; - color: #47cf73; -} - -.success { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.success-border { - border-left: 4px solid #47cf73; -} - -/* Info Notification*/ - -.info-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f05a"; - color: #2f83ff; -} - -.info { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.info-border { - border-left: 4px solid #2f83ff; -} - -/* Warning Notification */ - -.warning-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f071"; - color: #ffc107; -} - -.warning { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.warning-border { - border-left: 4px solid #ffc107; -} - -/* Error Notification */ - - -.error-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f06a"; - color: #dc3545; -} - -.error { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.error-border { - border-left: 4px solid #dc3545; -} - -/* SMS Notification */ - -.phonemessage-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f7cd"; - color: #f38847; -} - -.phonemessage { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.phonemessage-border { - border-left: 4px solid #f38847; -} - -/* Long Text Notification */ - -.neutral-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f11c"; - color: #6c757d; -} - -.neutral { - background-color: rgba(20, 20, 20, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; -} - -.neutral-border { - border-left: 4px solid #6c757d; -} \ No newline at end of file diff --git a/resources/[notify]/okokNotify/html/ui.html b/resources/[notify]/okokNotify/html/ui.html deleted file mode 100644 index 803a4734d..000000000 --- a/resources/[notify]/okokNotify/html/ui.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - -
- - - - - - - diff --git a/resources/[notify]/okokTextUI/README.md b/resources/[notify]/okokTextUI/README.md deleted file mode 100644 index 9ff41e434..000000000 --- a/resources/[notify]/okokTextUI/README.md +++ /dev/null @@ -1,166 +0,0 @@ -Hi, thank you for buying my script, I'm very grateful! - -If you need help contact me on discord: okok#3488 -Discord server: https://discord.gg/FauTgGRUku - -# To display a text UI - -exports['okokTextUI']:Open('[Key] Message', 'color', 'position') - -Colors: - - lightblue; - - lightgreen; - - lightred; - - lightgrey; - - darkblue; - - darkgreen; - - darkred; - - darkgrey. - -Positions: - - right; - - left. - -To make the text bold: exports['okokTextUI']:Open('[Key] Message', 'color', 'position') -To insert multiple lines/commands in a text UI: exports['okokTextUI']:Open('[Key] Message 1
[Key] Message 2', 'color', 'position') - -NOTE: 'color' and 'position' should be placed between '' - -# To hide a text UI - -exports['okokTextUI']:Close() - -How to add new colors: - -1. Open styles.css and add the following to the last line. - -/* Example Notification */ - -.example-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f11c"; - color: #color_code; -} - -.example { - background-color: rgba(20, 20, 20, 0.85); - color: #color_code; - padding: 5px 5px 5px 5px; -} - -.example-border { - border-left: 4px solid #color_code; -} - -/* Example */ - -.examplecolor-icon::before { - font-family: "Font Awesome 5 Free"; - content: "\f05a"; - color: #color_code; - font-size: 28px; -} - -.examplecolor { - background-color: rgba(240, 240, 240, 0.85); - color: #fff; - padding: 5px 5px 5px 5px; - margin-bottom: 5px; -} - -.examplecolor-border { - border-left: 4px solid #color_code; -} - -If you want to set if the background color is light or dark, simply change the background-color on .examplecolor: - - background-color: rgba(240, 240, 240, 1); /* LIGHT BACKGROUND */ - - background-color: rgba(20, 20, 20, 1); /* DARK BACKGROUND */ - - -2. Open scripts.js and add the following to the line 64. - -else if (event.data.color == 'examplecolor') { // Example Color - removeClass(); - $('#main').addClass('examplecolor-icon'); - $('#wrapper').addClass('examplecolor examplecolor-border'); -} - -3. In order to make esx_doorlock functional change the code of the function started in the line 69 (client.lua) and do the following: - -``` -Citizen.CreateThread(function() - local inZone = false - local locked = true - local hasAuth = false - local shown = false - local size, displayText = 1, _U('unlocked') - local color - - while true do - Citizen.Wait(0) - local letSleep = true - inZone = false - for k,v in ipairs(Config.DoorList) do - if v.distanceToPlayer and v.distanceToPlayer < 50 then - letSleep = false - - if v.doors then - for k2,v2 in ipairs(v.doors) do - FreezeEntityPosition(v2.object, v.locked) - end - else - FreezeEntityPosition(v.object, v.locked) - end - end - - if v.distanceToPlayer and v.distanceToPlayer < v.maxDistance then - inZone = true - - - if v.size then - size = v.size - end - if v.locked then - locked = true - else - locked = false - end - if v.isAuthorized then - hasAuth = true - elseif not v.isAuthorized then - hasAuth = false - end - - if IsControlJustReleased(0, 38) then - if v.isAuthorized then - v.locked = not v.locked - locked = v.locked - TriggerServerEvent('esx_doorlock:updateState', k, v.locked) -- broadcast new state of the door to everyone - shown = false - end - end - end - end - - if inZone and not shown then - shown = true - if locked and hasAuth then - exports['okokTextUI']:Open('[E] Locked', 'lightred', 'left') - elseif not locked and hasAuth then - exports['okokTextUI']:Open('[E] Unlocked', 'lightgreen', 'left') - elseif locked then - exports['okokTextUI']:Open('Locked', 'lightred', 'left') - else - exports['okokTextUI']:Open('Unlocked', 'lightgreen', 'left') - end - elseif not inZone and shown then - exports['okokTextUI']:Close() - shown = false - end - - if letSleep then - Citizen.Wait(500) - end - end -end) -``` diff --git a/resources/[notify]/okokTextUI/client.lua b/resources/[notify]/okokTextUI/client.lua deleted file mode 100644 index 3503ee6f1..000000000 --- a/resources/[notify]/okokTextUI/client.lua +++ /dev/null @@ -1,31 +0,0 @@ -function Open(message, color, position) - SendNUIMessage({ - action = 'open', - message = message, - color = color, - position = position, - }) -end - -function Close() - SendNUIMessage({ - action = 'close' - }) -end - -RegisterNetEvent('okokTextUI:Open') -AddEventHandler('okokTextUI:Open', function(message, color, position) - SendNUIMessage({ - action = 'open', - message = message, - color = color, - position = position, - }) -end) - -RegisterNetEvent('okokTextUI:Close') -AddEventHandler('okokTextUI:Close', function() - SendNUIMessage({ - action = 'close' - }) -end) \ No newline at end of file diff --git a/resources/[notify]/okokTextUI/fxmanifest.lua b/resources/[notify]/okokTextUI/fxmanifest.lua deleted file mode 100644 index 25ed12dc8..000000000 --- a/resources/[notify]/okokTextUI/fxmanifest.lua +++ /dev/null @@ -1,20 +0,0 @@ -fx_version 'adamant' - -game 'gta5' - -author 'okok' -- Discord: okok#3488 -description 'okokTextUI' -version '1.0' - -ui_page 'web/ui.html' - -client_scripts { - 'client.lua', -} - -files { - 'web/*.*' -} - -export 'Open' -export 'Close' \ No newline at end of file diff --git a/resources/[notify]/okokTextUI/web/scripts.js b/resources/[notify]/okokTextUI/web/scripts.js deleted file mode 100644 index 0cc026a08..000000000 --- a/resources/[notify]/okokTextUI/web/scripts.js +++ /dev/null @@ -1,89 +0,0 @@ -played_sound = false -position = '' - -function removeClass() { - $("#main").removeClass(); - $("#wrapper").removeClass(); -} - -window.addEventListener('message', function(event) { - var sound = new Audio('sound.mp3'); - sound.volume = 0.2; - - if (event.data.action == 'open') { - position = event.data.position; - message = event.data.message; - - $('#message').html(message); - - if (position == 'right') { - $('#ui').css('left', ''); - $('#ui').css('right', '1%'); - $('#ui').removeClass('hideright'); - $('#ui').addClass('showright'); - } - if (position == 'left') { - $('#ui').css('right', ''); - $('#ui').css('left', '1%'); - $('#ui').removeClass('hideleft'); - $('#ui').addClass('showleft'); - } - - if (event.data.color == 'lightblue') { // Light Blue - removeClass(); - $('#main').addClass('lightblue-icon'); - $('#wrapper').addClass('lightblue lightblue-border'); - } else if (event.data.color == 'lightgreen') { // Light Green - removeClass(); - $('#main').addClass('lightgreen-icon'); - $('#wrapper').addClass('lightgreen lightgreen-border'); - } else if (event.data.color == 'lightred') { // Light Red - removeClass(); - $('#main').addClass('lightred-icon'); - $('#wrapper').addClass('lightred lightred-border'); - } else if (event.data.color == 'lightgrey') { // Light Red - removeClass(); - $('#main').addClass('lightgrey-icon'); - $('#wrapper').addClass('lightgrey lightgrey-border'); - } else if (event.data.color == 'darkblue') { // Dark Blue - removeClass(); - $('#main').addClass('darkblue-icon'); - $('#wrapper').addClass('darkblue darkblue-border'); - } else if (event.data.color == 'darkgreen') { // Dark Green - removeClass(); - $('#main').addClass('darkgreen-icon'); - $('#wrapper').addClass('darkgreen darkgreen-border'); - } else if (event.data.color == 'darkred') { // Dark Red - removeClass(); - $('#main').addClass('darkred-icon'); - $('#wrapper').addClass('darkred darkred-border'); - } else if (event.data.color == 'darkgrey') { // Dark Grey - removeClass(); - $('#main').addClass('darkgrey-icon'); - $('#wrapper').addClass('darkgrey darkgrey-border'); - } - - if (played_sound == false) { - played_sound = true; - } - - } else if (event.data.action == 'close') { - - if (position == 'right') { - $('#ui').removeClass('hideleft'); - $('#ui').removeClass('showleft'); - $('#ui').removeClass('showright'); - $('#ui').addClass('hideright'); - } - - if (position == 'left') { - $('#ui').removeClass('hideright'); - $('#ui').removeClass('showright'); - $('#ui').removeClass('showleft'); - $('#ui').addClass('hideleft'); - } - } - - played_sound = false; -}) - diff --git a/resources/[notify]/okokTextUI/web/sound.mp3 b/resources/[notify]/okokTextUI/web/sound.mp3 deleted file mode 100644 index d0794795a1b4f3bc4ceb06ff729f40c01572dda0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201240 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

CkVT;>yW9&+J#*nbnsj*_K*ud-3+o z!E)vd9JOJT*~tabbN0v6Xc7!I->m0!9UD|f_PqZu(sT8o&I$DW%-`l_d4M_G3~t|+ z1*-zd8Th1HxqW>(hkCdi!YnWMksrucIK>|?r)STkG!cJVyFM)YVswylsrf-WmmU-31j?nP%dSkLM6w(g*pz{^1a`5RT(l) z7Uw)k`yTh*&bn2NvL91!>S_;2Wl8M@Jb7n(Ir2z5&{cP8!;8HiqW= zTKAx7lPf#dqOxS)N%s5x>?_$XlK0vNlJ`0{S3Su%HJo7Ckv{J|{ZhTi$-Hv)a(8=F z*6m>X6&QZ(pxZyYo71Z=*}JMT1-`uAewRvsv-F-g^{if{U50P3O}_6u5j?F4?ClwE zpU*gZcWMOI2IF|V2V;7B0=_zgH5AzTpu<0FGIfF= z%>My-YgJ>gGE+lPtEt{#HD_Jc=>gwb>v?|aMxd)3fU9QZ^qKXX3W8dOZ)#vLgIA47 zJr4G2McS*~X;X8EGkwV+==&XR{GisUPb*>P#b8kf!6o?QfC~D-TeU~ECvtS9S?g2s zj>2R|k6P7x=t@n9-hHQUwy`;X>^FaD zZEH0O4o~cy8((9~R+!*e>*33KlKqM|V6_%42Jl^L+Sa$O{Iz{j9&Y`sx-5q11E%}d zsO`yip0{5a*z>K{?UxQBnCiB5s+Fm6>hxlvHKLk%@v;*)#ZguK&eVvf*2H42*a@E4 zSQQ*DQN8%Aitp^M6=;=zaNrP+#b~<$)~3G0EcRRPiuwM9*X}{CnM3t6Px)uwM5B4m$#S3O#m0e$^8DDf-5>b#c~`K+24j2PoT|3fy{G0gcVPL( z&x<>rdD1zN;tgo!1z=P)6Q@8nzq^`cMW|*)ym%ryg+VWv>fc#(G@9?sEdPX;Bkn5O@&_uQ{ zmBW}Ljy%!Cj>wFJP`97``ao~`?n(1hJ>m5t0lH16q?8S1MQB*N(C&`4vKiNMOZxJJ zed?{>zR<(s(ZQ>-!h8}{Y}{CWz{Z(KF~yRVotQ@o=ramjk_;~m z2V30KFL{N(e&j|<^k)=#p&y;Bf_%V_?#3jWc`#4Nfqmfyjc_in=pb7h8`HOVNH)eA z0l!z@@#q^FvMRcR32o$sXHtUEYhguaa|(>fqkB|=OH%O^w@Vw1d5#Ynjz>7r=xLHR zS7kRrX_k#za|j8UV{zGh2BL56FR(y!@?P1hdAqsOd>sav0}QU_F1b>9T_>jD?F57V z#d= z8OO>{hQCI~N#4yav*6_jhgn@P(3TaWv;Nzb-cTOyV1N)0xN@f-Jm}yBw8}?F2)&(R zr9}|{^_!g)&w_(0+T*=4b6ExmRar!Z<(m|fG4CM(J@f0LKgptmM-~ytT%;fk&+@zC zY84gwLoIITfOPSPHxVwrS2m4$O=Wu9o)gKPek`N4Dd-c@wqL@3FP@6pW8BY`8W$yA8S8>*8+AV^L&*7s5 zxO=v+M0}X#As`wT?lM=>l{YlI)eAlP%*S9eYv7FSXbtmbCiM%q{^!0q!rB^U*(&HDvgURM(XegGsnHA++X!NcsAnz)3^9?Q;ASzWV)YkeP z>1K=|Y{rYiGQiC@)i|`O3ZX`x=$nd%e6(ys}7(X>}GA9OJ7psT|2j zRbQ$(f!b(SRUR;mt@h-(dQ#PztvG>JEy~HBM(I_xM(rnPPV*SQ_o_uzmDIGHxN*M3 zDWPgyRk*-(z6K5F#DbFxu!5z3RVg@Ck5HtVq|Vie9I({XJacNsch5m_YNBiPG_@(c zov^@zQ#WL=*XSWjn72=~J6nS$5S*a#P0b4iRKgwXXa=i$_^S7*sNu}1jIN;cd!T+N z;dxRry6T*hBimk8&l6R>U^JqtAlx8!n#dF9=Bf_jRTa=ZSvfc2o0{Fys?8`e)I&f2 zl3CwX?VLmM46SgHK~hW>C`*R$FC7anIecRDbMT*M+Q=>x5O`YP>UY9q(eJsy==WfHX>A-z zItQjTjP=C5lT^3~Do&o7k#MhiGv^v1UnOz20sQ&`TTb=4C`$;xMT z$ zyw`Jn4Ze6*Zxsg+MPV(XJIm1nOdf2Me_)96po^s7h<-*FeZ@MFzTUoVOKqTg=IUFs zg9^H;0@}<)wWA0X<|$Y6m@%#(R5yX483t|J2KtVx+JVykc~-4M4{h$7&AM++1i@H6 z%*3i8vI@0%Gc3xi67@50>ZiZa&AP5y+Lh{RhS%3x59Vg=?wg6t(I}J0)na}J2Yzi; zJiwN@cp`^!mF37@`tQRY7<5yqsDtBp=nQ+z&+XHy@Xg$|qa<*-31LATN|5f*|*VO`9we#;)$cE9ch_ zZ27ge&cN^Lsw~*frf1jHTD5i+X5&@h!BoLUm-T8DV|-K<)+#676=fA`^zO>Dl_;3- zgW7l8R>`&wFdi=-y&7Ye1ZUy5&XDuALjad2b}c~iTLM)0O|X&vZW63kkBgJctXR>~ z4vSrCd9t;vodTbB5#X_+jW4;p9RiZ;F9UM|LPw&7 z3W=DIjCf6_2k3?5>58?GjWyBYj(&RZZjF59FL`Uvx7e-KTXLZjHcC1l$4B;u zH@0ZJYxq1%ub!ln^q*a>jItkeW>eWodWwGf^L*_Lysg4Crm@jLx8eiN=!o_7H_`AB zO`fHLcq`TzXC#{@^(sGLfSkS1CEE+Ww(yWudPH3^=ezwCBIioPY(83LhAxVWKG{|B z!z&EzzN>!u8=B}%56{s`CdOz3vxuRmKH-R~Xk|a1Yz=|U1zkH#po;w4N1L&%5Imo7 zYj1^2lg2b^9!`%PV>UsnYZeWIo*-2-*f}Q{rym+YT09`LaxbI3;OX0bhsi(k_Jl-y zRy(lHHrhOC_N6m3H#syCPIA;s8~m!>(Hl&C;FSaD2hzc5PMyco4y!rS{#Ab)E9_=$ z{lW1q`hsm1N3lATC(+}YB;)`j;%YPsqoNZrq`12yAix*}cqj{yS5&X|1hwJ`i18e4 zB$^!Y4o8};jlIfb*eY4Fs$h_*7brME`L;!Sv5R!z$0541ip7zH^bZ0nva{l9JlWs^ zucC$8NS2mIWjT6*QE%KeYMKWpDDVW$XOzYj?dIKLAqzpTs1p77%l^nBy1~tJnn$u9 zk}soLuZdsdvdrXgXagBN=oMLHpj9%_VpOtCw{}9vPQHoW?vplIR1E zRha(PTClY@Y1HBi4=C)R)l<8HV2Y4SO*Em=cv2UM7hgR=@Y;6kP%?Dyg)T32!VFez z!SuOLtnI`#klSTvHG1pise5%+(YBSVo%}|5P9JvN)pb>nt!&kfooVzJ$NJkOxX^3Y zuI3|hLmlX-R%wpv@T2N{+tscft)zWZ<+XO~WI|k7$CJF3I{4&*pM_?%OgEiwh(D6U zNA!RLi*cP4S?tM1n?9}1lV@$DXg%*5{_xPb>H`kJ4L%%Eq9X2es^5dMB;yx}w9sg_#vNo5~~UTh2i4FzE?1 z{7YkFJ!3ij13T*t*GiZKNy?SxjEYYE#0BSKlPWJZ&hs#5*C3EMyYo#<2qvns0(P5! z(O3Rv46LBB3(xz#p8KrHbvdXvO=^i+ldKQHRX8`Ln~Y;@$x;|Sv`t_b$SG)-ZT^hnBnzVUl5bT@_5FC&1l~iN?eIu zt-1YH#L6K5%IESuV_-?{=;ftWZ02`#ub$zI9&*fEWidF@lipc)I>AA63GZ6#js7eu z$!!E!$Z-G`jq}6oWS_5;f*L;1kDj7A?WTb&qR3;tlhv_4yk9Y91MDa3m+u#S@sfQR zwfIoAcUi&8B^!xT78VWo%HxcrUn`{IdE>7(Ry$8$S*2qX<1bG`tDKhSmU+-2%@iAW zml0{CJWS7GGJ0_2wKi5BkX|=pML{ucBWc$n8f|Y(+LkOKd8N1FOz|O3lm2R?sFKu< z#`C4+H_b2I@s{E&tm56(u;?0B^ouJoce&)ZC-Yf#cT z$gr|mo*kFC<>}V4u0_I?^pQMW9G#Qc^4a%1q8Z*ZPq#lR@E$ddD{n}rao?PfmXeM! zY>AYL0UJTm)rpqr7#1EvZF*fLUesBA zc~YP0Hm^85F)-goOE#xRIHNBe^9&G+rfbK+4r;nmIV!s_pZE*#{{NzWF=uSH6^?8$ z`(G~*H_~_>DAuBj#XEDy6W2={lSWtTC{G^CVR67JB5INj3X+=sEDHoJ`|ZfD9_S&1 zwa1N!@f6--Wb!yxTQ*Y0u^C&@VdY5Dpl^0Qz z-t`r}%A-gkNv>q#kzMnOqA>4d$LZ4bXRSHB#c@;9h%o)JXxAI65@RAt!K@0 zn>$5sUKYj0i_NaG8ju%ueBK&{mSFa5Ip6r}zJEosqV<`}m)o!}e51>`d4^&*CwP znlo5X+Q^!Bs%MfR*f_HT^cmc=E`f zXlLm|W%@<+m2ddtv`8NRMla6feW<6=B5fYC z8aykc^~t*yuy)?lEa7MZ%ygH1(e<&-yOD&Hl6ksaP1Uwmq8Hwq70dh1{F)ZPZN6&` zXGLi{X(x%iGuz(Y_u9|mKKNG8N26;MU9uSwG0%^-Jf)%ZL3yw2*K5(TCl&PS5M^%4!f!pM3VC z^Cx<;#^sj2>mOuTy^^NcI$PVEjZ~tOjjB5r2mK!ceg}mwHnFQWd-YZF%T%KdhIGXb z?M$s(+{houfb>b4+=^NGLb06fZ+6E%&m0`)c{rod6K=Gwe1n;v zUGsn-CR_4bs@Iyc*tIdO`-BXGcdyK^ww3hL#D179Wijmy_pe{dj3nfK*J&8`m~!c|rrA=g-+6Nu{G^j;uc#@ls@?2~uH!WU=2_W!g;VtHZn#b;l2q zVz|~S$%W53rK9QTY9cHXY3i z8P!Rq7+Zc+)lr2j31(|3ylWA)tb{y6cabD2b`D9pB$YSi$;H0potBe9)8}gN>qSLV?kGiE64L{-Q}$ku*~DTX`%$(F_7kHv`*iw1xq#`Xm>! zNMieK<8L%%@7c{p2iN7;x9Ckbs7@zaWh~dpmNw#|K0a3F!O7c;QQ*`EZ%Hq&kLPs6 zzVgEXd9zra8U+3PyGvv7XroMWG$!wC7A2G9bmD7s@Qy?G)yLx_8br9}q%w!ASE9uW z{65*X%qwl13rPVFEMsdL`NefKebF{=TYUUCeV}_OTyI^8vxe2-#u2@>9=&Yu#Tm69 zZT;ukvnx_t{^Nn9dX{X_k5aNC{q~!(zP0X^m$A`~sw`mdT~Wu2a*c1^VJXW|yHI6RsK`fodePx%16N5r?H$XIEoP%T zKjY+NKcY;O=if_<`H~f}5muFDq-&Dz+mTHW`EYredwtNgmZT-?%YM*7@?;R*c*oz| z&b3!M(~=IfE|l__l?K|qvWn$5INQeW>ybT!<=e)V#-oG%wGW~qQ6958%i5~7l0D7D z0}hu~n66yZ>)tlfFVZF}^3Dp1uxN>wuIL3r@5Y6Ds)`6y=J4!4_M?7<$Z%EN&5_^Hhn<6 z(iw(&H}~W(*+RM@r|iPFr9RB=ja%xAbTnqRkjweqo{U}WAvJ!vloh#pbna65P3Sz4-8OWS>pp>fV<&l86=&Cux%@TX5IaJ?hE_ zi_7_35u+0p#iVkX@U#8(1=3D0$7b{KWVZ0{S_&-5B%386_j;3uN`o3w^HMgrvEXQI z^1TQQrQZb$~kTCov$ ztABDh5Kvc?S*_gFwo&@vBw3u;6y)xczP?uvH|7d|X^wlcL|2xaq*yXoStKiKMYYy^ z+LL|Wc5iNX)gs=zU*10M@o=(FlJH78%6VaVN;ZOWkkd*UXf9VN=3M2G9h3h??evQWwBCK8H_O`D((~jW zXIIU@9OZZYHp+I6jV7LT^}f|(7}tV|>~QRJxYKKTMs;zZD=QS!aAyuV`;zX%d8J%S z)LwlbW#A>7)%nV4r(63V4yQ}W*N)7a*yEr`(UC%=qZ0OF;a1>?hdGN;PRbJ^OiGrJVu_|_54l9!J zA^IhA@34R!HTY}pO=@Kxa3+DM%PMxBi!!vcoh<1(qIh6T81uINny{7kH8X;z=%2)r z1dlv%BYT2<<<^MRLU&irK#AA9geFD^^Ey&?mv_*6-1sKnEW_>BkK3=_w9|}SUMd#S z3qE`!|6QqG<&exo>D?bZSY?SPJBvp2lZa~+#6y(UM~{4G#}{|kj?-ZfuJDq9rzfsw zWs40)-@{f<9FQw59KR$ltv4b+9JLl42f>Pe)JD~MM6&F3WixMjF6OVKS!kZPF(gl3 ztXYer|=zFF0^n!x+v`DztfkB;euJo65FXn5Z|dv_K6rnlWi*%_@I%0P>< z^%NY2VXyFq_oI?DHrrYskM6bam295h`Y_9b8JD{fB!^wsbwveQqj@P<{+GIiM$>0r zT6Zzb(nOID?Y7&JW89 z>CtMV>^o^B&z_(b7jcp&f_`*R7Ex{iXVHHI~pMkjg?twtu{zHM%w{y@D(m(%;e z3R*a|f_*f4m-D-nA4vrRWpR6;lUv-<7D=^_x;nkW&=(zEbb6gB<05S(FZ#=_&`2vR zeQSMYs^aagbGk=`c6uuB;|*zddt_Znf##A4s>tP9Qz>R>-$<6t9R7_$_42mYkMbQ? z*_U{@b8WPNvziJQx{7a0@3Fu*<6A`|bZ2)v7PPB-MUaOltB@D?PY(2A))=YP8B`q!Y)AfJpCON{@Y_wWU zXL{;OGDnA?kpWF*J$b{?Gd+gmXww)}pI+Hx-V%k2XSM2@t?6qdO37QT+&;Bm{a7cG z*?ipkXT2+@G?Q+V)JB_Z?0DePQ@w%oH!^RZVp}=4(QMCZ(LTSwdr~D)!~<){oX>R0 zSNG(An7CZy%8PW##<-Qyk?zs~7O#w+EDRn{vikCZ)#lbrJk0`)hh=>mZV>P)V#RZ^ z&c@Q3ep%;oPh;o?@laCR@)CrNuJINRaoo5apACQje=&}BclM^Y<`=vqE81Os;eGdX zPi8|$`4Xx=ihUu-)2pmyMajUJFgWeoZ{?BzyG*-jc{GP3E{}$miq#PKC$rlsOMFI6bS3?)BbZU09E+i> z5TDx8(vICb)E*wueX7=B=xH{v@iEUoJCm);JuS8*MKVk-i)}F-oQwZzV_8o&nq981 zCfB47c6`yT?3O>U|K%M7JoHL`N#o4tyVg&y!MjWK(z?=EEwYQGi8`1&xogg{`z7XS zCj~FC^~^GljU10ct-gBt&c47URsA>G>G2E$A0n{sL~lOcqzbW(`?3Z@N;Oy{t8{Q+m9{LefQ7 zHgfh0SqjOaXXbg@=o_`H8(Z0>Q)9LKCO^VW{BAs{ zFZjJ^Vr>R|kd~Y503Qp5G!K=@)qQPw!fJo*rU(I6e1~r(yS#MGHN~wI9V3 z57~jIxO6oJo`bD?8K(zMTGGbCRk{474u7$uJuMWj<#!F@G|nrmcV!#w#hfzfGifLel5yk0!lJ6l(f6V2c;e~>?2pEFRIq@L&MvFb zm2Y;sb(XVsNXFUzdd$iV)y2f-K=KOS+5n0?3;IH>6%T6{`Uh=k?MhxfI}$t5aURV} z50DOxhlaG^32*E#AhFTx%;;kwFyhDPqd(L)H*W2#+3NHI1qIyCq0<+Z<1 zEjSY(6i;c{&YsK_Xh1q49tzf z)puLDW#x43g|d}r9uhz3lW$#XWSg%WXZ+zjC`oK>BnmfvA4*mt`bA^cbhe|C?cLE; z*ESbAS9~5@SUn{Pcv;lSYg=0@&}z|~Bn};EYvT|LjM{9Lf&k`0+% zEek~4qbr|2aPCIHELc<#3q+lyvKh{?@T3Xu!L-=XRVzAt6AiMgm5nP|rK@w*p69@s zJ+AJL$H2P!x<<6<`Ar&HiR*o(n5>STj+BZQa1^O*}LwwGw0Yg;K9*OYZ6JF5UDXCKVy`IUL39 zy_|uVzOJ(GWGSAKWm*6M{$xhu#i=54w&LmWa#BW16(?FQv#CY?XcT>jpD5TkdT%b6 zRk&9&1}^B)PDkYX;wa zl7Nde^MR#JUfRB4yKwF|I;8J-JEONc9yIMM=f0=={Z0yWl!dH4rU8@(EL$iv2qWG@C7~ zyZzQ~lLRV3-9GtiF*zOi%!b*#_+-Y}9W7Vbu08}7sCh}dS=n<~)~4>Qe4qlC8yocI z7uA(uJu_{QXnW>aCkiCl1MOOwqVe_4D`(+d9?L|skGuA;+~F}jT|ax8ys9}|cj?f7 zSCdyQT(z0EW?>|0)Os-J=seZAyy|3k$shlG7`HuJiwJA_S<5@ThKm=aZ`!SISqpgh zTnT*iN|TE<>8&*s8F1jAUU%i0CQsX4`&_(Wqewsgag8f!{YssFGvJ2vH(x!^(nx`9 zHwt%+%4k_hoV+{_C57~Y$LLC4>^zTL?H}sE>~3x5$V(Qn=Tm6_W}GLvV>t`q?ses# z4vT>3t5*`F>3ezWzMlGKgXsl7;1y?*4LTO)+R|Q=YLt@v`sty=vz04PPnVmi?%ML4 zUqPKQ`Dgy071SnIK9$*4Q1K4W>Uin*MASU+kB@m$o z?fl!kOMdG?*?aV+rL5v;46O9p)f2L`lJS4{`oA#!U%vj2%zkkS8oJj5k{`{d8(zDf za`;Podfla9+lxC%-2W#DyI(}Bz2}jjUg?g@^~z%h_(-!$N3$%dlUcGxcdKdeNt))h zfSDDN#J0h`vZCY7CD$5GZk(rEN1fFhugEe$cZZtO<}S}MN%HL_FH<*r}tX_{~ zif#469l9E~b1{EV&#h*+zffqNXtrHHE;BXmNWi!3CwpH>z(p=Q=ihsm?PeRru+okbVl~Z)3VVvlf-f+%dH!|fHuwGw5O3JIZ6Ag-$U>YqB zCmj%yi}5%L%dXP05})Y|#Vg5eTR-c*9y=oVJ8G{<6`XA`_VisTCF|f`DY??JnAUdk z@RJ!keVHxmNv2mWtGRZcefCTPs6-aIU}E2-8{_sKtP_bI(`0ea}6}+a3rJaQXO7%2jadXfNhE7K8FgIt zEX!`($#&BU3Cag{@BOY%=ASI|YJc6Q-MnwLl3b4;ZaltMnqf&UMH&GOsLtBx z=H74Ha=m8d*OnvGqs1eSZ6iaTkaYURL=jwH7PPzg`Erqmy_5xth&XF~kiL>24@Qqy zc^Et0EQj5B0(%}Ae2~|3PL5Sf3^(goi`t7n) znR~sY84CT?hwz4WJRHi)Rf}jniI$?qv72V{`V^vvKb3}2s zsBmaPL6X90v4Gx40Hr6^z!>&EuW=~)@W>uc9#a08?QB%av(usH`r|q|pV%3nKJ_{C z{;uTK6IS|guci1_bYA;N-Y8$V#hs1K&DK#h2#20zv=FZr2u3}w5zvS$4|jRbmO)v2 z1S2}T!uruyJ<<((3S+RNt-Nu2e*+_Pr+@rVqJc0G( z8Sw!FDP)yt7pCS-x<{Yftez#xC}xOE!h;C@@u2%V5yrg^SZW0%UbbW-y!?u zHYiC)Yrjo$8p2sXy*{d|YBO9{A1jXjorPLUFQwVm>iF&~6+h`SXh)iGEN<3E?#IH{2I96E zD+|?UA)ag0lq;}lSww!fx=+8YS&DC2Y`o=3&6~+1d)lX9ZQdR1<0-h*@7PKno3@L| zq*Sk~bhG)jiulI~T346w9GfA<)o$?WpN*od9j5FtoZvMkE`px59eYaB?$bh?uhfcD z$3m0z&YZ9>_hCCU9#79kq!^>+zst)4qWl237#lS_O%q z47IEKmAWUvDUJjs>h9Waw1Km9kU!1A9S+(f+i<7N@|UeadtPsmtW2VugC#c8w?>6$ z`-X+@Yx4>=ofKK}7rq5rJ(Eecy7AH2r4`>exVt94@=juLtTj2&#^yoSJ&rO8`CmKH zqQhzcp4K`2g){X!^~+OB&mZXL*iaHU@`jg`oD%WN_x_jU{=STTR%h$-q$E^M+%FMU z-{}s_ti8w#rx(eP7s=5fOy#n>meaH6$tHZQ(82*StMY_28kr}g(Yp}xl=>Av$SoK< zU!wQuoGj_Aby6?olR&M#o5l8x#KsEeUGZNz1U%G^znI;S?J5(sk_0} zs9-MKg zOZ&ZSYAL0YUGHYs`AFV;_2TU3%tA@4-xBOBc&s~LIhMzZ!n1SmYNOe7wa|5=SUji8 z89w&cs{8ydalMjEvn%pEo_aK$B(C>l5bS%S1X#75KDEKIc}zZcS7#y<9!`w*4ecv` zcUga$IXs>@E>Ag8BpBDME6?>=yxkMnXE!A)ZeG1wR+NxBiqNuB0B!BIIMHezzxXy% zUo!I@CpcY;YW^s0L~EW4JKG``zOc~_tu(rpaFxnOF~AQux<#|1{gJ+BwZ_G<|8$aF z>#-1OXDj*Ou1t%nQ2^G~#`+rwcE{9Hx8k?d9C@xpQINIly2Z5_bo0XgN(>(){ru&c zt%@Q0^e*kiMcl-hi4yNE9$q^q^)E2US9 z$LH!2>>_|xFt(26%Hpqa!MOC2gp+UMlWcJbr;W1{)A?H-O#7=h(hOb@aaOD^=6MRf zS+hN}&bMtw9T(AaIF06Xyk43|EM{=?^s`2akGsB(pSbMWI5LlmsPt^*oo2T;%DnD< zj;iXQo2i{OKdHeLN^Qc6bR+=udqAMR*n+Iia zFX+;Z1qY- z9tj@3uJm>+&h|<3#=SkR(0fK6?7IJZ>0}b}E*{(r(6_S^*ty|e8k+O@OHmgGtBE6d zQT>{uYy~6_+Z9#5l}^%GbELDyomi1c6lH#s&EJ(kRPfCcXXAqO)_StI6H|(fTJiMJ zoMJhp5jKBfGN`y;t6QE?eCjr>aL6hT*g0(dIq41Z8-;7Du4!+f?;5yRiRz6%@fiJU z`Dj5K-J)mnJ~mxGw{z9XX2f=zht^|Y2W8JGkhQkOaK>q0>d*7wU+2_oFII|f7H}_p z$xl0*ZT3Z-S*dkuJ4Y8=Px)pN@+M8;6Qe*;=+}ByA))9=b8}y4#y2XdBLG48;Lf@5t(JvdHV(m0>lH=d6VWi=|4JMXi|G=x8V<`HTB;Lf^&iAx#4^{+~h zZ2GDye_dN_)WFrrd9=o*RbN$nJ5)|X+?9u$V5d*7G_nv$ zLTt$EKql)0kiT3+^Bmffi2zS@t{!*{f;ZGpd$C;qdu zjWFVZc_+P`c#<`&6=ctOWZ2Oat=Sa6KQ%be%tKXPvLre{|COVBA?x1fr`KJXgs;f7 z+99Rno_{9an*eW^>P;d$5A1n0@u2^C`}{8{^oqL1M{8D4Bn#63wgu$Jege%dw8EB45}nx%jzKklmboBcF-?YqUseC`(p8ah`^o zftEA7+XHE>fZDrb@ZM@z`|@zr*lAB=L9Z3{w8NJ6nT6f;t>x^h`TWxp6!PwJy1W7h>Ep~hDBGDX zh<)O|-XIy}omKDNRhqp@wD0$Rl2E^*$+AvvvhitQkQ&Q9rv>%cc;l*P-0c|m`GBXS zbj>M?onWy0_P*JJ!jT+Kzx>6_k)5M8dm(}KK5=*>Pd*jhXO7>wp6wMsHg2vhyXFbUK2Ti# zxw=bUB(SnuI^5?WS++a$p(IZ@_Lkg8s2H1kg1KYhr4iijj7kc3S2^TGGC^7!+Z|`u zW`jKN*nZS!SF4>YVF2E2qWF^~Xj_}qQv|>@X(l0k4mDtf(ae#| z!O?5uj@CG#q1M|$T>8=s4dW^;HZwPGqxt%Tr|wLiRbQ>+u7$y#Y@*?+nU(r!V=YPV zWCeO1&8~)4Z)YqyBT)>103PMA@$R>PI)=G@B;RxV%ft#({7i3P4@E z1#$ggwQ{b>9fqyASF0!jt@M`PEB56$Ot>Ja;!t}d{gVG=yLrzQQ@+L?k_Y)_M|~@D z9j}06;~HJ*y;8qR<5Gw7bU>zTZd>qKlv^vo-D-x8;y#{__bsK_#l4@XS=_E^F`8Ek zAb6#vbeHw#E%;qIW{JCscf~{fz&{q*j1q@g&sA8`Nxv9kA2ZD8~=UAiD76 z?(`3ed#_`6n~&a|Im?&umvoN>q`~l9Ka1)+!Zj{X$%^}nKB$Ptw6!y_D|_C|L@dcx zTYa|wU{`0?s$~Oq*l0}DIl5jO%KL*LVkh<0*k%c94djB)t3H#twj`N##X%C@F<=K7 z98!+5Bn`sOR_h~R=Y84vnd`wP=lCj5CAZbBalZ51Gj@G9*^|cZO_qIz&u4bOwwun@ z=F&hh0dM;EtSj6`l0-T_(M*qM>>Ezwe`O5w&QRAY>uYYL&9o0X{A~e4XpK8?^~_IN*CaF?zPyQW}@$mOq*#aNVqLVg#j$Ir~hmJ+I{v6 z#yqMyd$o0im&F;A6`^xy@MaJAWcTN!W>vZD2qnpsbntw&jqDJO*$K?MD&F{&jp4ZY zZDT~*3c6>jjjTV2>1MT^6jyd9Zm~gLxV#;WkrYV9j5L-vtasf@Q`F*!T+aB_LwsZn z`Nh@dR?b~PIQY>)O3@lmOIOvqtq66dExOAvs^e9QLpeF$mFuykGAhzsd3nZ*cK^(| z4;o($M{OLhmXkcmHqSSaF&;9(Z?5a_5uiN;cgkne{R@wbExD-R&q> z{nxMeO7~^>u1R|Jb5|Saq!o06)-1j`9C&vz}ij$p5 zA!$;$_NS5X?=?LKC(S2yueI7csea?duW$L;b9PSmEo^J@Vz&aUI_$ebV0dfKQDN_|^zSPc1`JN>;@)4L*C zzF9`S<23tT%5j@jksUm!E7rQA{zQWHqUCb^SB&0OU9yd;bR9f27;o%)c3!gf?k*34 zGaF8hV4f(kD}h#4$H&1wc+(}=!B{z=Vr9+($!YbfC))7uEZzPOp4P!^jU<-#^tcvP zdy-mdr#U^q&(`{${KytAYkZk&{~vfbV7d47Q`$&E#fPOgYb^g---`d{iS(JRH^ZfC zT*+zrAIYm37{4^Ho|p6GVyz+@UFjK#`uut=B3K~g#mB~zMcPR7bd+a$mfdfD8qO;W zFy#jK{-qD{U&_-qsPJS9YvWmg_VA(rm~)U#z#+@AoukJLRzngKl{4X?Gp`r{!kinR4#>of;%zLNf%<#uk1>V>$! z$H6~*Wjtp;HoNS}`KwA-EpBuv0%Tv!W~e(>zVWPU)NG7d30^HbtFq?nf8S}%TNh%QI~w!RyG!IFzSbLW8JtrDW?<5Y-zhi&=zMk5n;B@tE6EqNl4M@AvI%dRL9Z8{JgFV#}e}q(hM(ZJmuRom6(sh(CpDX+BmllvV+PUsrx9#ca(7jl~ zaMf~D#x?omsl^dEMRyd#mwot5VxTRx;OHYF=NIHe=69>DNihnts$dewy*~nLL>k zmiy?TceIeuMvgeTMg?@@aq)^Nc}5hfPLf;Pbf+&`ak+FRDKvO_n&hK>DLS&tHkRUJ zPbZG}7M~y{??dVJ+0s#Msp!pzNjSa7H(HAOMb6bm5^$HSmgl=xc%tdyB2Gy;E4^}c zH;N?J)mU}pcsOtmkMRv|lDS4^GDx$lsdNEaRHT{J$h9qb|0c>7<8rjuwbbZ`nVe(? zd10}ZWy5Y1DYKSrDo^m_K+8D#ol{|x;$NMFZa2|gCmivH3cQ< z?`+}fh4PIsIEWuq<{?FrEQ@Z|12)1K;c2#W>@EvQZ+fi9xz@L9)F(&u=({-dWzXiO z>^n)Dxp&R6F`{dhec*tXT#Z**ET#cPQRjP)?TmWxY0Y_b#WepxC1vY$aT?$7dNpdbOt;16)s826 z>38f?pJ=)Px#vUgYlL#2cJ5}vk*4LwTFd=<6p>B&34 zOB2N+c)V~H&fD!xDzz;qX}w-O$turt*`a8oGP`TLt-IWfV|R1TtP>4uTS+2K^psTc z=W@5}AP{(>` zR0fcrdeXi`J@h$I=4i4QedOCcE{=cX6Qs{eiu88B-<`Wh=GxzJ$fL^@m){}g_KNFf zNxhv8+BJEaKwGb*9rf+}vs-lS?7ZvU{uH%4%;1q?P_r-+&z{n5_LR5ASAM-b#-Y2l6fG;A)0Uk@d3JWR4`Vi&?-(6z zWWQ^6Q3%aOAMevQ9$?6ei)ZAp{e!6I`4)!dKR<;b>l#r1t8e4-JouB~i73YYf0f;f zjw{KMoNGY??a})`t!7Jt4*&Yv#)GwbV{q7LCK(yw7jtv>$Rt^7nUT)#Nas@$&g<pQ94({A^6_m^>fwN8J`;vtC7*)|;L&#$;D$BIAZ z_M9I)wVPx4TUFGX+xf_S%#kf2o~1fUYr|~ck(8(fGyy@cIT{`EiB%FXXp;>=2D(YH=o)Vh;ZP4L}e z6={CcThGbfaqiBBoxE$$r_#PTnpZedomcNezZ_0l_UD0kWBH_11MnhT|I{O%tqqy( z0;mWgm(={e=pH}V4?BHRH&Brv-JIkeTk%|vOK$SLi^Ftp4H;%lkI02iT>3uOI=Lb% zx)#~5eL_Avc#^$EVztZr$s23a0pUd;8J+F<^h1e-oek;VH78FuZ?Ch4WDLo^tuwpl zbj3G2-|SHllHz>a*xtld)f+`V#OUiPoDh%V%*dzLU1t zVV`=)@1)TOqtBARxYXL^rWLLi!aT`78Q!&r?#pvyU7geoTp^?*?XpURk5%x>!z@{y ztb_PlN&D3f6lLl>x4L(5bvB8OVdVJ$op0a2al!2T?-g6#m>VZ~n57G69FMoKmJ4yW z{`kA*SZP-}Taw6XeofPk*a(AWu5N}}TYP;c%S%X_We``-~d3)7p@u~*p zd#Kb&b;x39g;y#S|4HupyML**f3daSB6cSzpC7qW^i4PngFc?>C*h)@=!W7otx z=KXX}9wytnZRdc2-xi8=Hf%+4x+}DLe_dkibFGV+ztM-L$XtY>&yvvY)4wW|Z=v2b zgxy(8m$fknHZ0EX+sDE$3wkA{FM=N@exiW|?ku`G%DxcUo-a#9=Q!SKtWZaqW7h$% zR#_u=!=&_&!E%fru^azi1|*Z`_$|5@pRB%Bq3C}z z&hy{vl9nEfTV}wmci8F}pH3sstCf9T;B#)arMbw7!e_z{^3^tR-LW{I{IQi5QE*9Q`uK(E>YZ7Bv?Gfr zV)15ikxf(RIWL>TaTXmjSlj%VW@pZVB)9_UJKKJBnhbcSg+1mC>pQ!cCYvp;Z{t}O zhRRUirw3(fyJfrNB4k!}i{aiUFY0CZ~v+CBj2$IX8{dJ)|7-K?GhO8AgrC>QzAOU^o#N-vvcF+Oc? zc^#MDtdC3SBJVNlOHmwz~1BMDPb!(odS~#3eXG)GI;`IA@ppYUzGj1ZT+C=t(M4Jv+wZ}% zq*XCy&uKh-vtZfz@>Eug)o@Br9$^@6COrf@@?Q)ai&4#PCtvlh%9cH4Q93`TelWFX z2wU+PmLwX(?u!5}H6!*~$;wc19fpfz;N-yJVzs!i72l^BelmwY@G1jV@xufHt<5vv zLkgatYyC^$@EK6H+Shn53xF^;_DyivsKYeW` zUqS!|b+F&x$jc^?Y1a0JF{2o6Z`Z2%fkh{Mxr=S-Oj~}p>+=_1-rtbgPqaSG?5>6# zPm&?-qI$@?Gpx(ibuhTu#gW9b2lgU~m24OL>>UTPcpkywb|K9ZySTl7KV-Q@9Tm z8IpFn+&S!37uR#_x@I4_Ck3h@nl{#Vq=~ySv5qKJVUby?wiIE3T4$ zYd_|Y{a%r6ceXC`9d>0ktyhzM&!)F z`JKUQ2!~nn)7G;dg{L_3j#ho^9MdC?c2}`pJxkKo?kEoHNRG{W(6O! zrk%l?d7WFLQDk|U6|ZIZ@_rVC0n3Hg zHZ|xypXPiUGH*@$lM`XM{$=G~@O~Y}?=dK}$UkpH0QO=6c{<@yZFW7izm1!uu~Nmj zyTf_a>eg0gi@!>SH`7vV$XLt|ArWxTEDJmHUU?J)?EF^@Xw7;wJ>i=sySG2PO*;6V zRcc8LzDl)x+4=G3s$ml3#*N9(&SVk(xHf}|nb3f@-c;Sm)~uH`YEg0DjAiI@Ct0$s zku>t^trCr}5&FFwQ?6pA1-5Dnw%gCki|WM?$UBeomP{V++Pk=lT^6Jl&ta3bJb9x^ z^UD-y#4Z&vJmyQs`J6?)4%PJ?*o6`O=8PAvMsa!7Yu6IP6{=}$|JWYcJ~DsFEh^V% zw^w0hK8iTY>}7@{8DkJs^b#{zo9^VyJM)vv(>&go$hS^BoO4B3$M62lKR&tDU({8@ zlauVSSRLo#Va!Sr*>UJEq8*nx%{iNA%bQ_CF=UeNT>4+etYReXqM@ERx2`K9-<)X` z&!7jPkeaqusTtVOxvTbYaW$-~yZ(-YMf=-BS(O}>I))Xmo^cRE(lJJTUi`eacBA4C znQU(LBIlPCcg@ekp5@ichhu!v?Qxnnua!7lCCGQVe%0Nl3|+N|%yh5Puk*L^SRq>W zQO4QOGeq>5`@7Elnz4J#>9;z2W8y3*R$2S~7}usz1=sO;+^X;UPHGZa^WWVz-^t1Q zI(9zI2S@cPFJ=k-;r~6i_dR&)Tw}*V42~V+Or6w@eIq+={qoA4Z@<5E|3$VYE6e?U zFYb)*$vp(s$N0Saapf+1t$KHN`KV%UZ_`XDWRa^{7GSZ8xU8}|x%I(f?%VF}>V zio`k{X;{-and!>cULdL2(Zl(C`0iL&k<3_DrYp-mCmZ(nt)%Tm#_P>a+iX2%XNl^e zI+2(Uf4({{nw_O=zbf%|PF(x}@;{$=KmX?mNkh@S#-fjLtHk2an$^nm&az{^ z*x+!Of1LU}>=288$Q4_oRg_tUJ?ZJ(jV7bft5anZ7Jjd`PQ8TgS+66*=n%o>MM39$xzx;L&d$)BK0eZ= zs>RZGg&z0*of?=8on$qVN86{w#KrBrSrqZ2cj^86V_1we<^29)x8DhfY$$H`SyqIP z%EFGJg*iNKhAgAEcdkKX1{*~peiy4huTgGPUGLidq+p2M+TFX|{vkYAnQr_F!*4Xi zDzEg7n4~NC#CLZF+-DJc%qHueKT3WwLzFO76;)mNI8HU|*g|^MeSdejHCcMqO!nr} z*l(|r?JB``5BY=*W8Y+DV;0NjL+3X?LW>_UAX`|{N@otm-y`YX3fipN>vX;K>AP~y zKKS%JYsHW(7}%@wloi>w>>g*Um0LU1MdbT#l^r0Y@}R3NpTf#?Qqoq1+c&O6E>5>* zwRw19M5r&4p|d>?=BiL)s$$8ft6W2Y_1}!>9mLbInw_m8$JVk}EzI-P-|{%l>@Tu) zj5|H}$=co*hsIjngBL2piSrDxlA2;m$yJ#e>Iten2^7;?>( z4R;?rSwrB~OdeE{xcp82S!HcnuU0fOpOcDX&LzEhaOShC;%^4Ob8w3f`F~jd2>ZdV zQ8tlQ&IgTRzMpd7R9!3Wr|# zoz%a5ez(x?rRojW#q%N!ab$O^&N(ut~|)L(6RHdvr9(4?mMOsl$Wl7 z!ty!_&6BqniO1`E_TdQZdmjIi!S*l-Dfqkd6Ytj@#!I^M4mVSi)WQUl_ z*Zsvh-`{z^(ZND?Ek}ys{7A=qAbFY^A0O17v8VaFg3zJGQD2(0yc-K~Vta*s&ucqH z{A3AhstoO5@7P*Zv0biylW!PVjIwU~jgDEfh^(Tpqnh|~a{9%zRWYDPxM31*;~pEu zXEEG-_E<*(euhNrAT>^BN0~Q2c2)-IU$c4sB>$l|dxmS?OHu2ruWVvn@ zhj31s-3eddUu|r(_2Qhx%_r5aJRFKZehdrD%gfh}Z$0A!TUqyayMjf15>W@mS0n z>3>?vrR^y~p));btZQao5WTfXY+kgoV2kaoAWSB%4CeUS34_;S33<=)Zenf zg!Ibf#YI7!Up2(W*T)y)I zVp+X>8n$nj>+Ig|IP9;_LYh}&rk&*FRF-BRp0kkW-(D8assv8I+)gs~CnIaz(--}9 z_L~K%@XX?6r{lVnO0!(V@^rvoWShgQ)eshzAL&lME1>;#-~L*>zw#b3c^M8eRozcA z`y87C&!Y66YaG7I((Lp4ts~{!aXOpQO2=5Te07edG|M5sPHngGT~B0w64QXq@H_^n zF2}!llkKyLHCRFl4u)aX-nF+_VSy{jc2QwHu7*wsWcQBwvaBtWpvG@#-PthdjOQ%0 zdvo71JK~q;JRIKSs%`Js?IYAE)%r%0^&L}j5To%@-Z$^HK1-5XrC;sXobC-pV*#VpC_a%j@da z?j(#ZwpazXT^Y0r>qH6Thq*4-+$5_#RnE?bb@tE&&&E4HzN#4MrS;u`WEqaODjOgp zg7$2a(+tS`Syl57?#F&UtqzGkU$!sZFhc9T&=YIe+o#)pdBxTTvS3u-H|szft2a-PgNuvVKzclc%%) zm@=M1d%Z>U{tC#)lZ)Y4ii_vXFlkMm&zn|mjrjKtTg$ciGX9*VW@nYXk8JjtQ`}T> zlJHiNA^OcUpBdC+w^ND1ICyss^uTP(rsS$~zI|nNxMkth%_7MoSu)(?cl81nk}3<} zJiCo&ZRZ{NBQCNqj*H`}Pf~7el{IDup8c+)t?wNBi^Y1& zj@J({&z+ucjvPkwj9hg|92$Y${NOuob~bFom@ST0wXO&0v?Xm`cNCF#9zJwVe3JDY zgEV2pYD^L9k-Xa-wT_(EM)Qs}5MIsTk1NFUiw&*3_~l8uT%W1`z3-9b*=DaF$5`go z;mcO}pS)oNmDV(tcAPA;bQmkEqSX{v4$W&#QQn=N#X?Ys6{Ml0V+bsqGungde@yy{@YLdc?fNjI`>q_Plu$hkImi_Bi&wGjh;zNN@j` z4E4NgR-ba@0S+BoPxkaANe8H-f8WPsX;H4)X2WW@EJ;QZS3{S5Jc7ORp0Q(9=dOgx z!Nc$B(suJ=m@a)RyFyCl8HS$hvwNmU$@)cH;;So>YD}<54oRU{b>1fY#2GF!QQ-k z%DZRNJ|`yGTU^&qn)qL>nExUZE=iu{m@sZPcS!0wW2Y<6>-|!9YdhV#Rt1$oq71<$tniKU_@S)ucvhEJ#RW<>KlbLty1n^%9}lwZ`^rZgvVVJFv%;jvu{ZtU*oa)AKmHCk(a$zkmbbeGQ176Wb=b5% zOg3F`!HaTIv=-CTk=?CWbuc$B_Gtb^H6M(3p2Zu(n2TRCnr%Ewmz`lSIlY=s^gy?3 zbGy&`&fWSU^n7y0|K%N=VnH?GYGYogI$1$`2z-x0p_z+Se3XH%U1MRhzHt%ZmuX~U zkA9$Yu>%L!%aWGVMe}m8D==59vSbVqDROaUBWG_>Q}3EFKeJoU=sb;3oqhQ(Rxvyo zMJmLaq2I}mRUUv4=hWd{;C!sj=#qtog1CA};Ih>2%fMFAuDr$PO$y1VU() zu$*=8jyJ6wf}*^4qE?l~;-Q?Rmp@SZ41Mfde0WnFjqvHB3gO`{D<&W2dedx?c{IRb z67p3Rx?Ws&Gb^jIfM+UQxNH|APls>E!@fCo&LWsa{7UK`d|WIqR%DsgoW*%)vETVI zUjB@QJHDRE8x;yav#tHon7aHas&+#dTlQteaDmE2L`5opx+=fxR%jX5vvEm<7c;xU zd{@2TDQ56YYyRjM_7CL}P1{wftF8n3&EM|%wHH+l$EQUiWQ!Rr)EGT&buU(|M(0JS z)NR!2mz{9|l8&m5n8=ZM)_c5N1oKv zG|p$UV$SSL{&VJON{*O=X?K?j9O<7}(sLpfItV(Uq_U5fwS*i}OLTBLLEW?H6 zs2o}@Sv{6^{OwhhU$j)ox4xz!WaP7YnuN;`sOBB^y^POmaafI5^hAHYEDzqy+#YNB zi>)$RWg0`1$-i(6ucE$sndKMl^@n+E|B^>^$5_@RC7(io^=C=-&8J=cI zSV6Fwd)=n1kQk){gf#nPJ+Ee&IEDfYzuAzkEN*nQe)?xmp1hCz6TLT|zF*&*3uxOyv(=YdSgl6njO)e7t2p003EBU%$qeUkFePgVEtJc#<{rStdN zjX_Jkhfuo3%$Nw@Ecr`bWA9&$u2WPxHT^!_ z-`=dq&z|pB-`=Z|I43iTV~d?HnZGkc6|no!sshV1D`0^-#Zs?~~hcxy>XI^L zIY@3cs&^_z{LKU258p;YYaX#G>8fz=$NP>UpFhdkt|oozE1oPyc|nhOWP$4s9cb); ziP_EX{l#ee)buQ?#6oazxSkNocfsr*A6%xm_-q9}( z_}|zby<+|Ln|43#g0@e+ZYX!u3$k>0aVT4gXvkb=VLdC-%C=tp|9kzNIotKA;ZVq1 zY@a?YS)SE>xo{kVy|2xWE$IwVuUB`7V(@NTsY1DaKx*gcQDI?ULTpVc;KWf|Yuoa~Ess5i4&Dna#OzmWWWg$(1K zW3bLiYWeqlUurh$&9g`cl41FHStSy^??2Wjo2IO$-3s`a2amjJ7E5l=u18K|D|{!^ zzl*$kL3pYn;`}tgu60?b(HrGQP_@M@#f7!uEBlLY zTIKi7k~HM8b-a+LAx2j=+=I^5dsl8@++*kPSiY(UZ|&}L*Y*!Ow6#6+BFog@bsJ2( zTu74&DDKOX@U$bnyu;fhyUO%=ba8HnsRq-#XHi+SjHY27yxb4B9)~&`@vq$3)ywkq zj`>!H{>Mjqe=ERsGnu$5cA=-&$4`ABF5R`n#zaY8`al<=e74%;=$2OhCAzyO?E+zwkGW0zF#igcl0~IJ(D=FlvUZQ<6uM?{(yezu&ctbK-_E)Q4DnS^Eb=Ish z<^TBBsH(iUHgc=@Zf&T^>v){Sy(hV2k-v;E0^ey*?=&ADNXw&e2mzL!WcC)>^O)W2 zugdt$q3gZm;1F%I4V#nAM^X3gdu%J_P4ci|XJD2uV>&PLH*2we`A#P`(7LRcPaS*Y zGX`M78{5UDdGw1%yoCPY))~B{o76hcuD$H*mMw3zih=5Z%ilhS`zjK97t!q6>ulxe zj_T*uCiCX2e`3j#;X6NegtxU9#l!wz#Z&~3GvW>HY{9VC(-14__9TvM<7I0^q@%I4 zt5HQy^vhh|qG~rWH0%QGx9WiXwVY+T8omk}@9aU{$NP^@bpHJlgP7i)1NRp%yOGX> z^kwMc(h)xwJIKnq>2%E2_2F58LGEgWX|h5hU)Sk}N8{sio+o1rl?$ZSdDz{`{{LO= zr{^-LIsd9pQ~~mS+N|dHo+ZledAJUVDb=9xC>a^PsCt4xR2lDd_lhfWK zJe+v+$_HNiAl^RmuPFgwGE6B6euatO5BK+0d^bxpleoH- zwYxhHudBz|f4Lr_vaFqH-_Gsd&*<;_hMW#|mHM;rGd2`^$MV0+pgg4smV4K6HqDZ- z54mjNM^(k0iU0T<+i&?clV3|Gf%ee6D5O&yZ`Y^xl_%@;7fWklz*jv!wuMT_hNNiE zn<4P~7&dJAMros+W5w=*^d5$GnC=LMP>if9_$$tF(C#h|4=b4UehhqVN^h3W?vBL^ zMq}`@fDRZnYm&lwkB#vptd?;hl|C9e_JC}8G(2Cn=^S!AS?+7qujJTdU3O%Z+$dku zk|p-xyONj7W~!~eo#{SI77Y*99v|^CKcE~ka9HHxNS^4wcRpWV%w8NC?;+dm%X|(} zCa=e*DP8<=#bJyES(J>J(QbXe?(KauddAotF?Tto7YVDPExxVQ-{0dZqYQlO@Mei*NZO_S=JqQ3Au*Y3UG;lqt9!+$IcbVvI%t@% zl}^^P0-nPTO4);1^+x*x{8;|~1n397m-{sDIVnZ@pFdnH$M6tCV;fsnU7%Ae8%eLf zkEt%SHpyX@{Vce#?>LYx+T(P#Ljtbvv+1TXgr;F2dF-P&++}mCt2zgc^~tC9>!NucUJYp zjTPJdh+nco^n6^DTf@d8C8EW;y$~59$)n}(#c<=R6y#+++mkVNiIzHXXLTc^S;C9O ze|U8qKZ;7o;}*UwhFgF9)Wuqz_uqLltU{dB^~U?G>HfBe)k*mX`$T(HWKu(=XoX%8 zA3s?ti(|wr#`#9@3A*kqrQxICuSaY2Y`xw+w4s3aH=hP|BOF(m@+6zsE=#^`v4(Cj z)&eIq9FYjx1PR^L{K0g(9AeFk8>pbCZ`9S*t>h&&?0n&S%>+hW_;`43W#1 z2d#vTwJZ{=IOzKS-T%`f2Zlvng}@{k|1stBl+0|*`Y@O$uiec}M!lflQPsz)ANgAq zS@rJNuOqs5{QDDG*-2k<#yb@wjFV*#*im(!&1VxSc_};j1XCXHM77By=r>wTem~tV zLUI5GVZ@5veb`;wLx1wJSXTadJiIUJf1;dEi%`e$aIsRU?J4~#bUB*mdWL^^PpPvi}pCwvG?Ow-pU=XZmvj${_8bQ zcW>-0l->GXI#e+hUN_7;yTGhS_Ipk?urT{z&APoOp>@u}SL}yU8mgzh*;Fx zK9An%g;%ri1%LEjpLmf{9qdmq5+x9cD7R-!&S8u_-IeA(gkQ zaUWwp7C{I@x08kfccoxWUmGZ3)WX&$C#6PX?`-_V4p(S458T(%2bcai{_Fdi`W!++= zVzV%Oc+F3!;Og#w@9L%q{=o5ru52Mi%;p=sdKUBQRaw;M<%?yWT{IWLj(M5A{o3EB zY;}@#nbsUWMC zI+QM)6dTyILfm+s-}iSr(!{&8+`QvOt7NuroW{l`wRfs(cd;I`+uY?KotV@m4NhU>rt=P`Dn_ z;w{Sf=A1~0(5`>fhFRI{USAen7oGmjUlgvJ9-n$eyP4@dT%9rJ?8;AL=Jw9IJIaTv z?{{W1&-U$b>;a0Ibyb1;oYs9RUEA7Y$uamlv-u{QzrF8FC|v}z3rmk_Hgf8RXc z-rY4oHrk1N$5Hff5TBsHMpaz?j9VBqY=`qYNf{W^MAxW#niq{Gc^QeJ)3r*u9cZ}_ z_pGlU zAtEY`h_-6c%3>7?_xV+^&xe~GUiSEUc4wBOSvd=rmmQ03cwk+2Y_E8$$=EYw_HN!- zrNiF+$7H{_o1L#>$v-_UiP`HNM2fun5F+7_#m+UmF?$YoBk+!|;{y)aF?GEhHvAP? zd|d2qtU0rv9yQ=Qn$Tbi@3XG|WNKZgu9U~WC6=98$>({99VCRuF@x2{*!EhjqF})8 z9j?Bq5UK%-i+SG7M>$_S)E8Qs)x*q=i_aT>l~f*&HLVyYl4?GESoS?%%y4--4A*&S z6o=V3?(8^5gj^_;BX#;v&^5okm>)y$yl!VwA4-CXdN|CZtnVSh`((*CIl9&y*1U%K zyk|$xL$udpftWYqvGHYuF0=ZyS=MJ~xt331@U4A0_|C5z@m>Vp-FCLW2%5*^KRaOdFGl0G^@~JDe9p4F%2APFH@0^c&Q%B*IUbwy zjr`@8nC%LA$2uDQi$@k5vZ8rN108eTeezge zK4o*UAC4iL#@JOf0%-7x*5BD4FMz*IAhoY9eu<#p~{fg^%Eqv#Xvmu$aJworz z0tkwFHbQ;J{B9llV^0sc(yJskgGVw17Q0*O=z6@!K%O-u@hv9HmPX}-DC-l`a(y@b zd}85Sp%z695_6td6+g3`9q_-}NbZfwv(Rxp(0(MJS)8u>L?Yyp-T$&pj^TeEt$Jne zEIX#L36hIjHm_>Fn1#iwOZ?_plJ^>)?%4sf4a+OLXA&uWva z%GI*u^~fVN;o{5lyeSqPj|YqRMm9&Dvv_i=ZSGA}P2RXQ<6=5gc}nltgv(-OtXWs3 z?#%jj79I!0BW)}la%P8y-e1MqU4y!&I=&rGwpy8Ph-PQD@Up7FOSL0?BFtVaO2#m~ zsJ#67W~tI3vz#cC_zUNuNY@ah&6xFv5M4N? zR@MdY{&^T;DpvRIq~93+vpOASHB|@J-dcfaUuJdmuF+({9hl4UCSF%zh$OF^oD?nvHI3} z%#gW|THPFm*`3Awxt&O;Z0_w)igH%9I?sHfb{ap!pNF$qqXY4`St02D;K`q!H;*SH zjNLD5AA#-Zk6*rjT1{JQAU*u}BpO*2lilKN=A=E3+LGdPk6&U zjeA8qUGmQTI(cw-=|cFdnr~kR`PG3{mR*g+$sWm*K|B>*)lzr#?H4t%n44{N&unHR z^r0SihYTy_!90A|@vUgYZr2d5KeKPvv_dTNQ4AZwl63#h?as9x%5NleHan6xis9p$ zS0^o2X~Kmpp{+GNE;g}aI~*Jgv&AQFv1L~9`MOqULwUZnMoc@?>glEj!t&!c(z7co zhf&93unP2!522x@a*VI*N!S@KbY(@7WGequxb)%DRl9u5K6z%XIgS5W zJ(5h0S@RBxyF%)^>pnphkFCP~AtVFT$m&{h)FXANGcsH3TbE|Xye7d|IN zN4JxRSgBkN)BKUmu%KM>d&H0@l|( zc9#QdaQ?e@w)T6zN_W2u>8uRL(eZLob)RrM0@Wv`uVUP)|4P&9hKLUfk%v(|-(D#` ztwP0?9<5te_nrmE&%K{z;TPBLZjJAGVNLj|^5W-e_@AHI-Dg*^%sCC&JRWo|D;CLS zjrqH_e0#S_=>EtuK)qbAaZI9DZ}ijFd({Q2dhZc$bw_)i5Mb%;gzVeaDUVU1ksV_j zE|gIsvGY9jTohiOK?08!mvBm3S?6zObfqDiT{~c2c3y19k&|AQg=~+W^R2V4I;voN z3;}1&{Ve)H>^ytlV@7&^qdxS1BP7Srr>FvsvBO$Q-KlThIcA3kv;9#kBwI`s@(3b?LI3WnA!6yHR;yh zb67yUYJ|~QIE{I~9R)5Fw`}M6>=ozU%|f~lNBEn88==8I5nH*YQo?F+}$9Ekpit1L}$i`zrab?RSu>^vtdHtZZi~q^&)o;w%2pO?1E>(w+aP{cAZ#d|I>IY9*_Ga~c zmSe}9|LM5s$fPl%tP8(9!~Go(e~3389)~st@E5Xn%>K>M-G!Ki41smlRxCFHa8pY$%V8%>FtYdE!jT`exC9Y>KDO$ z@ad3l6DBYIFI%pfpXcfLo&)d0U|7(c1>!&J=1)0QrPFb;0z=c~8teOeF*K7GQj6g3 z|6F|xvp*lLDIsQv~B*lYO0o zgKUx`FL!n=2Tjrat`d7UIV7=nd3I4&19Y%4s*0KiNw5Q}#}*U%viexUi{k;TLN*)A zuVOadcRaMl27Z$?Jd3!M=}TT`Ab%BZxTR~6RPiRW8P4R5oX8JRo0i*gG(+@Sm;d*@ zWtovB#Uu$~qUWeQ>|rIDYN<+;Cw25XxjTw+tVf=aHFT1MPduR!@(?+se?)wIqIcug zjU((>J;H7B(-Zcsej|2w3c?>7T=V#(gvVpUvOZkwU0i?4-RVtA|1XkR4o6rwyV~5H zQQrwrMbaheMMbYXn~jKDzQ8j4?QyG-txNahq>MV|z0A)?jN6PX`+kJRI={?L^2e|bPWaXH zh^c}X7rO_0arf|b`f%vMr}eRmOn7#-d2wf-304)0SGcga zV>8dz@7g0m<=pOdcFf06>pA=L(Y2mEo%wmYdCm2jaqa9oIY8S8gqq6X>2$m)J*Q4ifSx_0A#~kJOM>$?3x=38IZ( z^<`Jb_(el=hE%vD>5%GOqx!|_RXKkA2$S;B9UI&(LUqIL;q)En?ceV{Rx8L!$Fle$ zpCwr@R#^f6p36}jXIFF0J3cmo=VdjHnm2#cllAO&Cj2had{SBKiZqJ8JXpOkTQuLQ zn)UI`UFEy>b$5#-b?!Jm&Fjvq7%EwIA0~U9XUli;;IvV-YyCDvMDEsYWUOyRc3-W9 z#~7zJ@HH%!8P+cn+2;XosAXI8E}raDlif9ac`+ID8=updgw8@an-=?_Q2g^%MRye~ zhxAN$oNyyKt-Cm8qp@*)*zr8=aH2U|(o|im!|52Rz;_(U8FH%PvQ}*PCXPHzj@__OssmrGGvl~<>%_uLh$d??&$2_hb1d@eA~2LT_xwx$`|f)^jPHunPI+Fj zI-Jeu2;1RpXA#?*dzk=_({-NldcL!lzI-yTb=lmGqx#ifgz+~ST-n9?9&a@&uJo}a zTqmz{F~a_FJ#|q}){Bvx;`{6*GYNK8%jm;9?Z2bLKJ~k`)#E-}{O8Z#>edJ1OLr#Y zSL?IWzK?(H%++s4Bda^`!S)LBj z^AuWE99sE7t81A&wBu{$&0~XmN#8r^&w~Gav_iC2XGA)ip+u?<0u9~}G1OEfkzJ-G zS8m6cyb*ycizye8Ji@%PP4{1wwnJ;SOjh}lk&VTywVlO2JLtFGWhtAE)hePKvsRS& zdAjJp_$=GHyBBcx1hNIwrfutzGQYZ3xZf4^FS+%(z`y$bPb@1V#z+{@GH-r=`VoHN zSmYqRo%N!G>BX)`*3LdFF2Z@xT|fJ~ixY&xpNw?zu*zcZVKzjal@ad6`_y1nkEC(# zcy!j);Z`fvh)|F%KW;ovjf)0J;)Z|e=mEW#gQ^2w(aTHte=`B2()Nb?^h&1Y z`AJ?68~d|n`I1$=ezi{eJjI7^4Py5_ldPVvB4B|^&7!1@tLEh;Y_g+Ab2cX5(xmgp z7Th_8%goFBKkM3LpvcgUJF+`+j;t6Dgo zmI?XC7td@7fA`6JTE+{JXB9tRHg~p1IpaQ^cx6qR#?0&qZ}@MtV|J}pZ+!DaEm>RJ zF}u{Gu2-)nYzK1pH(@18H$24Rw1~xh_r7yjC>3+RBou1}6+pJlVq+PY`YE5Kbs?q5*3f3Kv~*;mKbabBJ$XXE@>yp9>o2^ZOCHTz;?p9=Xsd;G{2=b$;g zyIP8c;Yd2ElOAi{4DW21V!&Q?WTW%=aC17pHRA5Rfve~B>uh{I#8}kNDniL%Qbi6Y0F?3$+R4Ug>q)6;pd8Mw@@jeVAW9+P=HyJNikPJ{LQ6n|DW zw6}2~tAqpq9|9(CeXWwQnzm|hK0-K>{ zCLU!WIn5WR)$F9=)LX~xdzz{0TYX)Qj%=5y%LObBHL=9Uakcn`QgZASvd0{iW`8ei zb+maQzFoe2-yYKSrfY^`-P}5h`>%a|tX?J6{cHEJi)ZY3^Q-GC)mKc1v||`uWR_En zLZ(?5PbUXeSWR}Gg3w`M3MuQhv~2gb~|dx#V8D-V3Wk^NRK58UzaSNQw3S)KQP z{B>XCA3yhdy6>a!><+Q2mCZ%!FiCr;u41w#WI`M>id`J=4Hfx_ZNGh9?C-7%2}w%l zs{gGEmAvbG%okCwwo?*=$u2Vw&BZ4vCtJCod^l!>Sf~wr zV*7F(6N=?YR%PuVcV9{z#eA5soh!0@+Pa3eOz7qRGC9j#d>`&0$ITu2&Z?k4G-^(&gKw>Ym9)~Ww$ZB_?G^gBka(%aVPbhfLX|&xcDsd}l2?l9~*$n$GVC9Dm-K zt>Y2@)czM)$YB~j9NILnOGYQ-eV|+}=KI*(1)q%CpedU5j69U+;>sPsjiM%292ZA04fx>D!Vb z-FcY*82Z=Ka8fJA)^#u)KDo`qth}i1bzQU1o!XgwvkOB!k9n(=`MDgO-)V|#MGiK! zrnkq&w&%!(&|AE-Ee}=n;n>Qng&|snnm6!Yjo3_#Ag{SJq@OLlQs-`EdT8HW56od@ zGDIZ?RmBe1NxeAmHHkgsM{->6Xz6>nt z;}9IuGrRIHS+QWhdFg#NTvW1k8G!eg5uUSp=%4i)nbu-!-)WCf=E9Y)S-%`;?d;rs zDvpT4W$tve4kOoljpQd=^T%V@(RzM%9{-A&DuSsY0mY%|n1yT}@-&<$Ne?j{5$eer JOMkEX{{Tc@ - - - - - - - - -

-
-
-
-
-
-
- - - - - - \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/.fxap b/resources/[standalone]/okokChatV2/.fxap deleted file mode 100644 index 98465e73170d7d845db8283875cbbdf976ad6ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmV;j08Rf!SV2$$0000004*zMYcE`6rLs{k9(PN3yCYsSfp1zhr_OFZMUjt~ojAVB z$TRQ3Nv7m&j(9X`HlLL{;+d#sKu2tYL;b*Z0+SzgD8Y(5Vju)j2$?=U0;)a%RuCMg z%5_a``#|fbb=)Xz2|&I4>KlE~tnMCKirxISFz(>&ekoSYwFvApg9$^K|*Ud5RL#&VE_OC diff --git a/resources/[standalone]/okokChatV2/README.md b/resources/[standalone]/okokChatV2/README.md deleted file mode 100644 index e71fb11b5..000000000 --- a/resources/[standalone]/okokChatV2/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Hi, thank you for buying okokChat! :) - -If you need help contact me on discord: okok#3488 -Discord server: https://discord.gg/okok -Docs: https://docs.okokscripts.io/ - --> Installation Guide: https://docs.okokscripts.io/scripts/okokchat \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/client.lua b/resources/[standalone]/okokChatV2/client.lua deleted file mode 100644 index 8bda12623..000000000 --- a/resources/[standalone]/okokChatV2/client.lua +++ /dev/null @@ -1,225 +0,0 @@ -local players = {} -local defaultScale = 0.7 -- Text scale -local displayTime = 3500 -- Duration to display the text (in ms) -local distToDraw = 250 -- Min. distance to draw - -local pedDisplaying = {} - -local function DrawText3D(coords, text, color) - local camCoords = GetGameplayCamCoord() - local dist = #(coords - camCoords) - local scale = 200 / (GetGameplayCamFov() * dist) - SetTextColour(color.r, color.g, color.b, color.a) - SetTextScale(0.0, defaultScale * scale) - SetTextDropshadow(0, 0, 0, 0, 55) - SetTextDropShadow() - SetTextFont(6) - SetTextCentre(true) - BeginTextCommandDisplayText("STRING") - AddTextComponentSubstringPlayerName(text) - SetDrawOrigin(coords, 0) - EndTextCommandDisplayText(0.0, 0.0) - ClearDrawOrigin() -end - -local function Display(ped, text, color) - local playerPed = PlayerPedId() - local playerCoords = GetEntityCoords(playerPed) - local pedCoords = GetEntityCoords(ped) - local dist = #(playerCoords - pedCoords) - if dist <= distToDraw then - pedDisplaying[ped] = (pedDisplaying[ped] or 1) + 1 - local display = true - Citizen.CreateThread(function() - Wait(displayTime) - display = false - end) - local offset = 0.7 + pedDisplaying[ped] * 0.15 - while display do - if HasEntityClearLosToEntity(playerPed, ped, 17 ) then - local x, y, z = table.unpack(GetEntityCoords(ped)) - z = z + offset - DrawText3D(vector3(x, y, z), text, color) - end - Wait(0) - end - pedDisplaying[ped] = pedDisplaying[ped] - 1 - end -end - --- For 3dme: -RegisterNetEvent('okokChat:3dme') -AddEventHandler('okokChat:3dme', function(text, serverId) - local player = GetPlayerFromServerId(serverId) - if player ~= -1 then - local ped = GetPlayerPed(player) - local color = { r = 0, g = 0, b = 255, a = 255 } -- blue color - Display(ped, text, color) - end -end) - --- For 3ddo: -RegisterNetEvent('okokChat:3ddo') -AddEventHandler('okokChat:3ddo', function(text, serverId) - local player = GetPlayerFromServerId(serverId) - if player ~= -1 then - local ped = GetPlayerPed(player) - local color = { r = 222, g = 255, b = 0, a = 255 } -- yellow color - Display(ped, text, color) - end -end) - -exports('Message', function(background, color, icon, title, playername, message, target, image) - TriggerServerEvent('okokChat:ServerMessage', background, color, icon, title, playername, message, target, image) -end) - -AddEventHandler('playerSpawned', function() - TriggerServerEvent('okokChat:onPlayerSpawn') -end) - -RegisterNetEvent("okokChat:getAllPlayers") -AddEventHandler("okokChat:getAllPlayers", function() - local coords = GetEntityCoords(PlayerPedId()) - local closePlayers = {} - local allPlayers = GetActivePlayers() - local playerCount = 1 - local pedID = PlayerPedId() - - for i = 1, #allPlayers do - local playerId = allPlayers[i] - local playerPed = GetPlayerPed(playerId) - local playerCoords = GetEntityCoords(playerPed) - - table.insert(closePlayers, GetPlayerServerId(playerId)) - playerCount += 1 - end - - TriggerServerEvent("okokChat:SetClosePlayers", closePlayers) -end) - -RegisterNetEvent("okokChat:checkDeathStatus") -AddEventHandler("okokChat:checkDeathStatus", function() - local ped = GetPlayerPed(-1) - TriggerServerEvent('okokChat:deathStatus', IsEntityDead(ped)) -end) - -RegisterNetEvent("okokChat:Notification") -AddEventHandler("okokChat:Notification", function(info, text) - exports['okokNotify']:Alert(info.title, text, info.time, info.type) -end) - -Citizen.CreateThread(function() - - if Config.JobChat then - TriggerEvent('chat:addSuggestion', '/'..Config.JobCommand, 'JOB message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableOOC then - TriggerEvent('chat:addSuggestion', '/'..Config.OOCCommand, 'OOC message', { - { name="message", help="message to send" }, - }) - end - - if Config.AllowPlayersToClearTheirChat then - TriggerEvent('chat:addSuggestion', '/'..Config.ClearChatCommand, 'Clear chat', {}) - end - - if Config.EnableHideChat then - TriggerEvent('chat:addSuggestion', '/'..Config.HideChatCommand, 'Hide chat', {}) - end - - if Config.EnableStaffCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.StaffCommand, 'Send a message as staff', { - { name="message", help="message to send" }, - }) - end - - if Config.AllowStaffsToClearEveryonesChat then - TriggerEvent('chat:addSuggestion', '/'..Config.ClearEveryonesChatCommand, "Clear everyone's chat", {}) - end - - if Config.EnableStaffOnlyCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.StaffOnlyCommand, 'Staff only chat', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableAdvertisementCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.AdvertisementCommand, 'Make an advertisement', { - { name="ad", help="advertisement message" }, - }) - end - - if Config.EnableAnonymousCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.AnonymousCommand, 'Send an anonymous message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableTwitchCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.TwitchCommand, 'Twitch message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableYoutubeCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.YoutubeCommand, 'YouTube message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableTwitterCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.TwitterCommand, 'Twitter message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnablePoliceCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.PoliceCommand, 'Police message', { - { name="message", help="message to send" }, - }) - end - - if Config.EnableAmbulanceCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.AmbulanceCommand, 'Ambulance message', { - { name="message", help="message to send" }, - }) - end - - if Config.TimeOutPlayers then - TriggerEvent('chat:addSuggestion', '/'..Config.TimeOutCommand, 'Mute player', { - { name="id", help="id of the player to mute" }, - { name="time", help="time in minutes" } - }) - - TriggerEvent('chat:addSuggestion', '/'..Config.RemoveTimeOutCommand, 'Unmute player', { - { name="id", help="id of the player to unmute" } - }) - end - - if Config.EnableMe then - TriggerEvent('chat:addSuggestion', '/'..Config.MeCommand, 'Send a me message', { - { name="action", help="me action" } - }) - end - - if Config.EnableTry then - TriggerEvent('chat:addSuggestion', '/'..Config.TryCommand, 'Send a try message', { - { name="action", help="try action" } - }) - end - - if Config.EnableDo then - TriggerEvent('chat:addSuggestion', '/'..Config.DoCommand, 'Send a do message', { - { name="action", help="do action" } - }) - end - - if Config.EnableDocCommand then - TriggerEvent('chat:addSuggestion', '/'..Config.DocCommand, 'Send a do message', { - { name="number", help="number countdown" } - }) - end -end) \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/config.lua b/resources/[standalone]/okokChatV2/config.lua deleted file mode 100644 index cb1522a7c..000000000 --- a/resources/[standalone]/okokChatV2/config.lua +++ /dev/null @@ -1,349 +0,0 @@ -Config = {} - -Config.QBPermissionsUpdate = true -- set it to true if you have the latest Permissions update - --------------------------------- --- [Discord Logs] - -Config.EnableDiscordLogs = true - -Config.IconURL = "" - -Config.ServerName = "" - --- To change a webhook color you need to set the decimal value of a color, you can use this website to do that - https://www.mathsisfun.com/hexadecimal-decimal-colors.html - -Config.WebhookColor = "16741888" - --------------------------------- --- [Staff Groups] - -Config.StaffGroups = { -- Groups that can access the different staff chats (/staff, /staffo, /sa) - 'god', - 'admin', - 'mod' -} - --------------------------------- --- [General] - -Config.AllowPlayersToClearTheirChat = true - -Config.ClearChatCommand = 'clear' - -Config.EnableHideChat = true - -Config.HideChatCommand = 'hide' - -Config.ShowIDOnMessage = true -- Shows the player ID on every message that is sent - -Config.ShowIDOnMessageForEveryone = false -- true: shows the player ID for everyone | false: shows it only for staffs - -Config.ClearChatMessageTitle = 'SYSTEM' - -Config.ClearChatMessage = 'Chat ist Sauber!' - --- [Date Format] - -Config.DateFormat = '%H:%M' -- To change the date format check this website - https://www.lua.org/pil/22.1.html - --------------------------------- --- [Time Out] - -Config.TimeOutPlayers = false - -Config.TimeOutCommand = "mute" - -Config.RemoveTimeOutCommand = "unmute" - -Config.ShowTimeOutMessageForEveryone = false - -Config.TimeOutIcon = 'fas fa-gavel' - -Config.MessageTitle = 'SERVER' - -Config.TimeOutMessages = { - ['muted_for'] = '{3} has been muted for {1} minutes', - ['you_muted_for'] = 'You muted {3} for {1} minutes', - ['been_muted_for'] = 'You have been muted for {0} minutes', - - ['you_unmuted'] = 'You unmuted {2}', - ['been_unmuted'] = 'You have been unmuted', - - ['muted_message'] = 'You are muted for {0}', - ['seconds'] = ' seconds', - ['minutes'] = ' minutes', - ['hours'] = ' hours', -} - --------------------------------- --- [Job] - -Config.JobChat = false - -Config.JobCommand = 'jobc' - -Config.JobIcon = 'fas fa-briefcase' - --------------------------------- --- [Private Message] - -Config.EnablePM = true - -Config.PMCommand = 'pm' - -Config.PMIcon = 'fas fa-comment pm-icon' - -Config.PMMessageTitle = "PM" - --------------------------------- --- [OOC/Me/Do/Try] - -Config.Distance = 20.0 - --------------------------------- --- [OOC] - -Config.EnableOOC = false - -Config.OOCCommand = 'ooc' - -Config.OOCIcon = 'fas fa-door-open' - -Config.OOCMessageTitle = 'OOC' - -Config.OOCMessageWithoutCommand = false -- true: sends OOC message without command (/ooc) | false: doesn't send any message without it being a command - --------------------------------- --- [Me] - -Config.EnableMeCommand = true - -Config.Enable3DMe = true - -Config.MeCommand = 'me' - -Config.MeIcon = 'fas fa-comment me-icon' - -Config.MeMessageTitle = 'ME' - --------------------------------- --- [Do] - -Config.EnableDoCommand = false - -Config.Enable3DDo = false - -Config.DoCommand = 'do' - -Config.DoIcon = 'fas fa-comment do-icon' - -Config.DoMessageTitle = 'DO' - --------------------------------- --- [Try] - -Config.EnableTryCommand = false - -Config.TryCommand = 'try' - -Config.TryIcon = 'fas fa-comment try-icon' - -Config.TryMessageTitle = 'TRY' - --------------------------------- --- [Staff] - -Config.EnableStaffCommand = false - -Config.StaffCommand = 'staff' - -Config.StaffMessageTitle = 'STAFF' - -Config.StaffIcon = 'fas fa-shield-alt' - -Config.AllowStaffsToClearEveryonesChat = false - -Config.ClearEveryonesChatCommand = 'clearall' - -Config.StaffSteamName = false - --- [Staff Only] - -Config.EnableStaffOnlyCommand = false - -Config.StaffOnlyCommand = 'staffo' - -Config.StaffOnlyMessageTitle = 'STAFF ONLY' - -Config.StaffOnlyIcon = 'fas fa-eye-slash' - -Config.StaffOnlySteamName = false - --- [Server Announcement] - -Config.EnableServerAnnouncement = true - -Config.ServerAnnouncementCommand = 'sa' - -Config.AnnouncementIcon = 'fas fa-exclamation-circle' - -Config.AnnouncementMessageTitle = 'Regierung' - --------------------------------- --- [Advertisements] - -Config.EnableAdvertisementCommand = true - -Config.AdvertisementCommand = 'ad' - -Config.AdvertisementPrice = 1000 - -Config.AdvertisementCooldown = 5 -- in minutes - -Config.AdvertisementIcon = 'fas fa-ad' - --------------------------------- --- [Anonymous/Dark] - -Config.EnableAnonymousCommand = false - -Config.AnonymousCommand = 'anon' - -Config.AnonymousPrice = 1000 - -Config.AnonymousCooldown = 5 -- in minutes - -Config.WhatJobsCantSeeAnonymousChat = { - 'police', - 'ambulance', -} - -Config.AnonymousIcon = 'fas fa-mask' - --------------------------------- --- [Twitch] - -Config.EnableTwitchCommand = false - -Config.TwitchCommand = 'twitch' - --- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip: -Config.TwitchList = { - 'steam:110000118a12j8a', -- Example, change this -} - -Config.TwitchIcon = 'fab fa-twitch' - --------------------------------- --- [Youtube] - -Config.EnableYoutubeCommand = false - -Config.YoutubeCommand = 'youtube' - --- Types of identifiers: steam: | license: | xbl: | live: | discord: | fivem: | ip: -Config.YoutubeList = { - 'steam:110000118a12j8a', -- Example, change this -} - -Config.YoutubeIcon = 'fab fa-youtube' - --------------------------------- --- [Twitter] - -Config.EnableTwitterCommand = false - -Config.TwitterCommand = 'twitter' - -Config.TwitterIcon = 'fab fa-twitter' - --------------------------------- --- [Police] - -Config.EnablePoliceCommand = false - -Config.PoliceCommand = 'police' - -Config.PoliceJobName = 'police' - -Config.PoliceIcon = 'fas fa-bullhorn' - --------------------------------- --- [Ambulance] - -Config.EnableAmbulanceCommand = false - -Config.AmbulanceCommand = 'ambulance' - -Config.AmbulanceJobName = 'ambulance' - -Config.AmbulanceIcon = 'fas fa-ambulance' - --------------------------------- --- [DOC Countdown] - -Config.EnableDocCommand = false - -Config.DocCommand = 'doc' - -Config.DocIcon = 'fas fa-clock' - -Config.DocMessageTitle = 'DOC' - --------------------------------- --- [Auto Message] - -Config.EnableAutoMessage = false - -Config.AutoMessageTime = 30 -- (in minutes) will send messages every x minutes - -Config.AutoMessages = { - "CLOSED BETA // Bei Fragen oder Problemen die euer RP stören, per /support melden!", - "CLOSED BETA // Allgemeine Bugs unter #ClosedBeta >> Bug Reports" -} - --------------------------------- --- [Notifications] - -Config.NotificationsText = { - ['disable_chat'] = { title = 'SYSTEM', message = 'You disabled the chat', time = 5000, type = 'info'}, - ['enable_chat'] = { title = 'SYSTEM', message = 'You enabled the chat', time = 5000, type = 'info'}, - ['ad_success'] = { title = 'ADVERTISEMENT', message = 'Advertisement successfully made for ${price}€', time = 5000, type = 'success'}, - ['ad_no_money'] = { title = 'ADVERTISEMENT', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'}, - ['ad_too_quick'] = { title = 'ADVERTISEMENT', message = "You can't advertise so quickly", time = 5000, type = 'info'}, - ['mute_not_adm'] = { title = 'SYSTEM', message = 'You are not an admin', time = 5000, type = 'error'}, - ['mute_id_inv'] = { title = 'SYSTEM', message = 'The id is invalid', time = 5000, type = 'error'}, - ['mute_time_inv'] = { title = 'SYSTEM', message = 'The mute time is invalid', time = 5000, type = 'error'}, - ['alr_muted'] = { title = 'SYSTEM', message = 'This person is already muted', time = 5000, type = 'error'}, - ['alr_unmuted'] = { title = 'SYSTEM', message = 'This person is already unmuted', time = 5000, type = 'error'}, - ['an_success'] = { title = 'ANONYMOUS', message = 'Advertisement successfully made for price€', time = 5000, type = 'success'}, - ['an_no_money'] = { title = 'ANONYMOUS', message = "You don't have enough money to make an advertisement", time = 5000, type = 'error'}, - ['an_too_quick'] = { title = 'ANONYMOUS', message = "You can't advertise so quickly", time = 5000, type = 'error'}, - ['an_not_allowed'] = { title = 'ANONYMOUS', message = "You are not allowed to send messages in the anonymous chat", time = 5000, type = 'error'}, - ['is_muted'] = { title = 'ANONYMOUS', message = "This player is muted", time = 5000, type = 'error'}, -} - -Config.WebhookText = { - ['clear_all'] = 'Cleared all chats', - ['staff_msg'] = 'Staff message', - ['staff_chat_msg'] = 'Staff chat message', - ['sv_an'] = 'Server announcement', - ['ad'] = 'Advertisement', - ['twitch'] = 'Twitch', - ['youtube'] = 'Youtube', - ['twitter'] = 'Twitter', - ['police'] = 'Police', - ['ambulance'] = 'Ambulance', - ['job_chat'] = 'Job chat [${job}]', - ['pm_chat'] = 'Private Message to ${name} [${id}]', - ['ooc'] = 'OOC', - ['me'] = 'ME', - ['do'] = 'DO', - ['try'] = 'TRY', - ['muted'] = 'Muted [${id}]', - ['muted_for'] = 'For ${muteTime} minutes', - ['unmuted'] = 'Unmuted [${id}]', - ['p_unmuted'] = 'Player has been unmuted', - ['anon'] = 'Anonymous', -} \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/fxmanifest.lua b/resources/[standalone]/okokChatV2/fxmanifest.lua deleted file mode 100644 index ad25b94aa..000000000 --- a/resources/[standalone]/okokChatV2/fxmanifest.lua +++ /dev/null @@ -1,37 +0,0 @@ -fx_version 'cerulean' - -game 'gta5' - -author 'okok#3488' -description 'okokChatV2' - -files { - 'web/*.*' -} - -shared_script 'config.lua' - -client_scripts { - 'client.lua' -} - -server_scripts { - '@oxmysql/lib/MySQL.lua', - 'server.lua' -} - -chat_theme 'gtao' { - styleSheet = 'web/styles.css', - msgTemplates = { - default = '{0}{1}' - } -} - -lua54 'yes' - -escrow_ignore { - 'config.lua', - 'client.lua', - 'server.lua' -} -dependency '/assetpacks' \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/server.lua b/resources/[standalone]/okokChatV2/server.lua deleted file mode 100644 index cf1a19239..000000000 --- a/resources/[standalone]/okokChatV2/server.lua +++ /dev/null @@ -1,1521 +0,0 @@ -local QBCore = exports["qb-core"]:GetCoreObject() - -local Webhook = '' -- PUT YOUR WEBHOOK LINK HERE - -local adsList = {} -local anonymousList = {} -local chatsHidden = {} -local mutedList = {} -local isDead = false -local checkedDeathStatus = false -local playersList = nil -local onlinePlayers = {} - -function interp(s, tab) - return (s:gsub('($%b{})', function(w) return tab[w:sub(3, -2)] or w end)) -end - -AddEventHandler('onResourceStart', function(resourceName) - if (GetCurrentResourceName() ~= resourceName) then - return - end - for _, playerId in ipairs(GetPlayers()) do - Citizen.Wait(1000) - getNearPlayers(playerId) - break - end -end) - - -RegisterServerEvent('okokChat:onPlayerSpawn') -AddEventHandler('okokChat:onPlayerSpawn', function() - local _source = source - - if #onlinePlayers >= 1 then - local addPlayer = true - for k,v in ipairs(onlinePlayers) do - if v == _source then - addPlayer = false - end - end - - if addPlayer then - onlinePlayers[#onlinePlayers + 1] = _source - end - else - onlinePlayers[#onlinePlayers + 1] = _source - end -end) - -AddEventHandler('playerDropped', function(reason) - local _source = source - for i = 1, #onlinePlayers do - if onlinePlayers[i] == source then - table.remove(onlinePlayers, i) - break - end - end -end) - -RegisterServerEvent("okokChat:SetClosePlayers") -AddEventHandler("okokChat:SetClosePlayers", function(players) - playersList = players - onlinePlayers = playersList -end) - -function getNearPlayers(source) - playersList = nil - TriggerClientEvent("okokChat:getAllPlayers", tonumber(source)) - while playersList == nil do - Citizen.Wait(10) - end - - return playersList -end - -exports.chat:registerMessageHook(function(source, outMessage, hookRef) - local msg = outMessage.args[2] - if string.sub(msg, 1, 1) ~= "/" then - hookRef.cancel() - if Config.OOCMessageWithoutCommand then - OOC(source, msg) - end - end -end) - -RegisterServerEvent("okokChat:ServerMessage") -AddEventHandler("okokChat:ServerMessage", function(background, color, icon, title, playername, message, target, image) - local time = os.date(Config.DateFormat) - if image == nil or image:gsub("%s+", "") == "" then - TriggerClientEvent('chat:addMessage', target, { - template = '
[{3}]{4} {6}
'..message..'
', - args = { background, color, icon, title, playername, message, time } - }) - else - TriggerClientEvent('chat:addMessage', target, { - template = '
[{3}]{4} {6}
'..message..'
', - args = { background, color, icon, title, playername, message, time } - }) - end -end) - -RegisterServerEvent("okokChat:deathStatus") -AddEventHandler("okokChat:deathStatus", function(isPlayerDead) - isDead = isPlayerDead - checkedDeathStatus = true -end) - -------------------------- --- [Me] - -if Config.EnableMeCommand then - RegisterCommand(Config.MeCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmin = playerName.." ["..source.."]" - local length = string.len(Config.MeCommand) - local message = rawCommand:sub(length + 1) - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if Config.Enable3DMe then TriggerClientEvent('okokChat:3dme', -1, "" .. message .. "", source) end - - if chatsHidden[source] == nil then - showToClosePlayers(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.MeMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Config.ShowIDOnMessage then - showToClosePlayersAdmins(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.MeMessageTitle..'] {0} {2}
{1}
', - args = { playerNameAdmin, message, time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['me'], - message = message, - } - discordWebhook(data) - end - end - end) -end - -------------------------- --- [Do] - -if Config.EnableDoCommand then - RegisterCommand(Config.DoCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmin = playerName.." ["..source.."]" - local length = string.len(Config.DoCommand) - local message = rawCommand:sub(length + 1) - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if Config.Enable3DDo then TriggerClientEvent('okokChat:3ddo', -1, "" .. message .. "", source) end - - if chatsHidden[source] == nil then - showToClosePlayers(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.DoMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Config.ShowIDOnMessage then - showToClosePlayersAdmins(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.DoMessageTitle..'] {0} {2}
{1}
', - args = { playerNameAdmin, message, time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['do'], - message = message, - } - discordWebhook(data) - end - end - end) -end - -------------------------- --- [Try] - -if Config.EnableTryCommand then - RegisterCommand(Config.TryCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmin = playerName.." ["..source.."]" - local length = string.len(Config.TryCommand) - local message = rawCommand:sub(length + 1) - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if math.random(0, 1) == 0 then return end - - if chatsHidden[source] == nil then - showToClosePlayers(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.TryMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Config.ShowIDOnMessage then - showToClosePlayersAdmins(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.TryMessageTitle..'] {0} {2}
{1}
', - args = { playerNameAdmin, message, time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['try'], - message = message, - } - discordWebhook(data) - end - end - end) -end - -------------------------- --- [Auto Message] -local id = 1 -Citizen.CreateThread(function() - while Config.EnableAutoMessage do - Citizen.Wait(Config.AutoMessageTime*60000) - local time = os.date(Config.DateFormat) - TriggerClientEvent('chat:addMessage', -1, { - template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', - args = { Config.AutoMessages[id], time } - }) - if Config.AutoMessages[id+1] ~= nil then - id = id + 1 - else - id = 1 - end - end -end) - -------------------------- --- [Clear Chat] - -if Config.AllowPlayersToClearTheirChat then - RegisterCommand(Config.ClearChatCommand, function(source, args, rawCommand) - TriggerClientEvent('chat:clear', source) - end) -end - -if Config.AllowStaffsToClearEveryonesChat then - RegisterCommand(Config.ClearEveryonesChatCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - - if isAdmin(xPlayer) then - TriggerClientEvent('chat:clear', -1) - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
'..Config.ClearChatMessageTitle..' {0}
'..Config.ClearChatMessage..'
', - args = { time } - }) - end) - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
'..Config.ClearChatMessageTitle..' {0}
'..Config.ClearChatMessage..'
', - args = { time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['clear_all'], - message = Config.ClearEveryonesChatCommand, - } - discordWebhook(data) - end - end - end) -end - -------------------------- --- [Hide Chat] - -if Config.EnableHideChat then - RegisterCommand(Config.HideChatCommand, function(source, args, rawCommand) - if chatsHidden[source] == nil then - chatsHidden[source] = true - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['disable_chat'], Config.NotificationsText['disable_chat'].message) - else - chatsHidden[source] = nil - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['enable_chat'], Config.NotificationsText['enable_chat'].message) - end - end) -end - -------------------------- --- [Staff] - -if Config.EnableStaffCommand then - RegisterCommand(Config.StaffCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.StaffCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - - if Config.StaffSteamName then - playerName = xPlayer.PlayerData.name - end - - if message:gsub("%s+", "") ~= "" then - if isAdmin(xPlayer) then - showToEveryoneNotHidden(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.StaffMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['staff_msg'], - message = message, - } - discordWebhook(data) - end - end - end - end) -end - -------------------------- --- [Staff Only] - -if Config.EnableStaffOnlyCommand then - RegisterCommand(Config.StaffOnlyCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.StaffOnlyCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - - if Config.StaffSteamName then - playerName = xPlayer.PlayerData.name - end - - if message:gsub("%s+", "") ~= "" then - if chatsHidden[source] == nil then - if isAdmin(xPlayer) then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
['..Config.StaffOnlyMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['staff_chat_msg'], - message = message, - } - discordWebhook(data) - end - end - end - end - end) -end - -------------------------- --- [Server Announcement] - -if Config.EnableServerAnnouncement then - RegisterCommand(Config.ServerAnnouncementCommand, function(source, args, rawCommand) - local xPlayer = nil - local length = string.len(Config.ServerAnnouncementCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - - if source ~= 0 and source ~= -1 then - xPlayer = QBCore.Functions.GetPlayer(source) - end - - if message:gsub("%s+", "") ~= "" then - if source <= 0 then - TriggerClientEvent('chat:addMessage', -1, { - template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', - args = { message, time } - }) - elseif isAdmin(xPlayer) then - TriggerClientEvent('chat:addMessage', -1, { - template = '
['..Config.AnnouncementMessageTitle..'] {1}
{0}
', - args = { message, time } - }) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['sv_an'], - message = message, - } - discordWebhook(data) - end - end - end - end) -end - -------------------------- --- [Advertisement] - -if Config.EnableAdvertisementCommand then - RegisterCommand(Config.AdvertisementCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.AdvertisementCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - local bankMoney = xPlayer.PlayerData.money.bank - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - if adsList[source] == nil then - if bankMoney >= Config.AdvertisementPrice then - xPlayer.Functions.RemoveMoney('bank', Config.AdvertisementPrice) - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['ad'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '', - args = { playerNameAdmins, message, time } - }) - end) - end - - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_success'], interp(Config.NotificationsText['ad_success'].message, {price = Config.AdvertisementPrice})) - adsList[source] = { - time = Config.AdvertisementCooldown * 60, - pastTime = 0, - timeLeft = Config.AdvertisementCooldown * 60 - } - - while (adsList[source].time > adsList[source].pastTime) do - Citizen.Wait(1000) - adsList[source].pastTime = adsList[source].pastTime + 1 - adsList[source].timeLeft = adsList[source].time - adsList[source].pastTime - end - adsList[source] = nil - else - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_no_money'], Config.NotificationsText['ad_no_money'].message) - end - else - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['ad_too_quick'], Config.NotificationsText['ad_too_quick'].message) - end - end - end) -end - -------------------------- --- [Twitch] - -if Config.EnableTwitchCommand then - RegisterCommand(Config.TwitchCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.TwitchCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - local twitch = twitchPermission(source) - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - if twitch then - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
{0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['twitch'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
{0} {2}
{1}
', - args = { playerNameAdmins, message, time } - }) - end) - end - end - end - end) -end - -function twitchPermission(id) - for i, a in ipairs(Config.TwitchList) do - for x, b in ipairs(GetPlayerIdentifiers(id)) do - if string.lower(b) == string.lower(a) then - return true - end - end - end -end - -------------------------- --- [Youtube] - -if Config.EnableYoutubeCommand then - RegisterCommand(Config.YoutubeCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.YoutubeCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - local youtube = youtubePermission(source) - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - if youtube then - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
{0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['youtube'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
{0} {2}
{1}
', - args = { playerNameAdmins, message, time } - }) - end) - end - end - end - end) -end - -function youtubePermission(id) - for i, a in ipairs(Config.YoutubeList) do - for x, b in ipairs(GetPlayerIdentifiers(id)) do - if string.lower(b) == string.lower(a) then - return true - end - end - end -end - -------------------------- --- [Twitter] - -if Config.EnableTwitterCommand then - RegisterCommand(Config.TwitterCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.TwitterCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
'..Config.TimeOutMessages['muted_message']..'
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['twitter'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '', - args = { playerNameAdmins, message, time } - }) - end) - end - end - end) -end - -------------------------- --- [Police] - -if Config.EnablePoliceCommand then - RegisterCommand(Config.PoliceCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.PoliceCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - local job = xPlayer.PlayerData.job.name - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - if job == Config.PoliceJobName then - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
{0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['police'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
{0} {2}
{1}
', - args = { playerNameAdmins, message, time } - }) - end) - end - end - end - end) -end - -------------------------- --- [Ambulance] - -if Config.EnableAmbulanceCommand then - RegisterCommand(Config.AmbulanceCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.AmbulanceCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - local job = xPlayer.PlayerData.job.name - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - if job == Config.AmbulanceJobName then - showAll(function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
{0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['ambulance'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdmins(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
{0} {2}
{1}
', - args = { playerNameAdmins, message, time } - }) - end) - end - end - end - end) -end - -------------------------- --- [Jobs] - -if Config.JobChat then - RegisterCommand(Config.JobCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.JobCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmin = playerName.." ["..source.."]" - local job = xPlayer.PlayerData.job - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - showForJob(job.name, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..job.label..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Config.ShowIDOnMessage then - showForJobAdmins(job.name, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..job.label..'] {0} {2}
{1}
', - args = { playerNameAdmin, message, time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = interp(Config.WebhookText['job_chat'], {job = job.label}), - message = message, - } - discordWebhook(data) - end - end - end) -end - -------------------------- --- [Private Messages] - -if Config.EnablePM then - RegisterCommand(Config.PMCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local message = table.concat(args, " ",2) - local time = os.date(Config.DateFormat) - local id = tonumber(args[1]) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTarget = QBCore.Functions.GetPlayer(id) - - if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname - - if chatsHidden[id] ~= nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['is_muted'], Config.NotificationsText['is_muted'].message) return end - - TriggerClientEvent('chat:addMessage', source, { - template = '
['..Config.PMMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - - TriggerClientEvent('chat:addMessage', id, { - template = '
['..Config.PMMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = interp(Config.WebhookText['pm_chat'], {name = xTargetName, id = id}), - message = message, - } - discordWebhook(data) - end - end) -end - -------------------------- --- [OOC] - -if Config.EnableOOC then - function OOC(source, message) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" or xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname - local playerNameAdmin = playerName.." ["..source.."]" - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if message:gsub("%s+", "") == "" then return end - - if chatsHidden[source] == nil then - showToClosePlayers(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.OOCMessageTitle..'] {0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Config.ShowIDOnMessage then - showToClosePlayersAdmins(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.OOCMessageTitle..'] {0} {2}
{1}
', - args = { playerNameAdmin, message, time } - }) - end) - end - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['ooc'], - message = message, - } - discordWebhook(data) - end - end - end - - RegisterCommand(Config.OOCCommand, function(source, args, rawCommand) - local length = string.len(Config.OOCCommand) - local message = rawCommand:sub(length + 1) - OOC(source, message) - end) -end - -------------------------- --- [Time out] - -if Config.TimeOutPlayers then - RegisterCommand(Config.TimeOutCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local id = tonumber(args[1]) - local muteTime = tonumber(args[2]) - local time = os.date(Config.DateFormat) - local xTarget = nil - local xTargetName = nil - - if not isAdmin(xPlayer) then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_not_adm'], Config.NotificationsText['mute_not_adm'].message) return end - if id == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - if muteTime == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_time_inv'], Config.NotificationsText['mute_time_inv'].message) return end - if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTarget = QBCore.Functions.GetPlayer(id) - - if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname - - if mutedList[id] ~= nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['alr_muted'], Config.NotificationsText['alr_muted'].message) return end - - mutedList[id] = { - time = muteTime * 60, - pastTime = 0, - timeLeft = muteTime * 60 - } - - if Config.ShowTimeOutMessageForEveryone then - showMuteMessageToEveryone(id, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
{0} {2}
'..Config.TimeOutMessages['muted_for']..'
', - args = { Config.MessageTitle, muteTime, time, xTargetName } - }) - end) - else - TriggerClientEvent('chat:addMessage', source, { - template = '
{0} {2}
'..Config.TimeOutMessages['you_muted_for']..'
', - args = { Config.MessageTitle, muteTime, time, xTargetName } - }) - end - - TriggerClientEvent('chat:addMessage', id, { - template = '
SERVER {1}
'..Config.TimeOutMessages['been_muted_for']..'
', - args = { muteTime, time } - }) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = interp(Config.WebhookText['muted'], {id = id}), - message = interp(Config.WebhookText['muted_for'], {muteTime = muteTime}), - } - discordWebhook(data) - end - - while (mutedList[id].time > mutedList[id].pastTime) do - Citizen.Wait(1000) - mutedList[id].pastTime = mutedList[id].pastTime + 1 - mutedList[id].timeLeft = mutedList[id].time - mutedList[id].pastTime - end - mutedList[id] = nil - - end) - - RegisterCommand(Config.RemoveTimeOutCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local id = tonumber(args[1]) - local time = os.date(Config.DateFormat) - local xTarget = nil - local xTargetName = nil - - if not isAdmin(xPlayer) then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_not_adm'], Config.NotificationsText['mute_not_adm'].message) return end - if id == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - if id == source then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTarget = QBCore.Functions.GetPlayer(id) - - if xTarget == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['mute_id_inv'], Config.NotificationsText['mute_id_inv'].message) return end - - xTargetName = xTarget.PlayerData.charinfo.firstname.." "..xTarget.PlayerData.charinfo.lastname - - if mutedList[id] == nil then TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['alr_unmuted'], Config.NotificationsText['alr_unmuted'].message) return end - - TriggerClientEvent('chat:addMessage', source, { - template = '
{0} {1}
'..Config.TimeOutMessages['you_unmuted']..'
', - args = { Config.MessageTitle, time, xTargetName } - }) - - TriggerClientEvent('chat:addMessage', id, { - template = '
{0} {1}
'..Config.TimeOutMessages['been_unmuted']..'
', - args = { Config.MessageTitle, time } - }) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = interp(Config.WebhookText['unmuted'], {id = id}), - message = Config.WebhookText['p_unmuted'], - } - discordWebhook(data) - end - - mutedList[id] = nil - - end) -end - -function SecondsToClock(seconds) - local seconds = tonumber(seconds) - - if seconds <= 0 then - return "00"; - else - local timeString = "" - hours = string.format("%02.f", math.floor(seconds/3600)); - mins = string.format("%02.f", math.floor(seconds/60 - (hours*60))); - secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60)); - - timeString = hours..":"..mins..":"..secs..Config.TimeOutMessages['hours'] - - if hours == "00" then timeString = mins..":"..secs..Config.TimeOutMessages['minutes'] end - if hours == "00" and mins == "00" then timeString = math.floor(seconds)..Config.TimeOutMessages['seconds'] end - - return timeString - end -end - -------------------------- --- [Anonymous] - -if Config.EnableAnonymousCommand then - RegisterCommand(Config.AnonymousCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local length = string.len(Config.AnonymousCommand) - local message = rawCommand:sub(length + 1) - local time = os.date(Config.DateFormat) - local bankMoney = xPlayer.PlayerData.money.bank - local playerName = "Anonymous" - local playerNameAdmins = xPlayer.PlayerData.charinfo.firstname.." "..xPlayer.PlayerData.charinfo.lastname.." ["..source.."]" - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - if chatsHidden[source] == nil then - if message:gsub("%s+", "") ~= "" then - if not isAnonymousChatBlacklisted(xPlayer) then - if anonymousList[source] == nil then - if bankMoney >= Config.AnonymousPrice then - xPlayer.Functions.RemoveMoney('bank', Config.AnonymousPrice) - showOnlyForAnonymous(function(anonymous) - TriggerClientEvent('chat:addMessage', anonymous, { - template = '
{0} {2}
{1}
', - args = { playerName, message, time } - }) - end) - - if Webhook ~= '' then - local identifierlist = ExtractIdentifiers(xPlayer.PlayerData.source) - local data = { - playerid = xPlayer.PlayerData.source, - identifier = identifierlist.license:gsub("license2:", ""), - discord = "<@"..identifierlist.discord:gsub("discord:", "")..">", - type = Config.WebhookText['anon'], - message = message, - } - discordWebhook(data) - end - - if Config.ShowIDOnMessage then - showOnlyForAdminsAnonymous(function(admins) - TriggerClientEvent('chat:addMessage', admins, { - template = '
{0} {2}
{1}
', - args = { playerNameAdmins, message, time } - }) - end) - end - - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_success'], Config.NotificationsText['an_success'].message) - anonymousList[source] = { - time = Config.AdvertisementCooldown * 2, - pastTime = 0, - timeLeft = Config.AdvertisementCooldown * 2 - } - - while (anonymousList[source].time > anonymousList[source].pastTime) do - Citizen.Wait(1000) - anonymousList[source].pastTime = anonymousList[source].pastTime + 1 - anonymousList[source].timeLeft = anonymousList[source].time - anonymousList[source].pastTime - end - anonymousList[source] = nil - else - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_no_money'], Config.NotificationsText['an_no_money'].message) - end - else - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_too_quick'], Config.NotificationsText['an_too_quick'].message) - end - else - TriggerClientEvent('okokChat:Notification', source, Config.NotificationsText['an_not_allowed'], Config.NotificationsText['an_not_allowed'].message) - end - end - end - end) -end - --- [DOC] - -if Config.EnableDocCommand then - RegisterCommand(Config.DocCommand, function(source, args, rawCommand) - local xPlayer = QBCore.Functions.GetPlayer(source) - local time = os.date(Config.DateFormat) - local playerName = Config.ShowIDOnMessageForEveryone and getName(xPlayer.identifier).." ["..source.."]" or getName(xPlayer.identifier) - local playerNameAdmin = playerName.." ["..source.."]" - local length = string.len(Config.DocCommand) - local message = tonumber(rawCommand:sub(length + 1)) - local number = 1 - - if mutedList[source] ~= nil then - TriggerClientEvent('chat:addMessage', source, { - template = '
'..Config.MessageTitle..' {1}
You are muted for {0}
', - args = { SecondsToClock(mutedList[source].timeLeft), time } - }) - return - end - - while number <= message do - local toShow = number .. '/' ..message - Wait(1000) - if chatsHidden[source] == nil then - showToClosePlayers(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.DocMessageTitle..'] {0} {2}
{1}
', - args = { playerName, toShow, time } - }) - end) - - end - - if Config.ShowIDOnMessage then - showToClosePlayersAdmins(xPlayer, function(players) - TriggerClientEvent('chat:addMessage', players, { - template = '
['..Config.DocMessageTitle..'] {0} {2}
{1}
', - args = { playerNameAdmin, toShow, time } - }) - end) - end - number = number + 1 - end - end) -end - -function isAnonymousChatBlacklisted(xPlayer) - if xPlayer ~= nil then - for k,v in ipairs(Config.WhatJobsCantSeeAnonymousChat) do - if xPlayer.PlayerData.job.name == v then - return true - end - end - end - return false -end - -function showOnlyForAnonymous(anonymous) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if not Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAnonymousChatBlacklisted(xPlayer) then - anonymous(v) - elseif Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAdmin(xPlayer) and not isAnonymousChatBlacklisted(xPlayer) then - anonymous(v) - end - end - end -end - -function showOnlyForAdminsAnonymous(admins) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if isAdmin(xPlayer) and chatsHidden[xPlayer.PlayerData.source] == nil and not isAnonymousChatBlacklisted(xPlayer) then - admins(v) - end - end - end -end - -------------------------- --- [Functions] - -function isAdmin(xPlayer) - if xPlayer ~= nil then - local playerGroup = QBCore.Functions.GetPermission(xPlayer.PlayerData.source) - if Config.QBPermissionsUpdate then - for group, value in pairs(playerGroup) do - if value then - for k,v in ipairs(Config.StaffGroups) do - if group == v then - return true - end - end - end - end - else - for k,v in ipairs(Config.StaffGroups) do - if playerGroup == v then - return true - end - end - end - end - - return false -end - -function showOnlyForAdmins(admins) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if isAdmin(xPlayer) and chatsHidden[xPlayer.PlayerData.source] == nil then - admins(v) - end - end - end -end - -function showAll(players) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if not Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil then - players(v) - elseif Config.ShowIDOnMessage and chatsHidden[xPlayer.PlayerData.source] == nil and not isAdmin(xPlayer) then - players(v) - end - end - end -end - -function showToEveryoneNotHidden(players) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if chatsHidden[xPlayer.PlayerData.source] == nil then - players(v) - end - end - end -end - -function showMuteMessageToEveryone(id, players) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if chatsHidden[xPlayer.PlayerData.source] == nil and id ~= v then - players(v) - end - end - end -end - -function showForJob(job, players) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if not Config.ShowIDOnMessage and xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil then - players(v) - elseif Config.ShowIDOnMessage and not isAdmin(xPlayer) and xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil then - players(v) - end - end - end -end - -function showForJobAdmins(job, players) - for k,v in ipairs(onlinePlayers) do - local xPlayer = QBCore.Functions.GetPlayer(v) - if xPlayer ~= nil then - if xPlayer.PlayerData.job.name == job and chatsHidden[xPlayer.PlayerData.source] == nil and isAdmin(xPlayer) then - players(v) - end - end - end -end - -function showToClosePlayers(xPlayer, admins) - local ped = GetPlayerPed(xPlayer.PlayerData.source) - local playerCoords = GetEntityCoords(ped, false) - for k,v in ipairs(onlinePlayers) do - local xTarget = QBCore.Functions.GetPlayer(v) - if xTarget ~= nil then - if not Config.ShowIDOnMessage and chatsHidden[xTarget.source] == nil then - local tped = GetPlayerPed(v) - local targetCoords = GetEntityCoords(tped, false) - if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then - admins(v) - end - elseif Config.ShowIDOnMessage and not isAdmin(xTarget) and chatsHidden[xTarget.source] == nil then - local tped = GetPlayerPed(v) - local targetCoords = GetEntityCoords(tped, false) - if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then - admins(v) - end - end - end - end -end - -function showToClosePlayersAdmins(xPlayer, admins) - local ped = GetPlayerPed(xPlayer.PlayerData.source) - local playerCoords = GetEntityCoords(ped, false) - for k,v in ipairs(onlinePlayers) do - local xTarget = QBCore.Functions.GetPlayer(v) - if xTarget ~= nil then - if chatsHidden[xTarget.source] == nil and isAdmin(xTarget) then - local tped = GetPlayerPed(v) - local targetCoords = GetEntityCoords(tped, false) - if #(vector3(playerCoords.x, playerCoords.y, playerCoords.z) - vector3(targetCoords.x, targetCoords.y, targetCoords.z)) < Config.Distance then - admins(v) - end - end - end - end -end - --------------------------- IDENTIFIERS - -function ExtractIdentifiers(id) - local identifiers = { - steam = "", - ip = "", - discord = "", - license = "", - xbl = "", - live = "" - } - - for i = 0, GetNumPlayerIdentifiers(id) - 1 do - local playerID = GetPlayerIdentifier(id, i) - - if string.find(playerID, "steam") then - identifiers.steam = playerID - elseif string.find(playerID, "ip") then - identifiers.ip = playerID - elseif string.find(playerID, "discord") then - identifiers.discord = playerID - elseif string.find(playerID, "license") then - identifiers.license = playerID - elseif string.find(playerID, "xbl") then - identifiers.xbl = playerID - elseif string.find(playerID, "live") then - identifiers.live = playerID - end - end - - return identifiers -end - --------------------------- DISCORD WEBHOOK - -function discordWebhook(data) - - local information = { - { - ["color"] = Config.WebhookColor, - ["author"] = { - ["icon_url"] = Config.IconURL, - ["name"] = Config.ServerName..' - Logs', - }, - ["title"] = 'CHAT', - ["description"] = '**Type:** '..data.type..'\n**Message:** '..data.message..'\n\n**ID:** '..data.playerid..'\n**Identifier:** '..data.identifier..'\n**Discord:** '..data.discord, - ["footer"] = { - ["text"] = os.date(Config.DateFormat), - } - } - } - - PerformHttpRequest(Webhook, function(err, text, headers) end, 'POST', json.encode({username = Config.BotName, embeds = information}), {['Content-Type'] = 'application/json'}) - return -end \ No newline at end of file diff --git a/resources/[standalone]/okokChatV2/web/styles.css b/resources/[standalone]/okokChatV2/web/styles.css deleted file mode 100644 index 96473f61c..000000000 --- a/resources/[standalone]/okokChatV2/web/styles.css +++ /dev/null @@ -1,410 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Tajawal:wght@200;300;400;500;700;800;900&display=swap'); -@import url('https://use.fontawesome.com/releases/v5.15.4/css/all.css'); - -* { - font-family: 'Tajawal', sans-serif; -} - -.chat-window { - position: absolute; - top: 2.5%; - left: 2.055%; - width: 38%; - height: 33.3% !important; - max-width: 27.5%; - background-color: rgba(0, 0, 0, 0.0) !important; -} - -.msg { - font-family: 'Tajawal', sans-serif; - color: #fff; - font-size: calc(1.8vh); - filter: url(#svgDropShadowFilter); - line-height: calc(2.7vh * 1.2); - margin-bottom: 0.9%; -} - -.chat-messages { - margin: 0; - height: 100%; -} - -.chat-message { - display: block !important; - padding: 0.6vw; - padding-top: 0.6vw; - padding-bottom: 0.7vw; - border-radius: 0.625rem; - width: 75.6%; - overflow: hidden; - word-break: break-word; - box-sizing: border-box; - box-shadow: 0rem 0rem 0.625rem -0.3125rem rgba(0, 0, 0, 1); - line-height: 1; -} - -.chat-message div { - line-height: 1 !important; -} - -.message { - margin-top: 0.9%; - font-weight: 300; -} - -.time { - font-size: 0.875rem; - font-size: calc(1.3vh); - color: #e1e1e1; -} - -.msg > span > span > b { - font-family: 'Tajawal', sans-serif; - font-weight: normal; - vertical-align: baseline; - padding-right: 0.6875rem; - line-height: 1; - font-size: calc(2.7vh); -} - -.msg > span > span > span { - vertical-align: baseline; -} - -.msg i:first-of-type { - font-style: normal; - color: #fff; -} - -.chat-input { - font-size: 1.65vh; - position: absolute; - top: 37%; - left: 2.055%; - width: 38%; - max-width: 20.8%; - box-sizing: border-box; -} - -.chat-input > div.input { - background-color: rgba(27, 29, 32, 0.95); - border-radius: 0.625rem; -} - -.chat-input .prefix { - height: 100%; - vertical-align: middle; - padding-left: 0.5vh; - text-transform: uppercase; - font-weight: bold; - display: inline-block; -} - -.input { - align-items: center; -} - -.prefix { - line-height: 3.80vh !important; -} - -.suggestions { - margin-top: 0.9%; - list-style-type: none; - padding: 0.9%; - padding-left: 6.54%; - font-size: calc(1.7vh); - box-sizing: border-box; - color: white; - background-color: rgba(31, 94, 255, 0.9); - width: 100%; - border-radius: 0.625rem; - border: none; - box-shadow: 0rem 0rem 0.625rem -0.3125rem rgba(0, 0, 0, 1); -} - -.suggestion { - font-size: calc(1.8vh); - margin-bottom: 0.03125rem; -} - -textarea { - resize: none; - font-size: calc(2vh); - color: #fff; - line-height: 1.85vh !important; - padding-top: 3%; -} - -.multiline { - margin-left: 0; - text-indent: 0; -} - -.fas { - vertical-align: middle; -} - -/* START STAFF */ - -.staff { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(19, 138, 70, 0.9) 100%); -} - -.fa-shield-alt { - color: rgba(42, 42, 42, 0.9); - background-color: #1ebc62; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END STAFF */ - -/* START ONLY STAFF */ - -.staffonly { - background: rgba(42, 42, 42, 0.9); -} - -.fa-eye-slash { - color: rgba(42, 42, 42, 0.9); - background-color: #1ebc62; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END ONLY STAFF */ - -/* START SERVER ANNOUNCEMENT */ - -.server-msg { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(204, 61, 61, 0.9) 100%); -} - -.fa-exclamation-circle { - color: rgba(42, 42, 42, 0.9); - background-color: #cc3d3d; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END SERVER ANNOUNCEMENT */ - -/* START TWITCH */ - -.twitch { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(96, 67, 139, 0.9) 100%); -} - -.fa-twitch { - color: rgba(42, 42, 42, 0.9); - background-color: #9c70de; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END TWITCH */ - -/* START YOUTUBE */ - -.youtube { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(101, 0, 0, 0.9) 100%); -} - -.fa-youtube { - color: rgba(42, 42, 42, 0.9); - background-color: #ff0000; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END YOUTUBE */ - -/* START TWITTER */ - -.twitter { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(25, 107, 143, 0.9) 100%); -} - -.fa-twitter { - color: rgba(42, 42, 42, 0.9); - background-color: #2aa9e0; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END TWITTER */ - -/* START SYSTEM */ - -.system { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(134, 84, 23, 0.9) 100%); -} - -.fa-cog { - color: rgba(42, 42, 42, 0.9); - background-color: #df7b00; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END SYSTEM */ - -/* START ADVERTISEMENT */ - -.advertisement { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(84, 150, 38, 0.9) 100%); -} - -.fa-ad { - color: rgba(42, 42, 42, 0.9); - background-color: #81db44; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END ADVERTISEMENT */ - -/* START POLICE */ - -.police { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(40, 55, 116, 0.9) 100%); -} - -.fa-bullhorn { - color: rgba(42, 42, 42, 0.9); - background-color: #4a6cfd; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END POLICE */ - -/* START AMBULANCE */ - -.ambulance { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(152, 113, 22, 0.9) 100%); -} - -.fa-ambulance { - color: rgba(42, 42, 42, 0.9); - background-color: #e3a71b; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END AMBULANCE */ - -/* START OOC */ - -.ooc { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(125, 125, 125, 0.9) 100%); -} - -.fa-door-open { - color: rgba(42, 42, 42, 0.9); - background-color: #ababab; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END OOC */ - -/* START ME */ - -.me { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(121, 184, 250, 0.9) 100%); -} - -.me-icon { - background-color: #79b8fa; -} - -/* END ME */ - -/* START DO */ - -.do { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(121, 250, 164, 0.9) 100%); -} - -.do-icon { - background-color: #79faa4; -} - -/* END DO */ - -/* START TRY */ - -.try { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(243, 73, 113, 0.9) 100%); -} - -.try-icon { - background-color: #f34971; -} - -/* END TRY */ - -/* START ANONYMOUS */ - -.anonymous { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(9, 78, 33, 0.9) 100%); -} - -.fa-mask { - color: rgba(42, 42, 42, 0.9); - background-color: #2e874d; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END ANONYMOUS */ - -/* START JOBS */ - -.jobchat { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(53, 219, 194, 0.9) 100%); -} - -.fa-briefcase { - color: rgba(42, 42, 42, 0.9); - background-color: #35dbc2; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END JOBS */ - -/* START TIMEOUT */ - -.muted { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(223, 123, 0, 0.9) 100%); -} - -.fa-gavel { - color: rgba(42, 42, 42, 0.9); - background-color: #df7b00; - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -/* END TIMEOUT */ - -/* START PM */ - -.pm { - background: linear-gradient(90deg, rgba(42, 42, 42, 0.9) 0%, rgba(113, 81, 156, 0.9) 100%); -} - -.fa-comment { - color: rgba(42, 42, 42, 0.9); - padding: 0.3125rem; - border-radius: 0.3125rem; -} - -.pm-icon { - background-color: #71519c; -} - -/* END PM */ \ No newline at end of file diff --git a/resources/[test]/okokCrafting/.fxap b/resources/[test]/okokCrafting/.fxap deleted file mode 100644 index 22e0169928a288ea4e99328a82d49baefb20529e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmV;j08Rf!SV2$$000000NeKOLB3hrPQD&rA2R9=VJzy`7iH-v@@6)xo3G69|MI#Z!;z|GV$KcNM$6cttKQ@rFdi!&K=2c$-yJ`U_LZH475TmY# g!&$79T3VeO=UY{VU~Oa95sG)s@xln%(rl@GO@wD$_W%F@ diff --git a/resources/[test]/okokCrafting/README.md b/resources/[test]/okokCrafting/README.md deleted file mode 100644 index 7a9927879..000000000 --- a/resources/[test]/okokCrafting/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Hi, thank you for buying okokCrafting! :) - -If you need help contact me on discord: okok#3488 -Discord server: https://discord.gg/okok -Docs: https://docs.okokscripts.io/ - --> Installation Guide: https://docs.okokscripts.io/scripts/okokcrafting \ No newline at end of file diff --git a/resources/[test]/okokCrafting/cl_utils.lua b/resources/[test]/okokCrafting/cl_utils.lua deleted file mode 100644 index 742c01a6c..000000000 --- a/resources/[test]/okokCrafting/cl_utils.lua +++ /dev/null @@ -1,249 +0,0 @@ -QBCore = exports[Config.qbPrefix.."-core"]:GetCoreObject() - -RegisterNetEvent(Config.EventPrefix..":notification") -AddEventHandler(Config.EventPrefix..":notification", function(title, text, time, type) - exports['okokNotify']:Alert(title, text, time, type) -end) - -RegisterNetEvent(Config.EventPrefix..":openTextUI") -AddEventHandler(Config.EventPrefix..":openTextUI", function(text) - exports['qb-core']:DrawText(text, 'left') -end) - -RegisterNetEvent(Config.EventPrefix..":closeTextUI") -AddEventHandler(Config.EventPrefix..":closeTextUI", function() - exports['qb-core']:HideText() -end) - -function onOpenMenu() - -- Executed when the menu is opened -end - -function onCloseMenu() - -- Executed when the menu is closed -end - -function claimAll(workbench, CraftQueues) - TriggerServerEvent(Config.EventPrefix..':claimAll', workbench, CraftQueues) -end - -Citizen.CreateThread(function() - if Config.UseXP then - if Config.SameLevelForAllTables then - TriggerEvent('chat:addSuggestion', '/'..Config.SetXPCommand, _L('suggestion_xp').maintext, { - { name=_L('suggestion_xp').id, help=_L('suggestion_xp').idtext }, - { name=_L('suggestion_xp').xp, help=_L('suggestion_xp').xptext }, - }) - - TriggerEvent('chat:addSuggestion', '/'..Config.SetLevelCommand, _L('suggestion_level').maintext, { - { name=_L('suggestion_level').id, help=_L('suggestion_level').idtext }, - { name=_L('suggestion_level').level, help=_L('suggestion_level').leveltext }, - }) - else - TriggerEvent('chat:addSuggestion', '/'..Config.SetXPCommand, _L('suggestion_xp').maintext, { - { name=_L('suggestion_xp').id, help=_L('suggestion_xp').idtext }, - { name=_L('suggestion_xp').xp, help=_L('suggestion_xp').xptext }, - { name=_L('suggestion_xp').workbench, help=_L('suggestion_xp').workbenchtext }, - }) - - TriggerEvent('chat:addSuggestion', '/'..Config.SetLevelCommand, _L('suggestion_level').maintext, { - { name=_L('suggestion_level').id, help=_L('suggestion_level').idtext }, - { name=_L('suggestion_level').level, help=_L('suggestion_level').leveltext }, - { name=_L('suggestion_level').workbench, help=_L('suggestion_level').workbenchtext }, - }) - end - end -end) - -Citizen.CreateThread(function() - while PlayerData == nil do - PlayerData = QBCore.Functions.GetPlayerData() - Citizen.Wait(10) - end - while PlayerData.job == nil do - PlayerData.job = QBCore.Functions.GetPlayerData().job - Citizen.Wait(10) - end - while PlayerData.gang == nil do - PlayerData.gang = QBCore.Functions.GetPlayerData().gang - Citizen.Wait(10) - end - local inZone = false - local num = 0 - local nearZone = false - local enteredRange = false - local inWideRange = false - local ped = PlayerPedId() - - while true do - Citizen.Wait(0) - local playerExists = false - - if not playerExists then - if DoesEntityExist(ped) then - playerExists = true - else - ped = PlayerPedId() - end - end - local playerCoords = GetEntityCoords(ped) - - nearZone = false - inZone = false - - for k,v in pairs(Config.Crafting) do - if v.jobs['all'] ~= nil or checkJob(v.jobs) or checkGang(v.jobs) then - local distance = #(vector3(v.coordinates[1], v.coordinates[2], v.coordinates[3]) - playerCoords) - - if distance < Config.CraftRadius then - if closeWorkbench ~= v.tableID then - closeWorkbench = v.tableID - workbenchCoords = v.coordinates - end - - if not gotQueue then - gotQueue = true - QBCore.Functions.TriggerCallback(Config.EventPrefix..":getQueue", function(queue, queues) - CraftQueues = queues - WorkbenchCraft = queue - end, v.tableID) - end - end - - if distance < v.radius + 2 then - local zDistance = playerCoords.z - v.coordinates[3] - nearZone = true - if waitMore and not isCraftOpen then - waitMore = false - end - if not Config.NotInterectableTables then - if distance < v.radius and zDistance < 3 and zDistance > -3 then - inZone = true - - if IsControlJustReleased(0, Config.Key) and not IsEntityDead(ped) then - if GetVehiclePedIsUsing(ped) == 0 then - waitMore = true - if not isCraftOpen then - TriggerEvent(Config.EventPrefix..':openWorkbench', k) - end - else - TriggerEvent(Config.EventPrefix..':notification', _L('inside_vehicle').title, _L('inside_vehicle').text, _L('inside_vehicle').time, _L('inside_vehicle').type) - end - end - end - end - elseif not waitMore and not inWideRange then - waitMore = true - end - end - end - - if nearZone and not enteredRange then - enteredRange = true - inWideRange = true - elseif not nearZone and enteredRange then - enteredRange = false - inWideRange = false - end - - if inZone and not hasEntered then - if Config.UseOkokTextUI then - exports['okokTextUI']:Open(_L('textUI').text, _L('textUI').color, _L('textUI').side) - else - TriggerEvent(Config.EventPrefix..':openTextUI', _L('textUI').text) - end - hasEntered = true - elseif not inZone and hasEntered then - if Config.UseOkokTextUI then - exports['okokTextUI']:Close() - else - TriggerEvent(Config.EventPrefix..':closeTextUI') - end - hasEntered = false - end - - if waitMore then - Citizen.Wait(1000) - end - end -end) - -Citizen.CreateThread(function() - while true do - local canCraft = false - local queue = CraftQueues[closeWorkbench] - if CraftQueues[closeWorkbench] ~= nil and closeWorkbench ~= "" and workbenchCoords ~= nil then - local playerCoords = GetEntityCoords(PlayerPedId()) - local distance = #(vector3(workbenchCoords[1], workbenchCoords[2], workbenchCoords[3]) - playerCoords) - local zDistance = playerCoords.z - workbenchCoords[3] - - if distance < Config.CraftRadius then - local craftingItemID = 1 - for k,v in ipairs(CraftQueues[closeWorkbench]) do - if v.time >= 0 and not v.isDone then - craftingItemID = k - canCraft = true - break - end - end - if canCraft then - if not updateTable then - updateTable = true - end - local craftTime = CraftQueues[closeWorkbench][craftingItemID].time - CraftQueues[closeWorkbench][craftingItemID].isPending = false - SendNUIMessage({ - action = "ShowCraftCount", - time = CraftQueues[closeWorkbench][craftingItemID].time, - name = CraftQueues[closeWorkbench][craftingItemID].itemName, - }) - - if CraftQueues[closeWorkbench][craftingItemID].time <= 0 then - CraftQueues[closeWorkbench][craftingItemID].time = 0 - CraftQueues[closeWorkbench][craftingItemID].isDone = true - local randomNum = math.random(1, 100) - if randomNum <= tonumber(CraftQueues[closeWorkbench][craftingItemID].sucPC) then - SendNUIMessage({ - action = "CompleteCraftCount", - name = CraftQueues[closeWorkbench][craftingItemID].itemName, - }) - else - CraftQueues[closeWorkbench][craftingItemID].suc = false - SendNUIMessage({ - action = "FailedCraftCount", - name = CraftQueues[closeWorkbench][craftingItemID].itemName, - }) - end - SendNUIMessage({ - action = "updateCraftingItems", - queue = CraftQueues[closeWorkbench], - }) - SendNUIMessage({ - action = "HideCraftCount", - }) - Citizen.Wait(500) - else - SendNUIMessage({ - action = "updateCraftingItems", - queue = CraftQueues[closeWorkbench], - }) - CraftQueues[closeWorkbench][craftingItemID].time = craftTime - 1 - Citizen.Wait(1000) - end - else - if updateTable then - updateTable = false - QBCore.Functions.TriggerCallback(Config.EventPrefix..":updateQueue", function(cb) - - end, CraftQueues) - end - Citizen.Wait(2000) - end - else - Citizen.Wait(3000) - end - else - Citizen.Wait(5000) - end - end -end) \ No newline at end of file diff --git a/resources/[test]/okokCrafting/client.lua b/resources/[test]/okokCrafting/client.lua deleted file mode 100644 index 780af7b58716a6545ed3c582467602e22cc24b79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18208 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 diff --git a/resources/[test]/okokCrafting/config.lua b/resources/[test]/okokCrafting/config.lua deleted file mode 100644 index b525bc730..000000000 --- a/resources/[test]/okokCrafting/config.lua +++ /dev/null @@ -1,595 +0,0 @@ -Config, Locales = {}, {} - -Config.Debug = false -Config.DoubleXP = false -Config.EventPrefix = 'okokCrafting' -Config.xpColumnsName = 'xp' -Config.craftQueryColumnName = 'okokcrafts' -Config.qbPrefix = 'qb' -Config.QBCorePrefix = 'QBCore' -Config.Locale = 'de' -- en / pt / gr / fr / de -Config.UseOkokTextUI = true -Config.Key = 38 -Config.HideMinimap = true -Config.ShowBlips = true -Config.ShowFloorBlips = true -Config.ShowAllCrafts = true -Config.UseXP = false -Config.SameLevelForAllTables = false -Config.MaxLevel = 20 -Config.StartXP = 0 -Config.LevelMultiplier = 1.05 -Config.GiveXPOnCraftFailed = true -Config.SetXPCommand = 'setcraftxp' -Config.SetLevelCommand = 'setcraftlevel' -Config.CraftRadius = 5 -Config.MaxCraftsPerWorkbench = 10 -Config.UseCategories = true -Config.InventoryDirectory = 'qs-inventory/html/images' -Config.UseOx_inventory = false -Config.NotInterectableTables = false - -Config.AdminGroups = { - 'god', - 'admin', - 'mod' -} - -Config.itemNames = { - metalscrap = 'Metal Scrap', - weapon_assaultrifle = 'Assault Rifle', - iron = 'Iron', - bandage = 'Bandage', - firstaid = 'First Aid', - ['10kgoldchain'] = '10kgoldchain', - plastic = 'Plastic', - aluminum = 'Aluminum', - cash = 'Money', - -- Zusätzliche Waffenkomponenten - shortened_gunbarrel = 'Verkuerzter Waffenlauf', - shaft = 'Schaft', - trigger_unit = 'Abzugseinheit', - revolver_barrel = 'Revolverlauf', - drum_mechanism = 'Trommelmechanismus', - weapon_handle = 'Griff', - pistol_barrel = 'Pistolenlauf', - weapon_sled = 'Schlitten (Upper Slide)', - gun_handle = 'Griffstueck', - ceramic_barrel = 'Keramiklauf', - small_triggersystem = 'Kleines Abzugssystem', - weapon_batton = 'Waffenlauf Lang', - --- Zubehör Nahkampfwaffen - dagger_blade = 'Dolchklinge', - machete_blade = 'Macheteklinge', - handle = 'Holzgriff', - switchblade_mechanism = 'Mechanismus für Springmesser', - small_blade = 'kleine Klinge', - axe_head = 'Axtkopf', - reinforced_handle = 'verstärkter Griff', - -- Drogenherstellung - opium_poppy = 'Schlafmohn', - opium = 'Opium', - acetic = 'Essiganhydrid', - injection = 'Spritze', - codeine_syrup = 'Codein-Sirup', - campers_fuel = 'Campers Fuel', - sweets_candies = 'Süßigkeiten', - ephedrin = 'Ephedrin', - chemical_set = 'Chemikalien-Set', - meth_pipe = 'Pipe', - magic_mushroom = 'Mutterkorn', - lysergic_acid = 'Lysergsäure', - blotter_paper = 'Blotterpapier', - ---- Drogen - lsd_papers = 'LSD-Papes', - ready_methpipe = 'Meth Pipe', - lean = 'Lean', - heroin_injection = 'Heroin in Spritze', - -- Ausrüstung - armor = 'Weste', - -- Waffen - weapon_ceramicpistol = 'Ceramic Pistol', - weapon_navyrevolver = 'Navy Revolver', - weapon_pistol50 = 'Tropical Eagle', - weapon_assaultrifle = 'AK 75', - weapon_dbshotgun = 'Double-barrel Shotgun', - weapon_microsmg = 'Micro SMG', - weapon_minismg = 'Mini SMG', - weapon_bullpuprifle = 'QBX-92-3', - weapon_marksmanpistol = 'Marksman Pistol', - weapon_gusenberg = 'Gusenberg Sweeper', - -- Nahkampfwaffen - weapon_dagger = 'Dagger', - weapon_machete = 'Machete', - weapon_switchblade = 'Switchblade', - weapon_hatchet = 'Hatchet', - -- Ressourcen - gunpowder = 'Schwarzpulver', - armaid_plant = 'Aramid Fasern', - steel_ingots = 'Stahlbarren', - copper = 'Kupfer', - log = 'Holzscheit', - -} - -Config.Crafting = { - { - coordinates = vector3(-1802.27, 3089.12, 32.84), - radius = 1, - showMapBlip = false, - marker = {type = 20, r = 255, g = 165, b = 0, a = 155, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0}, - showBlipRadius = 50, - blip = {blipId = 402, blipColor = 7, blipScale = 0.9, blipText = 'Waffenkomponenten'}, - tableName = 'Waffenkomponenten', - tableID = 'components1', - crafts = { - 'shortened_gunbarrel', - 'shaft', - 'trigger_unit', - 'revolver_barrel', - 'drum_mechanism', - 'weapon_handle', - 'pistol_barrel', - 'weapon_sled', - 'gun_handle', - 'ceramic_barrel', - 'small_triggersystem', - 'weapon_batton', - }, - jobs = {['all'] = true}, - }, - { - coordinates = vector4(3092.46, -4713.06, 15.26, 37.66), - radius = 2, - showMapBlip = false, - marker = {type = 20, r = 0, g = 200, b = 255, a = 150, bobUpAndDown = 0, faceCamera = 0, rotate = 1, textureDict = 0, textureName = 0, drawOnEnts = 0}, - showBlipRadius = 50, - blip = {blipId = 566, blipColor = 5, blipScale = 0.8, blipText = 'Waffenherstellung'}, - tableName = 'Waffenherstellung', - tableID = 'weapon_crafting_1', - crafts = { - 'weapon_ceramicpistol', - 'weapon_navyrevolver', - 'weapon_pistol50', - 'weapon_assaultrifle', - 'weapon_dbshotgun', - 'weapon_microsmg', - 'weapon_minismg', - 'weapon_bullpuprifle', - 'weapon_marksmanpistol', - 'weapon_gusenberg', - }, - jobs = {['all'] = true}, - } - -} - -Config.Crafts = { - ['shortened_gunbarrel'] = { - item = 'shortened_gunbarrel', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['shaft'] = { - item = 'shaft', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['trigger_unit'] = { - item = 'trigger_unit', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['revolver_barrel'] = { - item = 'revolver_barrel', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 3, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['drum_mechanism'] = { - item = 'drum_mechanism', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 3, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['weapon_handle'] = { - item = 'weapon_handle', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['pistol_barrel'] = { - item = 'pistol_barrel', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['weapon_sled'] = { - item = 'weapon_sled', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['gun_handle'] = { - item = 'gun_handle', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['ceramic_barrel'] = { - item = 'ceramic_barrel', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['small_triggersystem'] = { - item = 'small_triggersystem', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - ['weapon_batton'] = { - item = 'weapon_batton', - amount = 1, - maxCraft = 5, - successCraftPercentage = 100, - isItem = true, - isDisassemble = false, - time = 3, - levelNeeded = 0, - xpPerCraft = 10, - recipe = { - { 'steel_ingots', 2, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenkomponenten', - }, - - --- Neue Crafting-Rezepte für Waffenherstellung - - ['weapon_ceramicpistol'] = { - item = 'weapon_ceramicpistol', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 1, - xpPerCraft = 20, - recipe = { - { 'ceramic_barrel', 1, true, false }, - { 'gun_handle', 1, true, false }, - { 'small_triggersystem', 1, true, false }, - { 'shaft', 1, true, false }, - { 'pistol_barrel', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_navyrevolver'] = { - item = 'weapon_navyrevolver', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 1, - xpPerCraft = 20, - recipe = { - { 'weapon_handle', 1, true, false }, - { 'revolver_barrel', 1, true, false }, - { 'small_triggersystem', 1, true, false }, - { 'drum_mechanism', 1, true, false }, - { 'shaft', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_pistol50'] = { - item = 'weapon_pistol50', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 1, - xpPerCraft = 20, - recipe = { - { 'shaft', 1, true, false }, - { 'small_triggersystem', 1, true, false }, - { 'gun_handle', 1, true, false }, - { 'pistol_barrel', 1, true, false }, - { 'weapon_sled', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_assaultrifle'] = { - item = 'weapon_assaultrifle', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 2, - xpPerCraft = 30, - recipe = { - { 'gun_handle', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'weapon_batton', 1, true, false }, - { 'shaft', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_dbshotgun'] = { - item = 'weapon_dbshotgun', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 2, - xpPerCraft = 30, - recipe = { - { 'shortened_gunbarrel', 2, true, false }, - { 'shaft', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'gun_handle', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_microsmg'] = { - item = 'weapon_microsmg', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 2, - xpPerCraft = 30, - recipe = { - { 'shaft', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'gun_handle', 1, true, false }, - { 'pistol_barrel', 1, true, false }, - { 'weapon_sled', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_minismg'] = { - item = 'weapon_minismg', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 2, - xpPerCraft = 30, - recipe = { - { 'shaft', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'gun_handle', 1, true, false }, - { 'pistol_barrel', 1, true, false }, - { 'weapon_sled', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_bullpuprifle'] = { - item = 'weapon_bullpuprifle', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 3, - xpPerCraft = 40, - recipe = { - { 'gun_handle', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'weapon_batton', 1, true, false }, - { 'shaft', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_marksmanpistol'] = { - item = 'weapon_marksmanpistol', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 1, - xpPerCraft = 20, - recipe = { - { 'shaft', 1, true, false }, - { 'small_triggersystem', 1, true, false }, - { 'gun_handle', 1, true, false }, - { 'pistol_barrel', 1, true, false }, - { 'weapon_sled', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - - ['weapon_gusenberg'] = { - item = 'weapon_gusenberg', - amount = 1, - successCraftPercentage = 100, - time = 5, - levelNeeded = 3, - xpPerCraft = 40, - recipe = { - { 'gun_handle', 1, true, false }, - { 'trigger_unit', 1, true, false }, - { 'weapon_batton', 1, true, false }, - { 'shaft', 1, true, false } - }, - job = { '' }, - data = {}, - category = 'Waffenherstellung', -}, - -} --------------------------- DISCORD LOGS - --- To set your Discord Webhook URL go to server.lua, line 3 - -Config.BotName = 'ServerName' -- Write the desired bot name - -Config.ServerName = 'ServerName' -- Write your server's name - -Config.IconURL = '' -- Insert your desired image link - -Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html - --- To change a webhook color you need to set the decimal value of a color, you can use this website to do that - https://www.mathsisfun.com/hexadecimal-decimal-colors.html - -Config.StartCraftWebhookColor = '16127' - -Config.CancelWebhookColor = '16776960' - -Config.ClaimCraftWebhookColor = '65352' - -Config.FailedCraftWebhookColor = '16711680' - --------------------------- LOCALES (DON'T TOUCH) - -function _L(id) - if Locales[Config.Locale][id] then - return Locales[Config.Locale][id] - else - print('Locale '..id..' doesn\'t exist') - end -end - --- diff --git a/resources/[test]/okokCrafting/fxmanifest.lua b/resources/[test]/okokCrafting/fxmanifest.lua deleted file mode 100644 index 034a67ca3..000000000 --- a/resources/[test]/okokCrafting/fxmanifest.lua +++ /dev/null @@ -1,42 +0,0 @@ -fx_version 'cerulean' - -game 'gta5' - -author 'okok#3488' -description 'okokCrafting' -version '1.1.0' - -ui_page 'web/ui.html' - -files { - 'web/*.*', -} - -shared_script 'config.lua' - -client_scripts { - 'locales/*.lua', - 'cl_utils.lua', - 'client.lua', -} - -server_scripts { - '@oxmysql/lib/MySQL.lua', - 'locales/*.lua', - 'sv_utils.lua', - 'server.lua' -} - -lua54 'yes' - -escrow_ignore { - 'config.lua', - 'cl_utils.lua', - 'sv_utils.lua', - 'locales/*.lua', -} - -server_exports { - 'SetLevel' -} -dependency '/assetpacks' \ No newline at end of file diff --git a/resources/[test]/okokCrafting/locales/de.lua b/resources/[test]/okokCrafting/locales/de.lua deleted file mode 100644 index 0383f3044..000000000 --- a/resources/[test]/okokCrafting/locales/de.lua +++ /dev/null @@ -1,133 +0,0 @@ -Locales['de'] = { - - -- Notifications - ['user_xp_set'] = { - title = 'WERKBANK', - text = 'Deine Erfahrungspunkte wurden auf ${s1} gesetzt', - time = 5000, - type = 'info' - }, - ['admin_xp_set'] = { - title = 'WERKBANK', - text = 'Du hast erfolgreich die Erfahrungspunkte von ${s1} zu ${s2} geändert', - time = 5000, - type = 'success' - }, - ['user_xp_set_workbench'] = { - title = 'WERKBANK', - text = 'Deine Erfahrungspunkte wurden in der Werkbank ${s2} auf ${s1} gesetzt', - time = 5000, - type = 'info' - }, - ['admin_xp_set_workbench'] = { - title = 'WERKBANK', - text = 'Du hast erfolgreich die Erfahrungspunkte von ${s1}, in der Werkbank ${s3}, auf ${s2} gesetzt', - time = 5000, - type = 'success' - }, - ['user_level_set'] = { - title = 'WERKBANK', - text = 'Dein Level wurde auf ${s1} geändert', - time = 5000, - type = 'info' - }, - ['admin_level_set'] = { - title = 'WERKBANK', - text = 'Du hast erfolgreich das Level von ${s1} auf ${s2} geändert', - time = 5000, - type = 'success' - }, - ['user_level_set_workbench'] = { - title = 'WERKBANK', - text = 'Dein Level wurde in der Werkbank ${s2} auf ${s1} geändert', - time = 5000, - type = 'info' - }, - ['admin_level_set_workbench'] = { - title = 'WERKBANK', - text = 'Du hast erfolgreich das Level von ${s1}, in der Werkbank ${s3}, auf ${s2} geändert', - time = 5000, - type = 'success' - }, - ['admin_level_no_exist'] = { - title = 'WERKBANK', - text = 'Dieses Level existiert nicht', - time = 5000, - type = 'error' - }, - ['cant_carry'] = { - title = 'WERKBANK', - text = "Du kannst diesen Gegenstand nicht bei dir tragen", - time = 5000, - type = 'error' - }, - ['added_to_queue'] = { - title = 'WERKBANK', - text = '${s1} wurde zur Warteschlange hinzugefügt', - time = 5000, - type = 'success' - }, - ['cant_craft'] = { - title = 'WERKBANK', - text = "Du kannst ${s1} nicht herstellen", - time = 5000, - type = 'error' - }, - ['inside_vehicle'] = { - title = 'WERKBANK', - text = "Du kannst nichts in einem Fahrzeug herstellen", - time = 5000, - type = 'error' - }, - ['queue_limit'] = { - title = 'WERKBANK', - text = 'Die Warteschlange ist bereits voll', - time = 5000, - type = 'error' - }, - ['claimed_item'] = { - title = 'WERKBANK', - text = 'Du hast ${s1} bekommen', - time = 5000, - type = 'success' - }, - ['claimed_all_items'] = { - title = 'WERKBANK', - text = 'Du hast alle Gegenstände bekommen', - time = 5000, - type = 'success' - }, - ['cancel_item'] = { - title = 'WERKBANK', - text = 'Du hast die Herstellung von ${s1} abgebrochen', - time = 5000, - type = 'error' - }, - - -- Chat suggestions - ['suggestion_xp'] = { - maintext = 'Ändere das XP eines Spieler', - id = 'ID', - idtext = "Ziel ID", - xp = 'XP', - xptext = 'XP menge', - workbench = 'Werkbank', - workbenchtext = "ID der Werkbank", - }, - ['suggestion_level'] = { - maintext = 'Ändere das Level eines Spielers', - id = 'ID', - idtext = "Ziel ID", - level = 'Level', - leveltext = 'Level', - workbench = 'Werkbank', - workbenchtext = "ID der Werkbank", - }, - - -- okokTextUI - ['textUI'] = { - text = '[E] Werkbank zu öffnen', - color = 'darkblue', - side = 'left' - }, -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/locales/en.lua b/resources/[test]/okokCrafting/locales/en.lua deleted file mode 100644 index d1eb65461..000000000 --- a/resources/[test]/okokCrafting/locales/en.lua +++ /dev/null @@ -1,133 +0,0 @@ -Locales['en'] = { - - -- Notifications - ['user_xp_set'] = { - title = 'CRAFTING', - text = 'Your XP was set to ${s1}', - time = 5000, - type = 'info' - }, - ['admin_xp_set'] = { - title = 'CRAFTING', - text = 'You set the XP of ${s1} to ${s2} successfully', - time = 5000, - type = 'success' - }, - ['user_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'Your XP was set to ${s1} in ${s2}', - time = 5000, - type = 'info' - }, - ['admin_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'You set the XP of ${s1} to ${s2} in ${s3} successfully', - time = 5000, - type = 'success' - }, - ['user_level_set'] = { - title = 'CRAFTING', - text = 'Your level was set to ${s1}', - time = 5000, - type = 'info' - }, - ['admin_level_set'] = { - title = 'CRAFTING', - text = 'You set the level of ${s1} to ${s2} successfully', - time = 5000, - type = 'success' - }, - ['user_level_set_workbench'] = { - title = 'CRAFTING', - text = 'Your level was set to ${s1} in ${s2}', - time = 5000, - type = 'info' - }, - ['admin_level_set_workbench'] = { - title = 'CRAFTING', - text = 'You set the level of ${s1} to ${s2} in ${s3} successfully', - time = 5000, - type = 'success' - }, - ['admin_level_no_exist'] = { - title = 'CRAFTING', - text = 'That level does not exist', - time = 5000, - type = 'error' - }, - ['cant_carry'] = { - title = 'CRAFTING', - text = "You can't carry this item", - time = 5000, - type = 'error' - }, - ['added_to_queue'] = { - title = 'CRAFTING', - text = '${s1} added to the crafting queue', - time = 5000, - type = 'success' - }, - ['cant_craft'] = { - title = 'CRAFTING', - text = "You can't craft ${s1}", - time = 5000, - type = 'error' - }, - ['inside_vehicle'] = { - title = 'CRAFTING', - text = "You can't craft inside a vehicle", - time = 5000, - type = 'error' - }, - ['queue_limit'] = { - title = 'CRAFTING', - text = 'You have reached the queue limit', - time = 5000, - type = 'error' - }, - ['claimed_item'] = { - title = 'CRAFTING', - text = 'You have claimed ${s1}', - time = 5000, - type = 'success' - }, - ['claimed_all_items'] = { - title = 'CRAFTING', - text = 'You have claimed all items', - time = 5000, - type = 'success' - }, - ['cancel_item'] = { - title = 'CRAFTING', - text = 'You canceled a crafting of ${s1}', - time = 5000, - type = 'error' - }, - - -- Chat suggestions - ['suggestion_xp'] = { - maintext = 'Set a players crafting XP', - id = 'id', - idtext = "Target's id", - xp = 'XP', - xptext = 'XP amount', - workbench = 'workbench', - workbenchtext = "Workbenche's id", - }, - ['suggestion_level'] = { - maintext = 'Set a players crafting Level', - id = 'id', - idtext = "Target's id", - level = 'Level', - leveltext = 'Level', - workbench = 'workbench', - workbenchtext = "Workbenche's id", - }, - - -- okokTextUI - ['textUI'] = { - text = '[E] Open crafting table', - color = 'darkblue', - side = 'left' - }, -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/locales/fr.lua b/resources/[test]/okokCrafting/locales/fr.lua deleted file mode 100644 index d2f39a177..000000000 --- a/resources/[test]/okokCrafting/locales/fr.lua +++ /dev/null @@ -1,133 +0,0 @@ -Locales['fr'] = { - - -- Notifications - ['user_xp_set'] = { - title = 'CRAFTING', - text = 'Votre XP a été défini sur ${s1}', - time = 5000, - type = 'info' - }, - ['admin_xp_set'] = { - title = 'CRAFTING', - text = 'Vous avez défini XP de ${s1} sur ${s2} avec succès', - time = 5000, - type = 'success' - }, - ['user_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'Votre XP a été défini de ${s1} en ${s2}', - time = 5000, - type = 'info' - }, - ['admin_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'Vous avez défini XP de ${s1} sur ${s2} en ${s3} avec succès', - time = 5000, - type = 'success' - }, - ['user_level_set'] = { - title = 'CRAFTING', - text = 'Votre niveau a été défini sur ${s1}', - time = 5000, - type = 'info' - }, - ['admin_level_set'] = { - title = 'CRAFTING', - text = 'Vous avez défini le niveau de ${s1} sur ${s2} avec succès', - time = 5000, - type = 'success' - }, - ['user_level_set_workbench'] = { - title = 'CRAFTING', - text = 'Votre niveau a été défini sur ${s1} en ${s2}', - time = 5000, - type = 'info' - }, - ['admin_level_set_workbench'] = { - title = 'CRAFTING', - text = 'Vous avez défini le niveau de ${s1} sur ${s2} en ${s3} avec succès', - time = 5000, - type = 'success' - }, - ['admin_level_no_exist'] = { - title = 'CRAFTING', - text = 'Ce niveau n\'existe pas', - time = 5000, - type = 'error' - }, - ['cant_carry'] = { - title = 'CRAFTING', - text = "Cet objet est trop lourd ! Impossible de le porter", - time = 5000, - type = 'error' - }, - ['added_to_queue'] = { - title = 'CRAFTING', - text = '${s1} ajouté à la file de fabrication', - time = 5000, - type = 'success' - }, - ['cant_craft'] = { - title = 'CRAFTING', - text = "Vous ne pouvez pas fabriquer ${s1}", - time = 5000, - type = 'error' - }, - ['inside_vehicle'] = { - title = 'CRAFTING', - text = "Vous ne pouvez pas fabriquer à l\'intérieur d'un véhicule", - time = 5000, - type = 'error' - }, - ['queue_limit'] = { - title = 'CRAFTING', - text = 'Vous avez atteint la limite de la file de fabrication', - time = 5000, - type = 'error' - }, - ['claimed_item'] = { - title = 'CRAFTING', - text = 'Vous avez reçu ${s1}', - time = 5000, - type = 'success' - }, - ['claimed_all_items'] = { - title = 'CRAFTING', - text = 'Vous avez tout reçu', - time = 5000, - type = 'success' - }, - ['cancel_item'] = { - title = 'CRAFTING', - text = 'Vous avez annulé la fabrication de ${s1}', - time = 5000, - type = 'error' - }, - - -- Chat suggestions - ['suggestion_xp'] = { - maintext = 'Définissez un joueur fabriquant de l\'XP', - id = 'id', - idtext = "ID de la cible", - xp = 'XP', - xptext = 'Montant d\'XP', - workbench = 'workbench', - workbenchtext = "ID des établis", - }, - ['suggestion_level'] = { - maintext = 'Définissez le niveau de craft des joueurs', - id = 'id', - idtext = "ID de la cible", - level = 'Level', - leveltext = 'Niveau', - workbench = 'workbench', - workbenchtext = "ID des établis", - }, - - -- okokTextUI - ['textUI'] = { - text = '[E] Ouvrir l\'établi', - color = 'darkblue', - side = 'left' - }, -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/locales/gr.lua b/resources/[test]/okokCrafting/locales/gr.lua deleted file mode 100644 index 64ea4e162..000000000 --- a/resources/[test]/okokCrafting/locales/gr.lua +++ /dev/null @@ -1,133 +0,0 @@ -Locales['gr'] = { - - -- Notifications - ['user_xp_set'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Το XP σας ορίστηκε σε ${s1}', - time = 5000, - type = 'info' - }, - ['admin_xp_set'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Ρυθμίζετε το XP του ${s1} σε ${s2} με επιτυχία', - time = 5000, - type = 'success' - }, - ['user_xp_set_workbench'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Το XP σας ορίστηκε σε ${s1} σε ${s2}', - time = 5000, - type = 'info' - }, - ['admin_xp_set_workbench'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Ρυθμίζετε το XP του ${s1} προς ${s2} σε ${s3} με επιτυχία', - time = 5000, - type = 'success' - }, - ['user_level_set'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Το επίπεδό σας ορίστηκε σε ${s1}', - time = 5000, - type = 'info' - }, - ['admin_level_set'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Ρυθμίσετε το επίπεδο του ${s1} προς ${s2} με επιτυχία', - time = 5000, - type = 'success' - }, - ['user_level_set_workbench'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Το επίπεδό σας ορίστηκε σε ${s1} in ${s2}', - time = 5000, - type = 'info' - }, - ['admin_level_set_workbench'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Ρυθμίσετε το επίπεδο του ${s1} προς ${s2} σε ${s3} με επιτυχία', - time = 5000, - type = 'success' - }, - ['admin_level_no_exist'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Αυτό το επίπεδο δεν υπάρχει', - time = 5000, - type = 'error' - }, - ['cant_carry'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = "Δεν μπορείτε να μεταφέρετε αυτό το αντικείμενο", - time = 5000, - type = 'error' - }, - ['added_to_queue'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = '${s1} προστέθηκε στην ουρά χειροτεχνίας', - time = 5000, - type = 'success' - }, - ['cant_craft'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = "Δεν μπορείς να χειροτεχνήσεις ${s1}", - time = 5000, - type = 'error' - }, - ['inside_vehicle'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = "Δεν μπορείτε να κάνετε χειροτεχνία μέσα σε ένα όχημα", - time = 5000, - type = 'error' - }, - ['queue_limit'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Έχετε φτάσει το όριο της ουράς', - time = 5000, - type = 'error' - }, - ['claimed_item'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Έχετε διεκδικήσει ${s1}', - time = 5000, - type = 'success' - }, - ['claimed_all_items'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Έχετε διεκδικήσει όλα τα στοιχεία', - time = 5000, - type = 'success' - }, - ['cancel_item'] = { - title = 'ΚΑΤΑΣΚΕΥΗ', - text = 'Ακυρώσατε μια δημιουργία του ${s1}', - time = 5000, - type = 'error' - }, - - -- Chat suggestions - ['suggestion_xp'] = { - maintext = 'Ρυθμίσετε το επίπεδο του παίκτη', - id = 'ταυτότητα', - idtext = "Ταυτότητα στόχου", - xp = 'XP', - xptext = 'XP ποσό', - workbench = 'πάγκος εργασίας', - workbenchtext = "Ταυτότητα πάγκων εργασίας", - }, - ['suggestion_level'] = { - maintext = 'Ρυθμίσετε το επίπεδο του παίκτη', - id = 'ταυτότητα', - idtext = "Ταυτότητα στόχου", - level = 'Επίπεδο', - leveltext = 'Επίπεδο', - workbench = 'πάγκος εργασίας', - workbenchtext = "Ταυτότητα πάγκων εργασίας", - }, - - -- okokTextUI - ['textUI'] = { - text = '[E] Να ανοίξω το τραπέζι χειροτεχνίας', - color = 'darkblue', - side = 'left' - }, -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/locales/pt.lua b/resources/[test]/okokCrafting/locales/pt.lua deleted file mode 100644 index 1e040783a..000000000 --- a/resources/[test]/okokCrafting/locales/pt.lua +++ /dev/null @@ -1,133 +0,0 @@ -Locales['pt'] = { - - -- Notifications - ['user_xp_set'] = { - title = 'CRAFTING', - text = 'A tua XP foi alterada para ${s1}', - time = 5000, - type = 'info' - }, - ['admin_xp_set'] = { - title = 'CRAFTING', - text = 'Alteraste a XP de ${s1} para ${s2} com sucesso', - time = 5000, - type = 'success' - }, - ['user_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'A tua XP foi alterada para ${s1} em ${s2}', - time = 5000, - type = 'info' - }, - ['admin_xp_set_workbench'] = { - title = 'CRAFTING', - text = 'Alteraste a XP de ${s1} para ${s2} em ${s3} com sucesso', - time = 5000, - type = 'success' - }, - ['user_level_set'] = { - title = 'CRAFTING', - text = 'O teu nível foi alterado para ${s1}', - time = 5000, - type = 'info' - }, - ['admin_level_set'] = { - title = 'CRAFTING', - text = 'Alteraste o nível de ${s1} em ${s2} com sucesso', - time = 5000, - type = 'success' - }, - ['user_level_set_workbench'] = { - title = 'CRAFTING', - text = 'O teu nível foi alterado para ${s1} em ${s2}', - time = 5000, - type = 'info' - }, - ['admin_level_set_workbench'] = { - title = 'CRAFTING', - text = 'Alteraste o nível de ${s1} para ${s2} em ${s3} com sucesso', - time = 5000, - type = 'success' - }, - ['admin_level_no_exist'] = { - title = 'CRAFTING', - text = 'Esse nível não existe', - time = 5000, - type = 'error' - }, - ['cant_carry'] = { - title = 'CRAFTING', - text = "Não tens espaço suficiente para carregar o item", - time = 5000, - type = 'error' - }, - ['added_to_queue'] = { - title = 'CRAFTING', - text = '${s1} foi adicionado à queue', - time = 5000, - type = 'success' - }, - ['cant_craft'] = { - title = 'CRAFTING', - text = "Não podes craftar ${s1}", - time = 5000, - type = 'error' - }, - ['inside_vehicle'] = { - title = 'CRAFTING', - text = "Não podes craftar dentro de um veículo", - time = 5000, - type = 'error' - }, - ['queue_limit'] = { - title = 'CRAFTING', - text = 'Atingiste o limite da queue', - time = 5000, - type = 'error' - }, - ['claimed_item'] = { - title = 'CRAFTING', - text = 'Resgataste ${s1}', - time = 5000, - type = 'success' - }, - ['claimed_all_items'] = { - title = 'CRAFTING', - text = 'Regataste todos os itens', - time = 5000, - type = 'success' - }, - ['cancel_item'] = { - title = 'CRAFTING', - text = 'Cancelaste o craft de ${s1}', - time = 5000, - type = 'error' - }, - - -- Chat suggestions - ['suggestion_xp'] = { - maintext = 'Define o XP de craft de um jogador', - id = 'id', - idtext = "ID do jogador", - xp = 'XP', - xptext = 'Quantidade de XP', - workbench = 'workbench', - workbenchtext = "ID da workbench", - }, - ['suggestion_level'] = { - maintext = 'Define o nível de craft de um jogador', - id = 'id', - idtext = "ID do jogador", - level = 'Nível', - leveltext = 'Nível', - workbench = 'workbench', - workbenchtext = "ID da workbench", - }, - - -- okokTextUI - ['textUI'] = { - text = '[E] Abrir crafting table', - color = 'darkblue', - side = 'left' - }, -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/okokcrafting.sql b/resources/[test]/okokCrafting/okokcrafting.sql deleted file mode 100644 index ed47b157f..000000000 --- a/resources/[test]/okokCrafting/okokcrafting.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE players ADD COLUMN xp LONGTEXT NULL; -ALTER TABLE players ADD COLUMN okokcrafts LONGTEXT NULL; \ No newline at end of file diff --git a/resources/[test]/okokCrafting/server.lua b/resources/[test]/okokCrafting/server.lua deleted file mode 100644 index 388234875be6d9e811d8f4b322f74a52bd489942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16574 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 B5D@?X diff --git a/resources/[test]/okokCrafting/sv_utils.lua b/resources/[test]/okokCrafting/sv_utils.lua deleted file mode 100644 index a9c6adf8b..000000000 --- a/resources/[test]/okokCrafting/sv_utils.lua +++ /dev/null @@ -1,590 +0,0 @@ -QBCore = exports[Config.qbPrefix.."-core"]:GetCoreObject() - -Webhook = '' - -function getMoney(type, xPlayer) - local moneyCount = 0 - if type == "cash" then - moneyCount = xPlayer.PlayerData.money.cash - else - moneyCount = xPlayer.PlayerData.money.bank - end - - return moneyCount -end - -function addMoney(type, value, xPlayer) - xPlayer.Functions.AddMoney(type, value) -end - -function removeMoney(type, value, xPlayer) - xPlayer.Functions.RemoveMoney(type, value) -end - -function addItem(xPlayer, item, amount, data) - xPlayer.Functions.AddItem(item, tonumber(amount)) -end - -function removeItem(xPlayer, item, amount) - xPlayer.Functions.RemoveItem(item, tonumber(amount)) -end - -function canCarryIt(item, amount, xPlayer) - if Config.UseOx_inventory then - return exports.ox_inventory:CanCarryItem(xPlayer.PlayerData.source, item, amount) - end - - local totalWeight = QBCore.Player.GetTotalWeight(xPlayer.PlayerData.items) - local itemInfo = QBCore.Shared.Items[item:lower()] - if not itemInfo then - TriggerClientEvent('QBCore:Notify', xPlayer.PlayerData.source, 'This item doesn\'t exits', 'error') - return - end - amount = tonumber(amount) - if (totalWeight + (itemInfo['weight'] * amount)) <= 120000 then - return true - else - return false - end -end - -function hasPermission(source) - local staff = false - for k,v in ipairs(Config.AdminGroups) do - if QBCore.Functions.HasPermission(source, v) then - staff = true - break - end - end - - return staff -end - -function MySQLexecute(query, values, func) - return MySQL.query(query, values, func) -end - -function MySQLfetchAll(query, values, func) - return MySQL.query(query, values, func) -end - -function giveXP(xPlayer, xp, workbench) - if Config.SameLevelForAllTables then - MySQLexecute('UPDATE players SET '..Config.xpColumnsName..' = xp+@xp WHERE citizenid = @identifier', { - ['@identifier'] = xPlayer.PlayerData.citizenid, - ['@xp'] = Config.DoubleXP and xp*2 or xp, - }, function (result) - TriggerClientEvent(Config.EventPrefix..':updateXP', xPlayer.PlayerData.source) - end) - else - MySQLexecute('UPDATE players SET '..Config.xpColumnsName..' = JSON_SET(xp, @table, JSON_EXTRACT(xp, @table) + @xp) WHERE citizenid = @identifier', { - ['@identifier'] = xPlayer.PlayerData.citizenid, - ['@xp'] = Config.DoubleXP and xp*2 or xp, - ['@table'] = "$."..workbench, - }, function (result) - TriggerClientEvent(Config.EventPrefix..':updateXP', xPlayer.PlayerData.source) - end) - end -end - -QBCore.Functions.CreateCallback(Config.EventPrefix..":inv2", function(source, cb, item, isMoney) - local xPlayer = QBCore.Functions.GetPlayer(source) - local itemS = {} - if isMoney == "false" then - isMoney = false - elseif isMoney == "true" then - isMoney = true - end - - if isMoney then - local playerMoney = getMoney(item, xPlayer) - itemS.name = item - itemS.amount = playerMoney - else - itemS = xPlayer.Functions.GetItemByName(item) - if itemS == nil then - itemS = { - name = item, - amount = 0 - } - end - if itemS.count ~= nil then - itemS.amount = itemS.count - end - end - - cb(itemS) -end) - -QBCore.Functions.CreateCallback(Config.EventPrefix..":maxCraft", function(source, cb, recipe, maxCraftAmount, isDisassemble, itemC, itmNeeded) - local _source = source - local xPlayer = QBCore.Functions.GetPlayer(_source) - local maxCraft = maxCraftAmount - local itemAmt = 0 - - if not isDisassemble then - for k,v in ipairs(recipe) do - local item = {} - local itemCount = 0 - - if v[4] then - itemCount = getMoney(v[1], xPlayer) - else - item = xPlayer.Functions.GetItemByName(v[1]) - if item == nil then - item = { - name = v[1], - amount = 0 - } - end - if item.count ~= nil then - item.amount = item.count - end - itemCount = item.amount - end - - if itemCount > 0 then - local possibleToCraft = itemCount/tonumber(v[2]) - if possibleToCraft > 0 then - if maxCraft > possibleToCraft then - maxCraft = possibleToCraft - end - else - maxCraft = 0 - break - end - else - maxCraft = 0 - break - end - end - else - local item = xPlayer.Functions.GetItemByName(itemC) - if item == nil then - item = { - name = itemC, - amount = 0 - } - end - if item.count ~= nil then - item.amount = item.count - end - itemAmt = item.amount - - if itemAmt > 0 then - local possibleToCraft = itemAmt/tonumber(itmNeeded) - if possibleToCraft > 0 then - if maxCraft > possibleToCraft then - maxCraft = possibleToCraft - end - else - maxCraft = 0 - end - else - maxCraft = 0 - end - end - - cb(math.floor(maxCraft), itemAmt) -end) - -local function normalizeRecipe(recipe) - local normalized = {} - for _, item in ipairs(recipe) do - local normalizedItem = { item[1], tonumber(item[2]), item[3] == "true" or item[3] == true, item[4] == "true" or item[4] == true } - table.insert(normalized, normalizedItem) - end - return normalized -end - -local function compareRecipes(recipe1, recipe2) - if #recipe1 ~= #recipe2 then - return false - end - for i, item1 in ipairs(recipe1) do - local item2 = recipe2[i] - if item1[1] ~= item2[1] and item1[2] <= item2[2] then - return false - end - end - return true -end - -function craftExistsInWorkbench(workbenchID, itemID, recipe) - for _, workbench in pairs(Config.Crafting) do - if workbench.tableID == workbenchID then - for _, craft in pairs(workbench.crafts) do - if Config.Crafts[craft] == nil then - print("Craft "..craft.." does not exist in Config.Crafts") - return false - end - if Config.Crafts[craft].item == itemID then - local normalizedCraftRecipe = normalizeRecipe(Config.Crafts[craft].recipe) - local normalizedInputRecipe = normalizeRecipe(recipe) - if compareRecipes(normalizedCraftRecipe, normalizedInputRecipe) then - return true - end - end - end - end - end - return false -end - -QBCore.Functions.CreateCallback(Config.EventPrefix..":CanCraftItem", function(source, cb, itemID, recipe, itemName, amount, isItem, workbench, timeCraft, CraftQueues, xp, pc, isDis, itemData) - local xPlayer = QBCore.Functions.GetPlayer(source) - local canCraft = true - if not craftExistsInWorkbench(workbench, itemID, recipe) then - canCraft = false - end - - if not isDis then - for k,v in pairs(recipe) do - if v[4] == "false" then - local item = xPlayer.Functions.GetItemByName(v[1]) - if item == nil then - item = { - name = v[1], - amount = 0 - } - end - if item.count ~= nil then - item.amount = item.count - end - if item.amount < v[2] then - canCraft = false - end - else - local playerMoney = getMoney(v[1], xPlayer) - if playerMoney < v[2] then - canCraft = false - end - end - end - else - local item = xPlayer.Functions.GetItemByName(itemID) - if item == nil then - item = { - name = itemID, - amount = 0 - } - end - if item.count ~= nil then - item.amount = item.count - end - if tonumber(item.amount) < tonumber(amount) then - canCraft = false - end - end - - if canCraft then - if not isDis then - for k,v in pairs(recipe) do - if v[3] == "true" then - if v[4] == "true" then - removeMoney(v[1], v[2], xPlayer) - else - removeItem(xPlayer, v[1], v[2]) - end - end - end - else - removeItem(xPlayer, itemID, tonumber(amount)) - end - - local queue = CraftQueues - if queue ~= nil and queue[workbench] ~= nil then - queue[workbench][#queue[workbench]+1] = { - item = itemID, - recipe = recipe, - amount = amount, - isItem = isItem, - time = timeCraft, - itemName = itemName[itemID], - isDone = false, - isPending = true, - randomID = math.random(100000000, 999999999), - xp = xp, - sucPC = pc, - suc = true, - isDis = isDis, - data = itemData - } - - MySQLexecute('UPDATE players SET '..Config.craftQueryColumnName..' = @okokcrafts WHERE citizenid = @identifier', { - ['@identifier'] = xPlayer.PlayerData.citizenid, - ['@okokcrafts'] = json.encode(queue), - }, function (result) - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('added_to_queue').title, interp(_L('added_to_queue').text, {s1 = itemName[itemID]}), _L('added_to_queue').time, _L('added_to_queue').type) - - if Webhook ~= "" then - data = { - playerid = xPlayer.PlayerData.source, - type = "start-craft", - item = itemName[itemID], - amount = amount, - } - - discordWebhook(data) - end - - cb(queue) - end) - else - if queue == nil then - queue = {} - end - queue[workbench] = {} - queue[workbench] = { - [1] = { - item = itemID, - recipe = recipe, - amount = amount, - isItem = isItem, - time = timeCraft, - itemName = itemName[itemID], - isDone = false, - isPending = true, - randomID = math.random(100000000, 999999999), - xp = xp, - sucPC = pc, - suc = true, - isDis = isDis, - data = itemData - } - } - - MySQLexecute('UPDATE players SET '..Config.craftQueryColumnName..' = @okokcrafts WHERE citizenid = @identifier', { - ['@identifier'] = xPlayer.PlayerData.citizenid, - ['@okokcrafts'] = json.encode(queue), - }, function (result) - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('added_to_queue').title, interp(_L('added_to_queue').text, {s1 = itemName[itemID]}), _L('added_to_queue').time, _L('added_to_queue').type) - - if Webhook ~= "" then - data = { - playerid = xPlayer.PlayerData.source, - type = "start-craft", - item = itemName[itemID], - amount = amount, - } - discordWebhook(data) - end - - cb(queue) - end) - end - else - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_craft').title, interp(_L('cant_craft').text, {s1 = itemName[itemID]}), _L('cant_craft').time, _L('cant_craft').type) - cb(false) - end -end) - -RegisterServerEvent(Config.EventPrefix..':claimAll') -AddEventHandler(Config.EventPrefix..':claimAll', function(workbench, AllQueues) - local xPlayer = QBCore.Functions.GetPlayer(source) - local gotQueue = false - local CraftsQueue = {} - - MySQLfetchAll('SELECT okokcrafts FROM players WHERE citizenid = @identifier', { - ['@identifier'] = xPlayer.PlayerData.citizenid, - }, function (result) - if result[1] ~= nil then - local data = json.decode(result[1].okokcrafts) - if data ~= nil then - CraftsQueue = data - gotQueue = true - end - end - end) - - while not gotQueue do - Citizen.Wait(100) - end - - local queue = CraftsQueue[workbench] - local v = queue[1] - - if v ~= nil then - if v.isDone then - if v.suc then - if not v.isDis then - local canCarry = false - if v.isItem then - if canCarryIt(v.item, v.amount, xPlayer) then - addItem(xPlayer, v.item, v.amount, v.data) - canCarry = true - end - else - if canCarryIt(v.item, v.amount, xPlayer) then - addItem(xPlayer, v.item, v.amount) - canCarry = true - end - end - - if canCarry then - if Webhook ~= "" then - data = { - playerid = xPlayer.PlayerData.source, - type = "claim-craft", - item = v.itemName, - amount = v.amount, - } - - discordWebhook(data) - end - - if Config.UseXP then - giveXP(xPlayer, v.xp, workbench) - end - TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench) - else - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_carry').title, _L('cant_carry').text, _L('cant_carry').time, _L('cant_carry').type) - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('claimed_all_items').title, _L('claimed_all_items').text, _L('claimed_all_items').time, _L('claimed_all_items').type) - TriggerClientEvent(Config.EventPrefix..':resetClaimAllButton', xPlayer.PlayerData.source) - end - else - local canCarry = true - for k2,v2 in ipairs(v.recipe) do - if v2[4] == "false" or v2[4] == false then - if not canCarryIt(v2[1], v2[2], xPlayer) then - canCarry = false - end - end - end - - if canCarry then - for k2,v2 in ipairs(v.recipe) do - if v2[4] == "true" or v2[4] == true then - addMoney(v2[1], v2[2], xPlayer) - else - addItem(xPlayer, v2[1], v2[2]) - end - end - - if Webhook ~= "" then - data = { - playerid = xPlayer.PlayerData.source, - type = "claim-craft", - item = v.itemName, - amount = v.amount, - } - - discordWebhook(data) - end - - - if Config.UseXP then - giveXP(xPlayer, v.xp, workbench) - end - TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench) - else - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('cant_carry').title, _L('cant_carry').text, _L('cant_carry').time, _L('cant_carry').type) - TriggerClientEvent(Config.EventPrefix..':notification', xPlayer.PlayerData.source, _L('claimed_all_items').title, _L('claimed_all_items').text, _L('claimed_all_items').time, _L('claimed_all_items').type) - TriggerClientEvent(Config.EventPrefix..':resetClaimAllButton', xPlayer.PlayerData.source) - end - end - else - if Webhook ~= "" then - data = { - playerid = xPlayer.PlayerData.source, - type = "failed-craft", - item = v.itemName, - amount = v.amount, - } - - discordWebhook(data) - end - if Config.GiveXPOnCraftFailed and Config.UseXP then - if Config.UseXP then - giveXP(xPlayer, v.xp, workbench) - end - end - TriggerClientEvent(Config.EventPrefix..':removeItemsFromQueue', xPlayer.PlayerData.source, 1, workbench) - end - end - end -end) - --------------------------- IDENTIFIERS - -function ExtractIdentifiers(id) - local identifiers = { - steam = "", - ip = "", - discord = "", - license = "", - xbl = "", - live = "" - } - - for i = 0, GetNumPlayerIdentifiers(id) - 1 do - local playerID = GetPlayerIdentifier(id, i) - - if string.find(playerID, "steam") then - identifiers.steam = playerID - elseif string.find(playerID, "ip") then - identifiers.ip = playerID - elseif string.find(playerID, "discord") then - identifiers.discord = playerID - elseif string.find(playerID, "license") then - identifiers.license = playerID - elseif string.find(playerID, "xbl") then - identifiers.xbl = playerID - elseif string.find(playerID, "live") then - identifiers.live = playerID - end - end - - return identifiers -end - --------------------------- WEBHOOK - -function discordWebhook(data) - local color = '65352' - local category = 'default' - local item = '' - local amount = '' - local identifierlist = ExtractIdentifiers(data.playerid) - local identifier = identifierlist.license:gsub("license2:", "") - local discord = "<@"..identifierlist.discord:gsub("discord:", "")..">" - - if data.type == 'start-craft' then - color = Config.StartCraftWebhookColor - category = 'Started a craft' - item = data.item - amount = data.amount - elseif data.type == 'cancel-craft' then - color = Config.CancelWebhookColor - category = 'Canceled a craft' - item = data.item - amount = data.amount - elseif data.type == 'claim-craft' then - color = Config.ClaimCraftWebhookColor - category = 'Claimed' - item = data.item - amount = data.amount - elseif data.type == 'failed-craft' then - color = Config.FailedCraftWebhookColor - category = 'Failed a craft' - item = data.item - amount = data.amount - end - - local information = { - { - ["color"] = color, - ["author"] = { - ["icon_url"] = Config.IconURL, - ["name"] = Config.ServerName..' - Logs', - }, - ["title"] = 'CRAFTING', - ["description"] = '**Action:** '..category..'\n**Item:** '..item..'\n**Amount:** '..amount..'\n\n**ID:** '..data.playerid..'\n**Identifier:** '..identifier..'\n**Discord:** '..discord, - ["footer"] = { - ["text"] = os.date(Config.DateFormat), - } - } - } - - PerformHttpRequest(Webhook, function(err, text, headers) end, 'POST', json.encode({username = Config.BotName, embeds = information}), {['Content-Type'] = 'application/json'}) -end \ No newline at end of file diff --git a/resources/[test]/okokCrafting/web/click.mp3 b/resources/[test]/okokCrafting/web/click.mp3 deleted file mode 100644 index 058e5cd2cedcd23c32d485b1bfc61c36d3374472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5014 zcmezWd%_V0bl{nnmJbx;2V!mp2H|N8;xM2G1FkR-3j-xE&IQqI8>lqptFrEcDNl%c0L8L*2`LPoNLj%YiA|lU&KoTPf{0Bu4^8p6NB|u** zFff=jFfgz%G8|Z-Ai-ncz`$VteBoiPKPt>}D|YDr-Lpd|1qg{1=0h^PvhtzH91!+5(tBn`1`8Fj;oDgeBx)8_MxuEb{iR6JJ z0xOs$4|DL?F&;47VAyapq2VuESvr%$1|BE21qK}~O!p5Q-VngBAo<^Yh6Q?T{0tvd zm<~t?H#Qv*U}JRDkWgi)|G)2HUt?o{6T^WsJWP!O26h|{0YC)>Zfxuh9Wnd={r@3h z$g+Tk>$n1sSmT8PHtreBEDu}+8W{MP7(_S^D6rT6|NoEiK!II?fdETG01tx$3o{dg z11Cd+fdUJ|fd&rV1|B}f1U9CY7ZM6g4G$P0Y3QHa4hb1X$3}+)=7s_Z#sWTO1{=Et z2`p?42ZXuV*q9Dv2r)cJFkx$KxWFekA5>} z3bXW42S$elj58R4I95GkzFc#ogusEhGgK3+Bp4qsOE4c0oLTZROLC@T&y4@SCmlHk zj2p%!A`A?wTCNW_+b1xzEVw&EmO(*6+)-$T{sD;@^LEYqXwKNMK!77*MK#|Hg(&Iu zJW^Vhn;eW1YB$|bWQ-|r3Eox{maEP@4HuWpPZY$EaAnJ1dFJo1p}na*bP~L&`w~*+mipJTr6{ zS`YfH|GUTN`t9Z0`$}FeI_Z+Y2Inp z7yhw|Bn~fDtH03Y9s^t zhXN>uEYSywU0W<=o0aRJ**8l(j diff --git a/resources/[test]/okokCrafting/web/scripts.js b/resources/[test]/okokCrafting/web/scripts.js deleted file mode 100644 index 5fb637966..000000000 --- a/resources/[test]/okokCrafting/web/scripts.js +++ /dev/null @@ -1,998 +0,0 @@ -function addStr(str, index, stringToAdd){ - return str.substring(0, index) + stringToAdd + str.substring(index, str.length); -} - -var isTimerOn = false; -var lastTime; -var categories = []; -var selectedCategory = "general_cat"; -var craft2; -var job2; -var gang; -var craftData; -var sideCraftMenu; -var itemClaiming = 0; -var CraftQueue = []; -var maxCraft = 10; -var canCraftItem = true; -var showAllCrafts = false; -var canClaimAll = true; - -var canClaimItem = true; -var canOpenSideCraft = true; - -let Inventory = ''; - -window.addEventListener('message', function(event) { - switch (event.data.action) { - case 'openCraft': - selectedCategory = "general_cat"; - canOpenSideCraft = true; - canClaimItem = true; - itemClaiming = 0; - showAllCrafts = event.data.showAllCrafts; - Inventory = event.data.inventory; - var queue = event.data.queue; - craftData = event.data; - categories = event.data.categories; - var craft = event.data.craft; - craft2 = craft; - var num = craft.length; - var paragraph = ''; - var row = '
'; - var lastRowNum = 0; - var job = event.data.job; - job2 = event.data.job; - gang = event.data.gang; - var added = 0; - var useCategories = event.data.useCategories; - var categoriesButtonsHTML = ` - - - `; - document.querySelector('#claimall-button').disabled = false; - if(useCategories){ - for(let i = 0; i < categories.length; i++){ - categoriesButtonsHTML += ` - - - `; - } - $('#categories_btns').html(categoriesButtonsHTML); - $('#categories_box').show(); - } else { - $('#categories_box').hide(); - } - - if(num >= 13){ - $('.itemslist_window').css('padding', '0.3125rem 0.55rem 0.3125rem 0.625rem'); - } else { - $('.itemslist_window').css('padding', '0.3125rem 1.05rem 0.3125rem 0.625rem'); - } - - for(var i = 0; i < num; i++) { - for(var i1 = 0; i1 < craft[i].job.length; i1++){ - if(selectedCategory == "general_cat" || craft[i].category == selectedCategory){ - if(craft[i].job[i1] == job || craft[i].job[i1] == gang || craft[i].job[i1] == ''){ - if(!event.data.UseXP){ - var itemName = event.data.itemNames; - var itemId = craft[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - var myEle = document.getElementById(itemId+"wb_"+event.data.wb+"wb_"+index); - if(!myEle) { - $(document).on('click', "#"+itemId+"wb_"+event.data.wb+"wb_"+index, function() { - if(canOpenSideCraft) { - canOpenSideCraft = false; - allID = this.id; - id = allID.substring(0, allID.indexOf('wb_')); - index2 = allID.split("wb_"); - $('.item_card-body').css('background-color', 'rgba(220, 220, 220, 0.20)'); - $('#selected'+this.id).css('background-color', 'rgba(31, 94, 255, 1)'); - var sound = new Audio('click.mp3'); - sound.volume = 0.3; - sound.play(); - $.post('https://okokCrafting/action', JSON.stringify({ - action: "craft", - item: id, - crafts: craft, - itemName: itemName, - index: index2[2], - })); - } - }); - } - - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } else { - if(craft[i].levelNeeded <= event.data.level || showAllCrafts){ - var itemName = event.data.itemNames; - var itemId = craft[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - var myEle = document.getElementById(itemId+"wb_"+event.data.wb+"wb_"+index); - if(!myEle) { - $(document).on('click', "#"+itemId+"wb_"+event.data.wb+"wb_"+index, function() { - if(canOpenSideCraft) { - canOpenSideCraft = false; - allID = this.id; - id = allID.substring(0, allID.indexOf('wb_')); - index2 = allID.split("wb_"); - $('.item_card-body').css('background-color', 'rgba(220, 220, 220, 0.20)'); - $('#selected'+this.id).css('background-color', 'rgba(31, 94, 255, 1)'); - var sound = new Audio('click.mp3'); - sound.volume = 0.3; - sound.play(); - $.post('https://okokCrafting/action', JSON.stringify({ - action: "craft", - item: id, - crafts: craft, - itemName: itemName, - index: index2[2], - level: event.data.level, - })); - } - }); - } - - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } - } - } - } - } - } - row += `
`; - - if(event.data.UseXP) { - $('#currentlevel').html(event.data.level); - document.documentElement.style.setProperty('--percentage-width', event.data.percentage+"%"); - $('.xpbar-col').css('margin-top', '-1.8rem'); - } else { - $('.xpbar').hide(); - $('.xpbar-col').css('margin-top', '5.05rem'); - } - - var queueRow = ''; - CraftQueue = queue; - if(queue.length > 0){ - if(queue.length >= 6){ - $('.craftingq_window').css('padding-right', '0.35rem'); - } else { - $('.craftingq_window').css('padding-right', '0rem'); - } - for (var i = 0; i < queue.length; i++) { - if(queue[i].isDone == true) { - if(queue[i].suc){ - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Concluded
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Concluded
-
-
-
-
-
-
- `; - } - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Failed to craft
-
-
-
-
-
-
- `; - } - } else { - if(queue[i].isPending){ - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Pending
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Pending
-
-
-
-
-
-
- `; - } - } else { - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Time left: ${queue[i].time}s
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Time left: ${queue[i].time}s
-
-
-
-
-
-
- `; - } - } - } - } - } else { - queueRow = `
The crafting queue is empty
` - } - - $('.craftingq_window').html(queueRow); - $('#craft-table').html(row); - $('.title-name').html(event.data.name); - - $('.title').fadeIn(); - $('.itemslist').fadeIn(); - $('.crafting-body').fadeIn(); - break - case 'openSideCraft': - sideCraftMenu = event.data; - canOpenSideCraft = true; - var useLevels = false; - if(sideCraftMenu.level != undefined){ - var levelNeeded = sideCraftMenu.crafts[sideCraftMenu.index].levelNeeded; - var level = sideCraftMenu.level; - useLevels = true; - } - - var isLevel = false; - $('#quantity').val(1); - maxCraft = sideCraftMenu.maxCraft; - if(canCraftItem == false){ - canCraftItem = true; - document.querySelector('#craft-button').disabled = false; - } - - var canCraft = true; - var isAvailable = false; - var num = event.data.recipe.length; - var recipe = ``; - var img = ` - - ${event.data.itemName} x${event.data.itemAmount} - `; - - if(sideCraftMenu.isDis){ - $('#top_text').html(`Requirements`); - $('#bot_text').html(`You will receive`); - img = ` - - ${event.data.itemName} x${event.data.itemAmount} (${event.data.isDisItemAmt}) - `; - } else { - $('#top_text').html(`You will receive`); - $('#bot_text').html(`Requirements`); - } - - $('#side-image').html(img); - $('#craft-time').html(event.data.time); - - if(useLevels){ - if(level >= levelNeeded){ - canCraft = true; - isAvailable = true; - isLevel = true; - } else { - isAvailable = false; - canCraft = false; - isLevel = true; - } - } - - for(var i = 0; i < num; i++){ - var idName = event.data.recipe[i][0]; - if(sideCraftMenu.isDis){ - recipe += ` -
- - ${event.data.itemNames[idName]} x${event.data.recipe[i][1]} -
- `; - if(event.data.itemAmount > event.data.isDisItemAmt){ - canCraft = false - } - } else { - recipe += ` -
- - ${event.data.itemNames[idName]} x${event.data.recipe[i][1]} (${event.data.inventory[i].key}) -
- `; - if(event.data.recipe[i][1] > event.data.inventory[i].key){ - canCraft = false - } - } - } - - - $('#craft-button-div').html(` - - `); - - if(canCraft) { - $('#craft-buttons-info').fadeIn(); - $('#craft-button-div').fadeIn(); - $('#craft-buttons-info-level').hide(); - } else { - $('#craft-buttons-info').hide(); - $('#craft-buttons-info-level').hide(); - } - - if(useLevels){ - if(!isAvailable && isLevel){ - $('#craft-button-div-level').html(` - LEVEL REQUIRED: ${levelNeeded} - `); - $('#craft-buttons-info-level').fadeIn(); - $('#craft-button-div-level').fadeIn(); - } - } - - $('#craft-percentage').html(event.data.percentage); - $('.components_window').html(recipe); - - $('.itemrequirements').fadeIn(); - break - case 'ShowCraftCount': - var time = event.data.time; - var itemName = event.data.name; - - $('#crafting-text').html(`Crafting`); - $('#item-name').html(`${itemName}`); - $('#item-timer').html(`${time}s`); - if(time == lastTime) { - $('#cog').removeClass('fa-spin'); - } else { - $('#cog').addClass('fa-spin'); - } - - - if(!isTimerOn){ - isTimerOn = true; - $('.timer').fadeIn(); - } - lastTime = time - break - case 'CompleteCraftCount': - var itemName = event.data.name; - - $('.timer_card-body').css('background-color', '#1fa34a'); - $('#crafting-text').html(`Crafted`); - $('#item-name').html(`${itemName}`); - $('#item-timer').html(`0s`); - - $('#cog').removeClass('fa-spin'); - $('#cog').removeClass('fa-cog'); - - $('#cog').addClass('fa-check'); - - break - case 'FailedCraftCount': - var itemName = event.data.name; - - $('.timer_card-body').css('background-color', '#990b0b'); - $('#crafting-text').html(`Failed to craft`); - $('#item-name').html(`${itemName}`); - $('#item-timer').html(`0s`); - - $('#cog').removeClass('fa-spin'); - $('#cog').removeClass('fa-cog'); - - $('#cog').addClass('fa-times'); - - break - case 'HideCraftCount': - isTimerOn = false; - $('.timer').fadeOut(); - setTimeout(function(){ - $('#cog').removeClass('fa-times'); - $('#cog').removeClass('fa-check'); - $('#cog').addClass('fa-spin'); - $('#cog').addClass('fa-cog'); - - $('.timer_card-body').css('background-color', 'rgba(31, 94, 255, 1)'); - }, 400); - break - case 'updateCraftingItems': - canClaimItem = true; - if(selectedCategory != ""){ - var queue = event.data.queue; - var queueRow = ''; - CraftQueue = queue; - if(queue.length > 0){ - if(queue.length >= 6){ - $('.craftingq_window').css('padding-right', '0.35rem'); - } else { - $('.craftingq_window').css('padding-right', '0rem'); - } - for (var i = 0; i < queue.length; i++) { - if(queue[i].isDone == true) { - if(queue[i].suc){ - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Concluded
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Concluded
-
-
-
-
-
-
- `; - } - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Failed to craft
-
-
-
-
-
-
- `; - } - } else { - if(queue[i].isPending){ - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Pending
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Pending
-
-
-
-
-
-
- `; - } - } else { - if(queue[i].isDis){ - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Time left: ${queue[i].time}s
-
-
-
-
-
-
- `; - } else { - queueRow += ` -
-
- -
-
${queue[i].itemName} x${queue[i].amount}
-
Time left: ${queue[i].time}s
-
-
-
-
-
-
- `; - } - } - } - } - } else { - queueRow = `
The crafting queue is empty
` - } - $('.craftingq_window').html(queueRow); - } - break - case 'resetItemNumber': - itemClaiming = 0; - break - case 'resetButton': - if(canCraftItem == false){ - canCraftItem = true; - document.querySelector('#craft-button').disabled = false; - } - break - case 'canClaimAll': - document.querySelector('#claimall-button').disabled = false; - break - case 'closeMenu': - closeMenu(); - break - } -}); - -$(document).on('click', ".cat_tab", function() { - selectedCategory = $("input[name='category']:checked").val(); - var num = craft2.length; - var paragraph = ''; - var row = '
'; - var lastRowNum = 0; - var added = 0 - for(var i = 0; i < num; i++) { - for(var i1 = 0; i1 < craft2[i].job.length; i1++){ - if(selectedCategory == "general_cat" || craft2[i].category == selectedCategory){ - if(craft2[i].job[i1] == job2 || craft2[i].job[i1] == gang || craft2[i].job[i1] == ''){ - if(!craftData.UseXP){ - var itemName = craftData.itemNames; - var itemId = craft2[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } else { - if(craft2[i].levelNeeded <= craftData.level || showAllCrafts){ - var itemName = craftData.itemNames; - var itemId = craft2[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } - } - } - } - } - } - row += `
`; - - if(craftData.UseXP) { - $('#currentlevel').html(craftData.level); - document.documentElement.style.setProperty('--percentage-width', craftData.percentage+"%"); - $('.xpbar-col').css('margin-top', '-1.8rem'); - } else { - $('.xpbar').hide(); - $('.xpbar-col').css('margin-top', '5.05rem'); - } - - $('#craft-table').html(row); - $('.title-name').html(craftData.name); - - $('.title').fadeIn(); - $('.itemslist').fadeIn(); - $('.crafting-body').fadeIn(); -}); - -function restartCrafts(){ - selectedCategory = 'general_cat'; - var num = craft2.length; - var paragraph = ''; - var row = '
'; - var lastRowNum = 0; - var added = 0 - for(var i = 0; i < num; i++) { - for(var i1 = 0; i1 < craft2[i].job.length; i1++){ - if(selectedCategory == "general_cat" || craft2[i].category == selectedCategory){ - if(craft2[i].job[i1] == job2 || craft2[i].job[i1] == gang || craft2[i].job[i1] == ''){ - if(!craftData.UseXP){ - var itemName = craftData.itemNames; - var itemId = craft2[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } else { - if(craft2[i].levelNeeded <= craftData.level || showAllCrafts){ - var itemName = craftData.itemNames; - var itemId = craft2[i].item; - var index = i; - added++ - row += ` -
-
-
- ${itemName[itemId]} - -
-
-
- `; - - if ((added) % 4 === 0) { - row = addStr(row, row.length, `
`); - lastRowNum = row.length+6; - } - } - } - } - } - } - } - row += `
`; - - if(craftData.UseXP) { - $('#currentlevel').html(craftData.level); - document.documentElement.style.setProperty('--percentage-width', craftData.percentage+"%"); - $('.xpbar-col').css('margin-top', '-1.8rem'); - } else { - $('.xpbar').hide(); - $('.xpbar-col').css('margin-top', '5.05rem'); - } - - $('#craft-table').html(row); - $('.title-name').html(craftData.name); -} - -$(document).ready(function() { - document.onkeyup = function(data) { - if (data.which == 27) { - closeMenu(); - } - }; -}); - -$(document).ready(function(){ - $('#plus').click(function(e) { - var quantity = parseInt($('#quantity').val()); - if(quantity < maxCraft){ - $('#quantity').val(quantity + 1); - updateSideMenu(quantity + 1); - } - }); - - $('#minus').click(function(e) { - var quantity = parseInt($('#quantity').val()); - - if(quantity > maxCraft){ - $('#quantity').val(maxCraft); - updateSideMenu(maxCraft); - } else { - if(quantity > 1) { - $('#quantity').val(quantity - 1); - updateSideMenu(quantity - 1); - } - } - }); - $('#max').click(function(e) { - var quantity = parseInt($('#quantity').val()); - - if(quantity != maxCraft){ - $('#quantity').val(maxCraft); - updateSideMenu(maxCraft); - } - }); -}); - -function quantity_change(t) { - var quantity = parseInt($('#quantity').val()); - - if(quantity > maxCraft){ - $('#quantity').val(maxCraft); - updateSideMenu(maxCraft); - } else if(quantity < 1) { - $('#quantity').val(1); - updateSideMenu(1); - } else { - updateSideMenu(quantity); - } -} - -function craft(t) { - if(canCraftItem){ - canCraftItem = false; - document.querySelector('#craft-button').disabled = true; - var itemId = t.dataset.item; - var recipe = t.dataset.recipe; - var amount = t.dataset.amount; - var xp = t.dataset.xp; - var isDis = t.dataset.isDis; - var index = t.dataset.index; - var level = t.dataset.level; - var quantity = document.getElementById("quantity").value; - if(quantity > maxCraft){ - quantity = maxCraft; - $('#quantity').val(quantity - 1); - updateSideMenu(quantity - 1); - } - $.post('https://okokCrafting/action', JSON.stringify({ - action: "craft-button", - itemID: itemId, - recipe: recipe, - amount: amount, - xp: xp, - quantity: quantity, - isDis: isDis, - index: index, - level: level, - })); - } -} - -function claim(t) { - var index = parseInt(t.dataset.id)+1; - var itemRndID = parseInt(CraftQueue[index-1].randomID); - if(itemClaiming != itemRndID && canClaimItem){ - canClaimItem = false; - itemClaiming = itemRndID; - $.post('https://okokCrafting/action', JSON.stringify({ - action: "claim-item", - index: index, - })); - } -} - -function claimall(t) { - if(CraftQueue[0] != undefined && CraftQueue[0].isDone && canClaimItem){ - canClaimItem = false; - document.querySelector('#claimall-button').disabled = true; - $.post('https://okokCrafting/action', JSON.stringify({ - action: "claim-all", - })); - } - -} - -function claimFail(t) { - var index = parseInt(t.dataset.id)+1; - var itemRndID = parseInt(CraftQueue[index-1].randomID); - if(itemClaiming != itemRndID && canClaimItem){ - canClaimItem = false; - itemClaiming = itemRndID; - $.post('https://okokCrafting/action', JSON.stringify({ - action: "fail-item", - index: index, - })); - } -} - -function cancel(t) { - var index = parseInt(t.dataset.id)+1; - var itemRndID = parseInt(CraftQueue[index-1].randomID); - if(itemClaiming != itemRndID && canClaimItem){ - canClaimItem = false; - itemClaiming = itemRndID; - $.post('https://okokCrafting/action', JSON.stringify({ - action: "cancel-item", - index: index, - })); - } -} - -function updateSideMenu(quantity){ - var canCraft = true - var num = sideCraftMenu.recipe.length; - var recipe = ``; - var img = ` - - ${sideCraftMenu.itemName} x${sideCraftMenu.itemAmount*quantity} - `; - - if(sideCraftMenu.isDis){ - img = ` - - ${sideCraftMenu.itemName} x${sideCraftMenu.itemAmount*quantity} (${sideCraftMenu.isDisItemAmt}) - `; - } - - $('#side-image').html(img); - $('#craft-time').html(sideCraftMenu.time*quantity); - - for(var i = 0; i < num; i++){ - var idName = sideCraftMenu.recipe[i][0]; - if(sideCraftMenu.isDis){ - recipe += ` -
- - ${sideCraftMenu.itemNames[idName]} x${sideCraftMenu.recipe[i][1]*quantity} -
- `; - if(sideCraftMenu.itemAmount > sideCraftMenu.isDisItemAmt){ - canCraft = false - } - } else { - recipe += ` -
- - ${sideCraftMenu.itemNames[idName]} x${sideCraftMenu.recipe[i][1]*quantity} (${sideCraftMenu.inventory[i].key}) -
- `; - if(sideCraftMenu.recipe[i][1] > sideCraftMenu.inventory[i].key){ - canCraft = false - } - } - } - - $('#craft-button-div').html(` - - `); - - if(canCraft) { - $('#craft-button-div').fadeIn(); - } else { - $('#craft-button-div').hide(); - } - - $('#craft-percentage').html(sideCraftMenu.percentage); - $('.components_window').html(recipe); - - $('.itemrequirements').fadeIn(); -} - -function closeMenu(){ - itemClaiming = 0; - selectedCategory = ""; - $('.crafting-body').fadeOut(); - $('.title').fadeOut(); - $('.itemslist').fadeOut(); - $('.itemrequirements').fadeOut(); - setTimeout(function(){ - restartCrafts(); - }, 400); - $.post('https://okokCrafting/action', JSON.stringify({ - action: "close", - })); -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/web/styles.css b/resources/[test]/okokCrafting/web/styles.css deleted file mode 100644 index b1ceea3af..000000000 --- a/resources/[test]/okokCrafting/web/styles.css +++ /dev/null @@ -1,589 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Tajawal:wght@200;300;400;500;700;800;900&display=swap'); - -*,*:focus,*:hover{ - outline:none; -} - -html, body { - height: 100%; -} - -html { - font-size: calc(16 / 19.2 * 1vw); -} - -@media (min-aspect-ratio: 16 / 9) { - html { - font-size: calc(16 / 10.8 * 1vh); - } -} - -body { - font-family: 'Tajawal', sans-serif; - background: none; - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - user-select: none; -} - -.crafting-body { - display: none; - height: 48rem; -} - -.title-main { - margin-top: -3.05rem; -} - -.title { - color: #fff; - font-size: 3.75rem; - line-height: 1; - text-transform: uppercase; - text-align: center; -} - -.title-name { - font-weight: 300; -} - -.title-name2 { - font-weight: 600; - margin-left: 0.938rem; -} - -.card { - border: none; - border-radius: 1.25rem; - background-color: transparent; -} - -.card-body { - background-color: #ffffff; - font-size: 0.938rem; - font-weight: 500; - border-radius: 1.25rem; -} - -.itemslist { - display: none; - margin-top: 2.9rem; -} - -.itemrequirements { - display: none; -} - -.xpbar-col { - margin-top: -1.8rem; - margin-left: -0.3rem; - width: 24.65rem; -} - -.xpbar { - margin-bottom: 1.35rem; -} - -.itemslist_card { - width: 50rem; -} - -.itemslist_card-body { - background: transparent; -} - -.itemslist_window { - overflow-x: hidden; - height: 35.2rem; - padding: 0.3125rem 1.05rem 0.3125rem 0.625rem; -} - -.item_card { - width: 10.625rem; - height: 10.625rem; -} - -.item_card:hover { - cursor: pointer; -} - -.item_card-body { - width: 10.625rem; - height: 10.625rem; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - transition: 0.25s; - background-color: rgba(220, 220, 220, 0.20); -} - -.item_card-body:hover { - background-color: rgba(31, 94, 255, 1) !important; - transition: 0.25s; - transform: scale(1.030); -} - -.item-title { - color: #fff; - font-weight: 600; - position: absolute; - top: 8%; -} - -.image { - height: 7.5rem; - position: absolute; - top: 22.5%; -} - -.image_itemselected { - height: 5rem; -} - -.text_itemselected { - color: #fff; - font-weight: 600; - font-size: 1.25rem; -} - -.image_components { - height: 3.75rem; -} - -::-webkit-scrollbar { - width: 0.5rem; -} - -::-webkit-scrollbar-track { - background-color: transparent; -} - -::-webkit-scrollbar-thumb { - background-color: #1f5eff; - border-radius: 0.625rem; - transition: .25s; -} - -::-webkit-scrollbar-thumb:hover { - cursor: pointer; - background-color: #0a4df9; - transition: .25s; -} - -.timer { - position: fixed; - right: 2rem; - bottom: 4rem; - font-size: 3.125rem; - display: none; -} - -.timer_card { - height: 1.875rem; -} - -.timer_card-body { - background-color: rgba(31, 94, 255, 1); - font-weight: 600 !important; - color: #fff !important; - font-size: 1.25rem !important; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - padding-right: 4.375rem; -} - -#crafting-text { - margin-left: 0.625rem; -} - -#item-timer { - position: absolute; - right: 0.938rem; -} - -#time { - position: absolute; - top: 0.625rem; - right: 0.625rem; - color: #fff; - background-color: rgba(31, 94, 255, 1); - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - border-radius: 0.625rem; - padding: 0.313rem; -} - -#percentage { - position: absolute; - top: 3.1rem; - right: 0.625rem; - color: #fff; - background-color: rgba(31, 94, 255, 1); - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - border-radius: 0.625rem; - padding: 0.313rem; -} - -#level-text { - color: #fff; - font-weight: 600; - font-size: 2rem; -} - -.progress { - background: rgba(220, 220, 220, 0.20); - justify-content: flex-start; - border-radius: 1.25rem; - align-items: center; - position: relative; - padding: 0 0.313rem; - display: flex; - height: 2.5rem; - width: 100%; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); -} - -.progress-value { - width: var(--percentage-width); - transition: width .5s ease-in-out; - border-radius: 6.25rem; - background: #1f5eff; - height: 1.875rem; -} - -:root { - --percentage-width: 0%; -} - - -@keyframes load { - 0% { width: 0; } - 100% { width: var(--percentage-width); } -} - -.btn { - font-weight: 500; - font-size: 1.125rem; - padding: 0.8125rem 1.0625rem; - border: none; - transition: 0.25s; - letter-spacing: 0.0125rem; -} - -.btn-blue { - background-color: #1f5eff; - color: #e6e6e6; -} - -.btn-blue:hover { - background-color: #0a4df9; - color: #e6e6e6; -} - -.btn-blue-level { - font-size: 1.125rem; - padding: 0.8125rem 1.0625rem; - letter-spacing: 0.0125rem; - display: inline-block; - text-align: center; - background-color: #1f5eff; - color: #e6e6e6; - border-radius: 1rem; - width: 100%; - font-weight: 600; - box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%); -} - -.btn:focus { - box-shadow: none; -} - -.btn-category { - background-color: #1f5eff; - border: none !important; - outline: none !important; - box-shadow: none !important; - transition: .25s; - font-weight: 600; - color: #fff; -} - -.btn-category:hover { - background-color: #0a4df9; - color: #fff; - transition: .25s; -} - -.btn:focus { - box-shadow: none; -} - -.btn-check:active+.btn-category:focus, .btn-check:checked+.btn-category:focus, .btn-category.active:focus, .btn-category:active:focus, .show>.btn-category.dropdown-toggle:focus { - box-shadow: none; - transition: .25s; -} - -.btn-check:active+.btn-category, .btn-check:checked+.btn-category, .btn-category.active, .btn-category:active, .show>.btn-category.dropdown-toggle { - background-color: #fcfcfc; - border-color: none; - transition: .25s; - color: #1f5eff; -} - -hr { - opacity: 1; - color: #fff; -} - -.queue-item { - background-color: #1f5eff; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-item:hover { - background-color: #0a4df9; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-item-concluded { - background-color: #25ba59; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-item-concluded:hover { - background-color: #20ab51; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-item-failed { - background-color: #ff2943; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-item-failed:hover { - background-color: #cd0032; - border-radius: 0.625rem; - padding: 0.5rem; - transition: .25s; -} - -.queue-cancelbutton { - font-size: 1.75rem; -} - -.queue-cancelbutton-bg { - width: 2.5rem; - height: 2.5rem; - background-color: #fff; - border-radius: 0.625rem; - color: #1f5eff; - transition: .25s; -} - -.queue-cancelbutton-bg:hover { - background-color: #e1e1e3; - transition: .25s; - cursor: pointer; -} - -.queue-claimbutton { - font-size: 1.75rem; -} - -.queue-claimbutton-bg { - width: 2.5rem; - height: 2.5rem; - background-color: #fff; - border-radius: 0.625rem; - color: #25ba59; - transition: .25s; -} - -.queue-claimbutton-bg:hover { - background-color: #e1e1e3; - transition: .25s; - cursor: pointer; -} - -.queue-failbutton-bg { - width: 2.5rem; - height: 2.5rem; - background-color: #fff; - border-radius: 0.625rem; - color: #ff2943; - transition: .25s; -} - -.queue-failbutton-bg:hover { - background-color: #e1e1e3; - transition: .25s; - cursor: pointer; -} - -.components_window { - max-height: 18.75rem; - overflow-x: hidden; -} - -.craftingq_window { - max-height: 27.3rem; - overflow-x: hidden; - padding-right: 0.35rem; -} - -.btn-group { - padding: 0.5rem; - background-color: rgba(220, 220, 220, 0.20); - border-radius: 1.25rem; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - margin-top: 2rem; -} - -.first-category { - border-top-left-radius: 1rem; - border-bottom-left-radius: 1rem; -} - -.last-category { - border-top-right-radius: 1rem; - border-bottom-right-radius: 1rem; -} - -#craft-button, #claimall-button { - border-radius: 1rem; - width: 100%; - font-weight: 600; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); -} - -.component, .noitq { - color: #fff; - font-weight: 600; - font-size: 1.25rem; -} - -.row-h { - height: 43.8rem; -} - -.queue-itemname { - color: #fff; - font-weight: 600; - font-size: 1.25rem; - line-height: 1; -} - -.queue-itemstate { - line-height: 1; - color: #ededed; - margin-top: 0.2rem; - font-weight: 600; -} - -.queue-item-mr { - margin-right: 0.65rem; -} - -.itemslist_row-h { - margin-top: 1.35rem; -} - -.section-title { - color: #fff; - font-weight: 600; - font-size: 2rem; -} - -.craftingq_card { - width: 23.125rem; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); - margin-top: 5.05rem; - height: 34.56rem; -} - -.craftingq_card-body { - background-color: rgba(220, 220, 220, 0.20); - min-height: 34.5625rem; -} - -.ywr { - color: #fff; - font-weight: 600; - font-size: 2rem; -} - -.itemr_card { - height: 34.56rem; - box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3); -} - -.itemr_card-body { - background-color: rgba(220, 220, 220, 0.20); -} - -.craft-tp { - color: #fff; - font-weight: 600; -} - -.btn-group>.btn-group:not(:first-child), .btn-group>.btn:not(:first-child) { - margin-left: 0; -} - -.form-control { - border: none; - border-radius: 0; - padding: 0rem 0.75rem; -} - -.form-control:focus { - box-shadow: none; -} - -#minus { - border-radius: 0; - border-top-left-radius: 1rem; - border-bottom-left-radius: 1rem; -} - -#plus { - border-radius: 0; - border-top-right-radius: 1rem; - border-bottom-right-radius: 1rem; -} - -#quantity { - background-color: rgba(220, 220, 220, 0.20); - color: #fff; - font-size: 2rem; - font-weight: 600; -} - -#max { - box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%); - border-radius: 1rem; - font-weight: 600; -} - -.mip { - box-shadow: 0rem 0rem 0.313rem 0rem rgb(10 10 10 / 30%); - border-radius: 1rem; -} - -input::-webkit-outer-spin-button, -input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; -} - -.crafting { - height: 48rem; -} \ No newline at end of file diff --git a/resources/[test]/okokCrafting/web/ui.html b/resources/[test]/okokCrafting/web/ui.html deleted file mode 100644 index e3a9abbf6..000000000 --- a/resources/[test]/okokCrafting/web/ui.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - -
-
-
-
-
-
Crafting Queue
-
-
-
-
- -
-
Compact Rifle x1
-
Concluded
-
-
-
-
-
-
-
-
- -
-
Compact Rifle x1
-
Time left: 55s
-
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- Crafting -
-
- -
-
-
-
-
-
-
-
-
-
-
- -
-
-
Current Level: 28
-
-
-
-
- -
-
-
- s - -
You will receive
-
- - -
-
-
Requirements
-
-
-
- -
-
-
- - - -
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- - - - - - - \ No newline at end of file