Configuration

Shared configuration

Config = {
    Framework = "esx", -- supported frameworks: esx; esx-old; qb-core; custom (editable in server/frameworks/custom.lua)
    ServerName = "~y~Server Name", -- Titre des notifications
    Char = "YOUR_CHAR", -- Icone dans les notifications
    DefaultKey = "PAGEUP", -- Touche par défaut pour ouvrir la boutique
    CarTestTime = 30, -- Temps de l'essai des véhicules (en secondes)
    ZoneDist = 30,  -- Distance maximale à l'intérieur de la zone à partir de laquelle on peut tester les véhicules
    AllowedGroups = {"_dev", "owner"}, -- Allowed groups for commands (giveidshop, refreshShop)
    UseUniqueIds = true, -- Only if you are using FAdmin resource. If true, players will have the same shop ID that their unique ID. If false, players will have a random shop ID.
    NumSeparator = " ", -- thousands separator
    Positions = {
        RequiredZoneForTest = vector3(-1037.89, -2737.75, 19.16), -- Vehicle test zone
        SpawnVehicleTest = vector4(-1627.12, -2781.02, 12.53, 238.83), -- Vehicle spawn test
    },
    HomeButtons = {
        {label = "Recharger des Coins", targetLink = "", icon = "fa-solid fa-up-right-from-square"},
        {label = "Règlement du serveur", targetLink = "", icon = "fa-solid fa-up-right-from-square"},
        {label = "Notre serveur Discord", targetLink = "https://discord.gg/example", icon = "fa-solid fa-up-right-from-square"},
    },
    Lang = {
        ["welcome-message"] = "Bienvenue sur la boutique de <b id='server-name'>Server Name.</b><br><br>Plongez dans une expérience de jeu immersive et exclusive. <br>Ici, vous trouverez une sélection impressionnante de véhicules haut de gamme et des caisses mystérieuses, prêtes à être découvertes. Chaque véhicule est méticuleusement détaillé pour offrir des performances et une esthétique exceptionnelles, tandis que nos caisses renferment des trésors uniques qui ajouteront une dimension excitante à votre aventure. <br>Notre équipe dévouée travaille sans relâche pour vous fournir des nouveautés et des offres spéciales. <br>N'hésitez pas à explorer notre catalogue et à profiter des promotions en cours. <br><br>Merci de nous rejoindre et bon jeu !<br><br><br><b style='text-decoration: underline;'>Il est important de vous préciser que tout achat n'est remboursable uniquement s'il n'a pas encore été récupéré, et la somme de votre achat vous est entièrement remboursée en Coins.</b>", -- You can include Html tags in this element.
        ["last-payment-title"] = "Dernier paiement :",
        ["no-recent-payments"] = "Aucun paiement récent",
        ["category-no-items"] = "Aucun article n'est disponible dans cette catégorie.",
        ["home"] = "Accueil",
        ["historical-label"] = "Mes achats",
        ["your-historical"] = "Historique de vos achats",
        ["date-of-purchase"] = "Date d'achat",
        ["historical-empty"] = "Vous n'avez effectué aucun achat.",
        ["recover"] = "Récupérer",
        ["congratulations"] = "Félicitations !",
        ["you-won"] = "Vous avez gagné : {0}",
        ["obtained-in-a-crate"] = "Obtenu dans une caisse",
        ["obtained-in"] = "Obtenu dans : ",
        ["with-a-winning-rate-of"] = " avec un taux de gain de %s",
        ["open"] = "Ouvrir",
        ["target-shop-id"] = "ID Boutique du destinataire",
        ["target-shop-amount"] = "Montant de l'envoi",
        ["request-a-refund"] = "Demander un remboursement",
        ["refund-unavailable"] = "Inéligible au remboursement",
        ["already-recovered"] = "Déjà récupéré",
        ["already-refunded"] = "Déjà remboursé",
        ["refund-date"] = "Date de remboursement : ",
        ["accepted-recovery"] = "Votre demande de récupération a été acceptée",
        ["accepted-refund"] = "Votre demande de remboursement a été acceptée",
        ["transaction-id"] = "ID de transaction : #",
        ["coins-transfer-label"] = "A qui souhaitez vous transférer des Coins ?",
        ["coins-transfer-preformed"] = "La transaction a été effectuée",
        ["coins-transfer-canceled"] = "La transaction a été annulée",
        ["cant-transfer-to-yourself"] = "Vous ne pouvez pas vous envoyer des Coins à vous même",
        ["transfert-note-sended"] = "Transfert effectué vers l'ID Boutique #%s",
        ["transfert-note-received"] = "Transfert reçu depuis l'ID Boutique #%s",
        ["invalid-shop-id"] = "Cet ID Boutique n'appartient à personne",
        ["received-coins"] = "Vous avez reçu ~y~%s ~s~Coins",
        ["cart-label"] = "Panier",
        ["your-cart"] = "Votre panier",
        ["promotional-code-area-text"] = "Veuillez saisir un code promotionnel",
        ["promotional-code-submit-button"] = "Appliquer",
        ["promotional-code-doesnt-exist"] = "Ce code promotionnel n'existe pas",
        ["promotional-code-inactive"] = "Ce code promotionnel est inactif",
        ["promotional-code-activated"] = "Le code promotionnel est actif",
        ["prices"] = "Prix",
        ["test"] = "Tester",
        ["loading-vehicle-model"] = "Chargement du véhicule",
        ["invalid-vehicle-model"] = "Le modèle du véhicule est invalide",
        ["cant-start-car-test-from-vehicle"] = "Vous ne pouvez pas lancer d'essai depuis un véhicule",
        ["not-in-test-zone"] = "Vous devez être à l'aéroport pour lancer l'essai",
        ["cant-start-car-test-while-already-in-test"] = "Vous ne pouvez pas lancer l'essai car un essai est déjà en cours",
        ["add-to-cart"] = "Ajouter au panier",
        ["cart-empty"] = "Votre panier est vide.",
        ["remove"] = "Supprimer",
        ["cart-total"] = "Sous-total",
        ["proceed-to-payout"] = "Procéder au paiement",
        ["cart-no-items"] = "Aucun article",
        ["item"] = "article",
        ["items"] = "articles",
        ["coins-purchase"] = "Achat de Coins",
        ["coins-transfer"] = "Transfert de Coins",
        ["coins-label"] = "Coins",
        ["out-zone-test"] = "Vous devez être à l'Aéroport pour tester les véhicules.",
        ["item-added-to-cart"] = "Article ajouté au panier",
        ["item-removed-to-cart"] = "Article retiré du panier",
        ["payout-no-item-in-cart"] = "Vous n'avez aucun article dans votre panier.",
        ["not-enought"] = "Vous n'avez pas assez de",
        ["copied-to-clipboard"] = "Votre identifiant a été copié dans le presse-papier",
        ["valid-order-title"] = "Validation",
        ["valid-order-content"] = "Êtes vous sur de vouloir passer la commande ?\nSi oui, vous devrez récupérer vos articles dans votre Historique d'achat.",
        ["passed-order"] = "Votre commande est bien passée.",
        ["cancelled-order"] = "La commande a été annulée",
        ["valid-recovery-title"] = "Validation",
        ["valid-recovery-content"] = "En récupérant cet article, vous renoncez à tout remboursement de ce dernier.",
        ["cancelled-recovery"] = "La récupération de l'article a été annulée",
        ["valid-refund-title"] = "Validation",
        ["valid-refund-content"] = "En soumettant une demande de remboursement, vous renoncez à l'acquisition de cet article.",
        ["cancelled-refund"] = "La demande de remboursement a été annulée",
        ["previous"] = "Précédent",
        ["next"] = "Suivant",
        ["deny"] = "Retour",
        ["accept"] = "Continuer",
        ["error"] = "Une erreur s'est produite...",
        ["too-many-attempts"] = "Trop de tentatives effectuées récemment !",
        ["shop"] = "~y~Boutique",
        ["admin-mode-enabled"] = "Mode édition activé",
        ["admin-mode-disabled"] = "Mode édition désactivé",
        ["admin-create-item"] = "Ajouter un article",
        ["admin-save-item"] = "Sauvegarder",
        ["admin-saved-item"] = "L'article a été sauvegardé avec succès",
    },
    AllowedVehicleTypes = {
        "vehicle",
        "plane",
        "heli",
    },
    GiveCar = {
        StartGiveProcess = function(target, transactionId, CarLabel, CarModel, vehicleType, CarShopPrice, callback)
            -- target : player source
            -- CarLabel : Label of the vehicle
            -- CarModel : Model of the vehicle (spawn name)
            -- CarShopPrice : The amount for which it was purchased
            -- callback(boolean) -- To finalise recovery (true | false)
            Citizen.CreateThread(function()
                local xTarget = Framework.GetPlayerFromId(target)
                local GeneratedPlate = nil
                local IsPlateGenerated = false
                local AllOwnedVehicles = MySQL.Sync.fetchAll('SELECT `plate` FROM owned_vehicles', {})
                while not IsPlateGenerated do
                    local plateDoesExist = false
                    local newPlate = GeneratePlate({useSpace = false, plateLetters = 4, plateNumbers = 4})
                    for k,v in pairs(AllOwnedVehicles) do
                        if v.plate == newPlate then
                            plateDoesExist = true
                        end
                    end
                    if not plateDoesExist then
                        GeneratedPlate = newPlate
                        IsPlateGenerated = true
                        break
                    end
                    Citizen.Wait(500)
                end
                AddTransactionToPendingRequests(xTarget.source, xTarget.identifier, transactionId, GeneratedPlate, callback) -- after the customer transmits the vehicle properties, the vehicle will be added to his garage
                TriggerClientEvent("FlorentBoutique:GetVehicleProperties", xTarget.source, transactionId, CarModel, vehicleType, GeneratedPlate)
            end)
        end,
        EndGiveProcess = function(targetIdentifier, vehicleProperties, vehicleType, cb)
            if vehicleProperties and type(vehicleProperties) == "table" then
                MySQL.Async.fetchAll('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (@owner, @plate, @vehicle)', {
                    ['@owner'] = targetIdentifier,
                    ['@plate'] = vehicleProperties.plate,
                    ['@vehicle'] = json.encode(vehicleProperties),
                }, function(inserted)
                    cb(inserted)
                end)
            else
                cb(false)
            end
        end,
    },
    GiveHouse = {
        Give = function(target, transactionId, houseLabel, houseId, price, callback)
        end
    },
}

Server configuration

Mis à jour