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