From eaf63483dac7a8538beb4b620899fe90a14d5c91 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 23 Dec 2018 17:15:56 +0100 Subject: [PATCH] Scaleform when weapon is bought, gta sounds, cleanup --- __resource.lua | 2 + client/main.lua | 107 ++++++++++++++++++++++++++++++++++-------------- config.lua | 50 +++++++++++----------- locales/br.lua | 6 +-- locales/de.lua | 6 +-- locales/en.lua | 8 ++-- locales/es.lua | 6 +-- locales/fi.lua | 6 +-- locales/fr.lua | 6 +-- locales/pl.lua | 6 +-- locales/sv.lua | 6 +-- server/main.lua | 63 ++++++++++++++++------------ 12 files changed, 166 insertions(+), 106 deletions(-) diff --git a/__resource.lua b/__resource.lua index 1a01d31a..a45e385f 100644 --- a/__resource.lua +++ b/__resource.lua @@ -32,3 +32,5 @@ client_scripts { 'config.lua', 'client/main.lua' } + +dependency 'es_extended' \ No newline at end of file diff --git a/client/main.lua b/client/main.lua index 863aac5c..42d5a361 100644 --- a/client/main.lua +++ b/client/main.lua @@ -10,12 +10,13 @@ local Keys = { ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } -ESX = nil +ESX = nil local HasAlreadyEnteredMarker = false -local LastZone = nil -local CurrentAction = nil -local CurrentActionMsg = '' -local CurrentActionData = {} +local LastZone = nil +local CurrentAction = nil +local CurrentActionMsg = '' +local CurrentActionData = {} +local ShopOpen = false Citizen.CreateThread(function() while ESX == nil do @@ -63,37 +64,78 @@ end function OpenShopMenu(zone) local elements = {} + ShopOpen = true for i=1, #Config.Zones[zone].Items, 1 do local item = Config.Zones[zone].Items[i] table.insert(elements, { - label = ('%s - %s'):format(item.label, _U('shop_menu_item', ESX.Math.GroupDigits(item.price))), + label = ('%s - %s'):format(item.label, _U('shop_menu_item', ESX.Math.GroupDigits(item.price))), + price = item.price, weaponName = item.item }) end ESX.UI.Menu.CloseAll() + PlaySoundFrontend(-1, 'BACK', 'HUD_AMMO_SHOP_SOUNDSET', false) ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop', { - title = _U('shop'), + title = _U('shop_menu_title'), align = 'top-left', elements = elements }, function(data, menu) - TriggerServerEvent('esx_weaponshop:buyItem', data.current.weaponName, zone) + ESX.TriggerServerCallback('esx_weaponshop:buyWeapon', function(bought) + if bought then + DisplayBoughtScaleform(data.current.weaponName, data.current.price) + else + PlaySoundFrontend(-1, 'ERROR', 'HUD_AMMO_SHOP_SOUNDSET', false) + end + end, data.current.weaponName, zone) end, function(data, menu) + PlaySoundFrontend(-1, 'BACK', 'HUD_AMMO_SHOP_SOUNDSET', false) + ShopOpen = false menu.close() CurrentAction = 'shop_menu' - CurrentActionMsg = _U('shop_menu') + CurrentActionMsg = _U('shop_menu_prompt') CurrentActionData = { zone = zone } + end, function(data, menu) + PlaySoundFrontend(-1, 'NAV', 'HUD_AMMO_SHOP_SOUNDSET', false) + end) +end + +function DisplayBoughtScaleform(weaponName, price) + local scaleform = ESX.Scaleform.Utils.RequestScaleformMovie('MP_BIG_MESSAGE_FREEMODE') + local sec = 4 + + BeginScaleformMovieMethod(scaleform, 'SHOW_WEAPON_PURCHASED') + + PushScaleformMovieMethodParameterString(_U('weapon_bought', ESX.Math.GroupDigits(price))) + PushScaleformMovieMethodParameterString(ESX.GetWeaponLabel(weaponName)) + PushScaleformMovieMethodParameterInt(GetHashKey(weaponName)) + PushScaleformMovieMethodParameterString('') + PushScaleformMovieMethodParameterInt(100) + + EndScaleformMovieMethod() + + PlaySoundFrontend(-1, 'WEAPON_PURCHASE', 'HUD_AMMO_SHOP_SOUNDSET', false) + + Citizen.CreateThread(function() + while sec > 0 do + Citizen.Wait(0) + sec = sec - 0.01 + + DrawScaleformMovieFullscreen(scaleform, 255, 255, 255, 255) + end end) end AddEventHandler('esx_weaponshop:hasEnteredMarker', function(zone) - CurrentAction = 'shop_menu' - CurrentActionMsg = _U('shop_menu') - CurrentActionData = { zone = zone } + if zone == 'GunShop' then + CurrentAction = 'shop_menu' + CurrentActionMsg = _U('shop_menu_prompt') + CurrentActionData = { zone = zone } + end end) AddEventHandler('esx_weaponshop:hasExitedMarker', function(zone) @@ -101,12 +143,20 @@ AddEventHandler('esx_weaponshop:hasExitedMarker', function(zone) ESX.UI.Menu.CloseAll() end) +AddEventHandler('onResourceStop', function(resource) + if resource == GetCurrentResourceName() then + if ShopOpen then + ESX.UI.Menu.CloseAll() + end + end +end) + -- Create Blips Citizen.CreateThread(function() for k,v in pairs(Config.Zones) do - if v.legal then - for i = 1, #v.Pos, 1 do - local blip = AddBlipForCoord(v.Pos[i].x, v.Pos[i].y, v.Pos[i].z) + if v.Legal then + for i = 1, #v.Locations, 1 do + local blip = AddBlipForCoord(v.Locations[i]) SetBlipSprite (blip, 110) SetBlipDisplay(blip, 4) @@ -115,7 +165,7 @@ Citizen.CreateThread(function() SetBlipAsShortRange(blip, true) BeginTextCommandSetBlipName("STRING") - AddTextComponentString(_U('map_blip')) + AddTextComponentSubstringPlayerName(_U('map_blip')) EndTextCommandSetBlipName(blip) end end @@ -130,9 +180,9 @@ Citizen.CreateThread(function() local coords = GetEntityCoords(PlayerPedId()) for k,v in pairs(Config.Zones) do - for i = 1, #v.Pos, 1 do - if(Config.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos[i].x, v.Pos[i].y, v.Pos[i].z, true) < Config.DrawDistance) then - DrawMarker(Config.Type, v.Pos[i].x, v.Pos[i].y, v.Pos[i].z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.Size.x, Config.Size.y, Config.Size.z, Config.Color.r, Config.Color.g, Config.Color.b, 100, false, true, 2, false, false, false, false) + for i = 1, #v.Locations, 1 do + if (Config.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Locations[i], true) < Config.DrawDistance) then + DrawMarker(Config.Type, v.Locations[i], 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.Size.x, Config.Size.y, Config.Size.z, Config.Color.r, Config.Color.g, Config.Color.b, 100, false, true, 2, false, false, false, false) end end end @@ -143,18 +193,13 @@ end) Citizen.CreateThread(function() while true do Citizen.Wait(0) - - local coords = GetEntityCoords(PlayerPedId()) - local isInMarker = false - local currentZone = nil + local coords = GetEntityCoords(PlayerPedId()) + local isInMarker, currentZone = false, nil for k,v in pairs(Config.Zones) do - for i=1, #v.Pos, 1 do - if(GetDistanceBetweenCoords(coords, v.Pos[i].x, v.Pos[i].y, v.Pos[i].z, true) < Config.Size.x) then - isInMarker = true - ShopItems = v.Items - currentZone = k - LastZone = k + for i=1, #v.Locations, 1 do + if GetDistanceBetweenCoords(coords, v.Locations[i], true) < Config.Size.x then + isInMarker, ShopItems, currentZone, LastZone = true, v.Items, k, k end end end @@ -179,8 +224,9 @@ Citizen.CreateThread(function() ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, Keys['E']) then + if CurrentAction == 'shop_menu' then - if Config.LicenseEnable and Config.Zones[CurrentActionData.zone].legal then + if Config.LicenseEnable and Config.Zones[CurrentActionData.zone].Legal then ESX.TriggerServerCallback('esx_license:checkLicense', function(hasWeaponLicense) if hasWeaponLicense then OpenShopMenu(CurrentActionData.zone) @@ -192,6 +238,7 @@ Citizen.CreateThread(function() OpenShopMenu(CurrentActionData.zone) end end + CurrentAction = nil end end diff --git a/config.lua b/config.lua index cb45fae4..32671dd2 100644 --- a/config.lua +++ b/config.lua @@ -1,39 +1,39 @@ -Config = {} -Config.DrawDistance = 100 -Config.Size = { x = 1.5, y = 1.5, z = 1.5 } -Config.Color = { r = 0, g = 128, b = 255 } -Config.Type = 1 -Config.Locale = 'fr' -Config.EnableLicense = true -- only turn this on if you are using esx_license +Config = {} -Config.LicenseEnable = true -- only turn this on if you are using esx_license -Config.LicensePrice = 5000 +Config.DrawDistance = 100 +Config.Size = { x = 1.5, y = 1.5, z = 0.5 } +Config.Color = { r = 0, g = 128, b = 255 } +Config.Type = 1 + +Config.Locale = 'fr' + +Config.LicenseEnable = false -- only turn this on if you are using esx_license +Config.LicensePrice = 5000 Config.Zones = { GunShop = { - legal = true, + Legal = true, Items = {}, - Pos = { - { x = -662.180, y = -934.961, z = 20.829 }, - { x = 810.25, y = -2157.60, z = 28.62 }, - { x = 1693.44, y = 3760.16, z = 33.71 }, - { x = -330.24, y = 6083.88, z = 30.45 }, - { x = 252.63, y = -50.00, z = 68.94 }, - { x = 22.09, y = -1107.28, z = 28.80 }, - { x = 2567.69, y = 294.38, z = 107.73 }, - { x = -1117.58, y = 2698.61, z = 17.55 }, - { x = 842.44, y = -1033.42, z = 27.19 } - + Locations = { + vector3(-662.1, -935.3, 20.8), + vector3(810.2, -2157.3, 28.6), + vector3(1693.4, 3759.5, 33.7), + vector3(-330.2, 6083.8, 30.4), + vector3(252.3, -50.0, 68.9), + vector3(22.0, -1107.2, 28.8), + vector3(2567.6, 294.3, 107.7), + vector3(-1117.5, 2698.6, 17.5), + vector3(842.4, -1033.4, 27.1) } }, BlackWeashop = { - legal = false, + Legal = false, Items = {}, - Pos = { - { x = -1306.239, y = -394.018, z = 35.695 }, + Locations = { + vector3(-1306.2, -394.0, 35.6) } - }, + } } diff --git a/locales/br.lua b/locales/br.lua index 2e80ea9c..170df88a 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -2,12 +2,12 @@ Locales ['br'] = { ['buy_license'] = 'buy weapon license?', ['yes'] = '%s', ['no'] = 'no', - ['buy'] = 'você comprou ~y~%s~s~ for ~r~R$%s~s~', + ['weapon_bought'] = 'purchased for %s EUR', ['not_enough_black'] = 'você não tem dinheiro sujo suficiente', ['not_enough'] = 'você não tem dinheiro suficiente', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'comprar', - ['shop_menu'] = 'pressione ~INPUT_CONTEXT~ para comprar armas.', + ['shop_menu_title'] = 'comprar', + ['shop_menu_prompt'] = 'pressione ~INPUT_CONTEXT~ para comprar armas.', ['shop_menu_item'] = 'R$%s', ['map_blip'] = 'loja de Armas', } diff --git a/locales/de.lua b/locales/de.lua index 1022cac5..1f85ab39 100644 --- a/locales/de.lua +++ b/locales/de.lua @@ -2,12 +2,12 @@ Locales ['de'] = { ['buy_license'] = 'buy weapon license?', ['yes'] = '%s', ['no'] = 'no', - ['buy'] = 'du kaufst ~y~%s~s~ for ~r~%s EUR~s~', + ['weapon_bought'] = 'purchased for %s EUR', ['not_enough_black'] = 'du hast nicht genug Schwarzgeld', ['not_enough'] = 'du hast nicht genug Geld', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'geschäft', - ['shop_menu'] = 'drücke ~INPUT_CONTEXT~ um auf das Geschäft zuzugreifen.', + ['shop_menu_title'] = 'geschäft', + ['shop_menu_prompt'] = 'drücke ~INPUT_CONTEXT~ um auf das Geschäft zuzugreifen.', ['shop_menu_item'] = '%s EUR', ['map_blip'] = 'waffenladen', } diff --git a/locales/en.lua b/locales/en.lua index 06bc7062..9da777e5 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -2,12 +2,12 @@ Locales ['en'] = { ['buy_license'] = 'buy weapon license?', ['yes'] = '%s', ['no'] = 'no', - ['buy'] = 'you bought ~y~%s~s~ for ~r~$%s~s~', + ['weapon_bought'] = 'purchased for $%s', ['not_enough_black'] = 'you do not have enough dirty money', ['not_enough'] = 'you do not have enough money', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'weapon shop', - ['shop_menu'] = 'press ~INPUT_CONTEXT~ to access the ~y~weapon store~s~.', + ['shop_menu_title'] = 'ammu-Nation', + ['shop_menu_prompt'] = 'press ~INPUT_CONTEXT~ to access the ~y~Ammu-Nation~s~.', ['shop_menu_item'] = '$%s', - ['map_blip'] = 'weapon shop', + ['map_blip'] = 'ammu-Nation', } diff --git a/locales/es.lua b/locales/es.lua index 95b5e98b..d3fd3304 100644 --- a/locales/es.lua +++ b/locales/es.lua @@ -2,12 +2,12 @@ Locales ['es'] = { ['buy_license'] = 'buy weapon license?', ['yes'] = '%s', ['no'] = 'no', - ['buy'] = 'has comprado ~y~%s~s~ for ~r~%s EUR~s~', + ['weapon_bought'] = 'purchased for %s EUR', ['not_enough_black'] = 'usted no tiene ~r~suficiente~s~ dinero negro', ['not_enough'] = 'usted no tiene ~r~suficiente~s~ dinero', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'tienda', - ['shop_menu'] = 'presione ~INPUT_CONTEXT~ para acceder a la tienda.', + ['shop_menu_title'] = 'tienda', + ['shop_menu_prompt'] = 'presione ~INPUT_CONTEXT~ para acceder a la tienda.', ['shop_menu_item'] = '%s EUR', ['map_blip'] = 'arsenal', } diff --git a/locales/fi.lua b/locales/fi.lua index d549fe68..e8b9bf68 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -2,12 +2,12 @@ Locales ['fi'] = { ['buy_license'] = 'osta lisenssi?', ['yes'] = '%s', ['no'] = 'ei', - ['buy'] = 'sinä ostit ~y~%s~s~ for ~r~%s EUR~s~', + ['weapon_bought'] = 'purchased for %s EUR', ['not_enough_black'] = 'ei tarpeeksi likaista rahaa', ['not_enough'] = 'sinulla ei ole tarpeeksi rahaa', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'kauppa', - ['shop_menu'] = 'paina ~INPUT_CONTEXT~ avataksesi kauppa ikkuna.', + ['shop_menu_title'] = 'kauppa', + ['shop_menu_prompt'] = 'paina ~INPUT_CONTEXT~ avataksesi kauppa ikkuna.', ['shop_menu_item'] = '%s EUR', ['map_blip'] = 'asekauppa', } diff --git a/locales/fr.lua b/locales/fr.lua index b674c5f7..cd11b198 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -2,12 +2,12 @@ Locales ['fr'] = { ['buy_license'] = 'acheter une license?', ['yes'] = '%s', ['no'] = 'non', - ['buy'] = 'vous avez acheté ~y~%s~s~ for ~r~%s EUR~s~', + ['weapon_bought'] = 'purchased for %s EUR', ['not_enough_black'] = 'Vous n\'avez ~r~pas assez~s~ d\'argent sale', ['not_enough'] = 'vous n\'avez ~r~pas assez~s~ d\'argent', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'magasin', - ['shop_menu'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder au magasin.', + ['shop_menu_title'] = 'magasin', + ['shop_menu_prompt'] = 'appuyez sur ~INPUT_CONTEXT~ pour accéder au magasin.', ['shop_menu_item'] = '%s EUR', ['map_blip'] = 'armurerie', } diff --git a/locales/pl.lua b/locales/pl.lua index e64bb7fb..8f389a72 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -2,12 +2,12 @@ Locales ['pl'] = { ['buy_license'] = 'czy chcesz kupić licencję?', ['yes'] = '%s', ['no'] = 'nie', - ['buy'] = 'kupiłeś/aś ~y~%s~s~ for ~r~%s PLN~s~', + ['weapon_bought'] = 'purchased for %s PLN', ['not_enough_black'] = 'nie masz wystarczająco brudnej kasy', ['not_enough'] = 'nie masz wystarczająco pieniędzy', ['already_owned'] = 'you already own this weapon!', - ['shop'] = 'sklep', - ['shop_menu'] = 'Wciśnij ~INPUT_CONTEXT~ aby otworzyć sklep.', + ['shop_menu_title'] = 'sklep', + ['shop_menu_prompt'] = 'Wciśnij ~INPUT_CONTEXT~ aby otworzyć sklep.', ['shop_menu_item'] = '%s PLN', ['map_blip'] = 'sklep z bronią', } diff --git a/locales/sv.lua b/locales/sv.lua index 05a4df01..57da682d 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -2,12 +2,12 @@ Locales ['sv'] = { ['buy_license'] = 'vill du köpa ett vapenlicens?', ['yes'] = '%s', ['no'] = 'nej tack', - ['buy'] = 'du köpte ~y~%s~s~ för ~r~%s SEK~s~', + ['weapon_bought'] = 'köpt för %s SEK', ['not_enough_black'] = 'du har inte tillräckligt med svarta pengar', ['not_enough'] = 'du har inte råd för detta', ['already_owned'] = 'du äger redan detta vapen!', - ['shop'] = 'vapenaffär', - ['shop_menu'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~vapenaffären~s~.', + ['shop_menu_title'] = 'vapenaffär', + ['shop_menu_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~vapenaffären~s~.', ['shop_menu_item'] = '%s SEK', ['map_blip'] = 'vapenaffär', } diff --git a/server/main.lua b/server/main.lua index 491a4e92..6fd3fbf1 100644 --- a/server/main.lua +++ b/server/main.lua @@ -37,50 +37,61 @@ ESX.RegisterServerCallback('esx_weaponshop:buyLicense', function(source, cb) cb(true) end) else - cb(false) TriggerClientEvent('esx:showNotification', source, _U('not_enough')) + cb(false) end end) -RegisterServerEvent('esx_weaponshop:buyItem') -AddEventHandler('esx_weaponshop:buyItem', function(weaponName, zone) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) +ESX.RegisterServerCallback('esx_weaponshop:buyWeapon', function(source, cb, weaponName, zone) + local xPlayer = ESX.GetPlayerFromId(source) local price = GetPrice(weaponName, zone) - if xPlayer.hasWeapon(weaponName) then - TriggerClientEvent('esx:showNotification', _source, _U('already_owned')) - return + if price == 0 then + print(('esx_weaponshop: %s attempted to buy a unknown weapon!'):format(xPlayer.identifier)) + cb(false) end - if zone == 'BlackWeashop' then - - if xPlayer.getAccount('black_money').money >= price then - xPlayer.removeAccountMoney('black_money', price) - xPlayer.addWeapon(weaponName, 42) - TriggerClientEvent('esx:showNotification', _source, _U('buy', ESX.GetWeaponLabel(weaponName), ESX.Math.GroupDigits(price))) - else - TriggerClientEvent('esx:showNotification', _source, _U('not_enough_black')) - end - + if xPlayer.hasWeapon(weaponName) then + TriggerClientEvent('esx:showNotification', source, _U('already_owned')) + cb(false) else + if zone == 'BlackWeashop' then + + if xPlayer.getAccount('black_money').money >= price then + xPlayer.removeAccountMoney('black_money', price) + xPlayer.addWeapon(weaponName, 42) + + cb(true) + else + TriggerClientEvent('esx:showNotification', source, _U('not_enough_black')) + cb(false) + end - if xPlayer.getMoney() >= price then - xPlayer.removeMoney(price) - xPlayer.addWeapon(weaponName, 42) - TriggerClientEvent('esx:showNotification', _source, _U('buy', ESX.GetWeaponLabel(weaponName), ESX.Math.GroupDigits(price))) else - TriggerClientEvent('esx:showNotification', _source, _U('not_enough')) - end + if xPlayer.getMoney() >= price then + xPlayer.removeMoney(price) + xPlayer.addWeapon(weaponName, 42) + + cb(true) + else + TriggerClientEvent('esx:showNotification', source, _U('not_enough')) + cb(false) + end + + end end end) function GetPrice(weaponName, zone) - local result = MySQL.Sync.fetchAll('SELECT price FROM weashops WHERE zone = @zone AND item = @item', { + local price = MySQL.Sync.fetchScalar('SELECT price FROM weashops WHERE zone = @zone AND item = @item', { ['@zone'] = zone, ['@item'] = weaponName }) - return result[1].price + if price then + return price + else + return 0 + end end