diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..f11a345e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "[esx_addons]/esx_multicharacter"] + path = [esx_addons]/esx_multicharacter + url = https://github.com/thelindat/esx_multicharacter.git diff --git a/LICENSE b/LICENSE index c9f6259a..506b94b4 100644 --- a/LICENSE +++ b/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. esx-legacy - Copyright (C) 2015-2021 Jérémie N'gadi + Copyright (C) 2015-2022 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - esx-legacy Copyright (C) 2015-2021 Jérémie N'gadi + esx-legacy Copyright (C) 2015-2022 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/README.md b/README.md index 726aba2d..a1554489 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -
Development Discord - Website - Support Discord +
Discord - Website - Documentation -##### ESX is the most popular framework for creating economy-based roleplay servers on FiveM, with many official and community resources designed to utilise the tools provided here. For a taste of what's available: +##### ESX is the leading framework for creating roleplay servers on FiveM, with many official and community resources designed to utilise the tools provided here. For a taste of what's available: > esx_identity: Enables character registration defining a players name, sex, height, and date of birth > esx_society: Allows job resources to register a society, gaining employee management, society funds, and more @@ -14,86 +14,13 @@ Many more resources are included in this repository, or you can browse the [ESX Community Github](https://github.com/esx-community/) or [Cfx.re Releases board](https://forum.cfx.re/tag/esx) for more. -### Information -##### Legacy provides some necessary bug-fixes and improvements to optimise the framework before reaching the end of official support by the development team. -##### Most resources designed for 1.2 will have no issues with Legacy, notable exceptions are those which modify spawning/loading behaviour. There are several minor feature updates which do not impact compatibility with old resources. -##### NOTE: The loadouts system in ESX has always been problematic, and fixing it would require a complete overhaul. Your best option is to use a resource that handles weapons as items. - -#### Optimisation -- Utilise compile-time jenkins hashing over the GetHashKey native -- Update old MySQL queries to use MySQL.store to improve performance, especially during player saving -- Several loops will now sleep when their tasks are not necessary to perform -- Improved support when using ESX Identity to reduce events and queries during player login -- Support for the latest weapons and components - -#### Features -- Integrated support for identity data -- Integrated commands from esx_adminplus -- All players will be saved immediately before a txAdmin scheduled restart -- Detect if a player is new and send the result to the playerLoaded event -- Support for players logging out when using multicharacter resources -- Cache the players ped id and death state in ESX.PlayerData -- Added an imports file (similar to locales.lua) for setting up events and functions in other resources - - Before defining all manifest script files, add `shared_script '@es_extended/imports.lua'` - - Automatically retrieve the ESX object, removing the need to send a callback event on both the client and server - - Ensures current information is always returned when using `ESX.PlayerData` (except loadout and inventory) -- Spawnmanager is being utilised to correctly handle player spawns - - Potential conflicts with some third-party resources that do not expect spawnmanager -- Added an improved function when performing xPlayer loops to prevent large server hitches - - Using `ESX.GetExtendedPlayers()` instead of `ESX.GetPlayers()` - - You can use arguments with the new function as well, such as - - ESX.GetExtendedPlayers('job', 'police') - - ESX.GetExtendedPlayers('group', 'admin') - -#### Fixes -- ESX.Jobs table is populated after all jobs are setup, allowing other resources to retrieve it if needed -- All weapons are properly removed when using the clearloadout command -##### For creating or updating resources refer to the [updated boilerplate](/esx_example). - -### 1.2 Features -- Weight based inventory system -- Weapons support, including support for attachments and tints -- Supports different money accounts (defaulted with cash, bank and black money) -- Many official resources available in our GitHub -- Job system, with grades and clothes support -- Supports multiple languages, most strings are localized -- Easy to use API for developers to easily integrate ESX to their projects -- Register your own commands easily, with argument validation, chat suggestion and using FXServer ACL - -### Requirements -- All resources from the `core` folder -- [spawnmanager](https://github.com/citizenfx/cfx-server-data) -- [mysql-async](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) - - -### Installation -- Download files to the resources folder and, if desired, prepare directories for organisation (i.e. resources/[core]/es_extended) -- Import `es_extended.sql` in your database -- Import any other sql files for the resources you are using -- Ensure all resources config files have been adjusted for your preferences -- Use or refer to the included server.cfg for start order and settings - -### Conflicts -* The following resources should not be used with ESX Legacy - - essentialmode - - basic-gamemode - - fivem-map-skater - - fivem-map-hipster - - default_spawnpoint - -### Information -ESX was initially developed by Gizz back in 2017 for his friend as the were creating an FiveM server and there wasn't any economy roleplaying frameworks available. The original code was written within a week or two and later open sourced, it has ever since been improved and parts been rewritten to further improve on it. -- [ESX Documentation](https://esx-framework.github.io/es_extended/) -- [FiveM Native Reference](https://runtime.fivem.net/doc/reference.html) - - ### Legal ### License es_extended - ESX framework for FiveM -Copyright (C) 2015-2021 Jérémie N'gadi +Copyright (C) 2015-2022 Jérémie N'gadi This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql new file mode 100644 index 00000000..5a98e887 --- /dev/null +++ b/[SQL]/legacy.sql @@ -0,0 +1,1198 @@ +CREATE TABLE `addon_account` ( + `name` varchar(60) NOT NULL, + `label` varchar(100) NOT NULL, + `shared` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `addon_account` +-- + +INSERT INTO `addon_account` (`name`, `label`, `shared`) VALUES +('caution', 'caution', 0), +('property_black_money', 'Argent Sale Propriété', 0), +('society_ambulance', 'EMS', 1), +('society_cardealer', 'Cardealer', 1), +('society_mechanic', 'Mechanic', 1), +('society_police', 'Police', 1), +('society_taxi', 'Taxi', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `addon_account_data` +-- + +CREATE TABLE `addon_account_data` ( + `id` int(11) NOT NULL, + `account_name` varchar(100) DEFAULT NULL, + `money` int(11) NOT NULL, + `owner` varchar(60) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `addon_account_data` +-- + +INSERT INTO `addon_account_data` (`id`, `account_name`, `money`, `owner`) VALUES +(1, 'society_cardealer', 0, NULL), +(2, 'society_police', 0, NULL), +(3, 'society_ambulance', 0, NULL), +(4, 'society_mechanic', 0, NULL), +(5, 'society_taxi', 0, NULL), +(6, 'caution', 0, 'dd5a2e91e9aa1b6c4fc1f66e44f949954c733450'), +(7, 'caution', 0, 'char1:5e396ab5a00ebd7885ae4df5771b1e79535be6f6'), +(8, 'property_black_money', 0, 'char1:5e396ab5a00ebd7885ae4df5771b1e79535be6f6'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `addon_inventory` +-- + +CREATE TABLE `addon_inventory` ( + `name` varchar(60) NOT NULL, + `label` varchar(100) NOT NULL, + `shared` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `addon_inventory` +-- + +INSERT INTO `addon_inventory` (`name`, `label`, `shared`) VALUES +('property', 'Propriété', 0), +('society_ambulance', 'EMS', 1), +('society_cardealer', 'Cardealer', 1), +('society_mechanic', 'Mechanic', 1), +('society_police', 'Police', 1), +('society_taxi', 'Taxi', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `addon_inventory_items` +-- + +CREATE TABLE `addon_inventory_items` ( + `id` int(11) NOT NULL, + `inventory_name` varchar(100) NOT NULL, + `name` varchar(100) NOT NULL, + `count` int(11) NOT NULL, + `owner` varchar(60) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `billing` +-- + +CREATE TABLE `billing` ( + `id` int(11) NOT NULL, + `identifier` varchar(60) DEFAULT NULL, + `sender` varchar(40) NOT NULL, + `target_type` varchar(50) NOT NULL, + `target` varchar(40) NOT NULL, + `label` varchar(255) NOT NULL, + `amount` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `cardealer_vehicles` +-- + +CREATE TABLE `cardealer_vehicles` ( + `id` int(11) NOT NULL, + `vehicle` varchar(255) NOT NULL, + `price` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `datastore` +-- + +CREATE TABLE `datastore` ( + `name` varchar(60) NOT NULL, + `label` varchar(100) NOT NULL, + `shared` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `datastore` +-- + +INSERT INTO `datastore` (`name`, `label`, `shared`) VALUES +('property', 'Propriété', 0), +('society_ambulance', 'EMS', 1), +('society_mechanic', 'Mechanic', 1), +('society_police', 'Police', 1), +('society_taxi', 'Taxi', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `datastore_data` +-- + +CREATE TABLE `datastore_data` ( + `id` int(11) NOT NULL, + `name` varchar(60) NOT NULL, + `owner` varchar(60) DEFAULT NULL, + `data` longtext DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `datastore_data` +-- + +INSERT INTO `datastore_data` (`id`, `name`, `owner`, `data`) VALUES +(1, 'society_police', NULL, '{}'), +(2, 'society_ambulance', NULL, '{}'), +(3, 'society_mechanic', NULL, '{}'), +(4, 'society_taxi', NULL, '{}'), +(5, 'property', 'char1:5e396ab5a00ebd7885ae4df5771b1e79535be6f6', '{}'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `items` +-- + +CREATE TABLE `items` ( + `name` varchar(50) NOT NULL, + `label` varchar(50) NOT NULL, + `weight` int(11) NOT NULL DEFAULT 1, + `rare` tinyint(4) NOT NULL DEFAULT 0, + `can_remove` tinyint(4) NOT NULL DEFAULT 1 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `items` +-- + +INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES +('alive_chicken', 'Living chicken', 1, 0, 1), +('bandage', 'Bandage', 2, 0, 1), +('blowpipe', 'Blowtorch', 2, 0, 1), +('bread', 'Bread', 1, 0, 1), +('cannabis', 'Cannabis', 3, 0, 1), +('carokit', 'Body Kit', 3, 0, 1), +('carotool', 'Tools', 2, 0, 1), +('clothe', 'Cloth', 1, 0, 1), +('copper', 'Copper', 1, 0, 1), +('cutted_wood', 'Cut wood', 1, 0, 1), +('diamond', 'Diamond', 1, 0, 1), +('essence', 'Gas', 1, 0, 1), +('fabric', 'Fabric', 1, 0, 1), +('fish', 'Fish', 1, 0, 1), +('fixkit', 'Repair Kit', 3, 0, 1), +('fixtool', 'Repair Tools', 2, 0, 1), +('gazbottle', 'Gas Bottle', 2, 0, 1), +('gold', 'Gold', 1, 0, 1), +('iron', 'Iron', 1, 0, 1), +('marijuana', 'Marijuana', 2, 0, 1), +('medikit', 'Medikit', 2, 0, 1), +('packaged_chicken', 'Chicken fillet', 1, 0, 1), +('packaged_plank', 'Packaged wood', 1, 0, 1), +('petrol', 'Oil', 1, 0, 1), +('petrol_raffin', 'Processed oil', 1, 0, 1), +('phone', 'Phone', 1, 0, 1), +('slaughtered_chicken', 'Slaughtered chicken', 1, 0, 1), +('stone', 'Stone', 1, 0, 1), +('washed_stone', 'Washed stone', 1, 0, 1), +('water', 'Water', 1, 0, 1), +('wood', 'Wood', 1, 0, 1), +('wool', 'Wool', 1, 0, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `jobs` +-- + +CREATE TABLE `jobs` ( + `name` varchar(50) NOT NULL, + `label` varchar(50) DEFAULT NULL, + `whitelisted` tinyint(1) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `jobs` +-- + +INSERT INTO `jobs` (`name`, `label`, `whitelisted`) VALUES +('ambulance', 'EMS', 0), +('cardealer', 'Cardealer', 0), +('fisherman', 'Fisherman', 0), +('fueler', 'Fueler', 0), +('lumberjack', 'Lumberjack', 0), +('mechanic', 'Mechanic', 0), +('miner', 'Miner', 0), +('police', 'LSPD', 0), +('reporter', 'Reporter', 0), +('slaughterer', 'Butcher', 0), +('tailor', 'Tailor', 0), +('taxi', 'Taxi', 0), +('unemployed', 'Unemployed', 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `job_grades` +-- + +CREATE TABLE `job_grades` ( + `id` int(11) NOT NULL, + `job_name` varchar(50) DEFAULT NULL, + `grade` int(11) NOT NULL, + `name` varchar(50) NOT NULL, + `label` varchar(50) NOT NULL, + `salary` int(11) NOT NULL, + `skin_male` longtext NOT NULL, + `skin_female` longtext NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `job_grades` +-- + +INSERT INTO `job_grades` (`id`, `job_name`, `grade`, `name`, `label`, `salary`, `skin_male`, `skin_female`) VALUES +(1, 'unemployed', 0, 'unemployed', 'Unemployed', 200, '{}', '{}'), +(2, 'police', 0, 'recruit', 'Recrue', 20, '{}', '{}'), +(3, 'police', 1, 'officer', 'Officier', 40, '{}', '{}'), +(4, 'police', 2, 'sergeant', 'Sergent', 60, '{}', '{}'), +(5, 'police', 3, 'lieutenant', 'Lieutenant', 85, '{}', '{}'), +(6, 'police', 4, 'boss', 'Commandant', 100, '{}', '{}'), +(11, 'cardealer', 0, 'recruit', 'Recruit', 10, '{}', '{}'), +(12, 'cardealer', 1, 'novice', 'Novice', 25, '{}', '{}'), +(13, 'cardealer', 2, 'experienced', 'Experienced', 40, '{}', '{}'), +(14, 'cardealer', 3, 'boss', 'Boss', 0, '{}', '{}'), +(15, 'lumberjack', 0, 'employee', 'Employee', 0, '{}', '{}'), +(16, 'fisherman', 0, 'employee', 'Employee', 0, '{}', '{}'), +(17, 'fueler', 0, 'employee', 'Employee', 0, '{}', '{}'), +(18, 'reporter', 0, 'employee', 'Employee', 0, '{}', '{}'), +(19, 'tailor', 0, 'employee', 'Employee', 0, '{\"mask_1\":0,\"arms\":1,\"glasses_1\":0,\"hair_color_2\":4,\"makeup_1\":0,\"face\":19,\"glasses\":0,\"mask_2\":0,\"makeup_3\":0,\"skin\":29,\"helmet_2\":0,\"lipstick_4\":0,\"sex\":0,\"torso_1\":24,\"makeup_2\":0,\"bags_2\":0,\"chain_2\":0,\"ears_1\":-1,\"bags_1\":0,\"bproof_1\":0,\"shoes_2\":0,\"lipstick_2\":0,\"chain_1\":0,\"tshirt_1\":0,\"eyebrows_3\":0,\"pants_2\":0,\"beard_4\":0,\"torso_2\":0,\"beard_2\":6,\"ears_2\":0,\"hair_2\":0,\"shoes_1\":36,\"tshirt_2\":0,\"beard_3\":0,\"hair_1\":2,\"hair_color_1\":0,\"pants_1\":48,\"helmet_1\":-1,\"bproof_2\":0,\"eyebrows_4\":0,\"eyebrows_2\":0,\"decals_1\":0,\"age_2\":0,\"beard_1\":5,\"shoes\":10,\"lipstick_1\":0,\"eyebrows_1\":0,\"glasses_2\":0,\"makeup_4\":0,\"decals_2\":0,\"lipstick_3\":0,\"age_1\":0}', '{\"mask_1\":0,\"arms\":5,\"glasses_1\":5,\"hair_color_2\":4,\"makeup_1\":0,\"face\":19,\"glasses\":0,\"mask_2\":0,\"makeup_3\":0,\"skin\":29,\"helmet_2\":0,\"lipstick_4\":0,\"sex\":1,\"torso_1\":52,\"makeup_2\":0,\"bags_2\":0,\"chain_2\":0,\"ears_1\":-1,\"bags_1\":0,\"bproof_1\":0,\"shoes_2\":1,\"lipstick_2\":0,\"chain_1\":0,\"tshirt_1\":23,\"eyebrows_3\":0,\"pants_2\":0,\"beard_4\":0,\"torso_2\":0,\"beard_2\":6,\"ears_2\":0,\"hair_2\":0,\"shoes_1\":42,\"tshirt_2\":4,\"beard_3\":0,\"hair_1\":2,\"hair_color_1\":0,\"pants_1\":36,\"helmet_1\":-1,\"bproof_2\":0,\"eyebrows_4\":0,\"eyebrows_2\":0,\"decals_1\":0,\"age_2\":0,\"beard_1\":5,\"shoes\":10,\"lipstick_1\":0,\"eyebrows_1\":0,\"glasses_2\":0,\"makeup_4\":0,\"decals_2\":0,\"lipstick_3\":0,\"age_1\":0}'), +(20, 'miner', 0, 'employee', 'Employee', 0, '{\"tshirt_2\":1,\"ears_1\":8,\"glasses_1\":15,\"torso_2\":0,\"ears_2\":2,\"glasses_2\":3,\"shoes_2\":1,\"pants_1\":75,\"shoes_1\":51,\"bags_1\":0,\"helmet_2\":0,\"pants_2\":7,\"torso_1\":71,\"tshirt_1\":59,\"arms\":2,\"bags_2\":0,\"helmet_1\":0}', '{}'), +(21, 'slaughterer', 0, 'employee', 'Employee', 0, '{\"age_1\":0,\"glasses_2\":0,\"beard_1\":5,\"decals_2\":0,\"beard_4\":0,\"shoes_2\":0,\"tshirt_2\":0,\"lipstick_2\":0,\"hair_2\":0,\"arms\":67,\"pants_1\":36,\"skin\":29,\"eyebrows_2\":0,\"shoes\":10,\"helmet_1\":-1,\"lipstick_1\":0,\"helmet_2\":0,\"hair_color_1\":0,\"glasses\":0,\"makeup_4\":0,\"makeup_1\":0,\"hair_1\":2,\"bproof_1\":0,\"bags_1\":0,\"mask_1\":0,\"lipstick_3\":0,\"chain_1\":0,\"eyebrows_4\":0,\"sex\":0,\"torso_1\":56,\"beard_2\":6,\"shoes_1\":12,\"decals_1\":0,\"face\":19,\"lipstick_4\":0,\"tshirt_1\":15,\"mask_2\":0,\"age_2\":0,\"eyebrows_3\":0,\"chain_2\":0,\"glasses_1\":0,\"ears_1\":-1,\"bags_2\":0,\"ears_2\":0,\"torso_2\":0,\"bproof_2\":0,\"makeup_2\":0,\"eyebrows_1\":0,\"makeup_3\":0,\"pants_2\":0,\"beard_3\":0,\"hair_color_2\":4}', '{\"age_1\":0,\"glasses_2\":0,\"beard_1\":5,\"decals_2\":0,\"beard_4\":0,\"shoes_2\":0,\"tshirt_2\":0,\"lipstick_2\":0,\"hair_2\":0,\"arms\":72,\"pants_1\":45,\"skin\":29,\"eyebrows_2\":0,\"shoes\":10,\"helmet_1\":-1,\"lipstick_1\":0,\"helmet_2\":0,\"hair_color_1\":0,\"glasses\":0,\"makeup_4\":0,\"makeup_1\":0,\"hair_1\":2,\"bproof_1\":0,\"bags_1\":0,\"mask_1\":0,\"lipstick_3\":0,\"chain_1\":0,\"eyebrows_4\":0,\"sex\":1,\"torso_1\":49,\"beard_2\":6,\"shoes_1\":24,\"decals_1\":0,\"face\":19,\"lipstick_4\":0,\"tshirt_1\":9,\"mask_2\":0,\"age_2\":0,\"eyebrows_3\":0,\"chain_2\":0,\"glasses_1\":5,\"ears_1\":-1,\"bags_2\":0,\"ears_2\":0,\"torso_2\":0,\"bproof_2\":0,\"makeup_2\":0,\"eyebrows_1\":0,\"makeup_3\":0,\"pants_2\":0,\"beard_3\":0,\"hair_color_2\":4}'), +(22, 'ambulance', 0, 'ambulance', 'Jr. EMT', 20, '{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}', '{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), +(23, 'ambulance', 1, 'doctor', 'EMT', 40, '{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}', '{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), +(24, 'ambulance', 2, 'chief_doctor', 'Sr. EMT', 60, '{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}', '{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), +(25, 'ambulance', 3, 'boss', 'EMT Supervisor', 80, '{\"tshirt_2\":0,\"hair_color_1\":5,\"glasses_2\":3,\"shoes\":9,\"torso_2\":3,\"hair_color_2\":0,\"pants_1\":24,\"glasses_1\":4,\"hair_1\":2,\"sex\":0,\"decals_2\":0,\"tshirt_1\":15,\"helmet_1\":8,\"helmet_2\":0,\"arms\":92,\"face\":19,\"decals_1\":60,\"torso_1\":13,\"hair_2\":0,\"skin\":34,\"pants_2\":5}', '{\"tshirt_2\":3,\"decals_2\":0,\"glasses\":0,\"hair_1\":2,\"torso_1\":73,\"shoes\":1,\"hair_color_2\":0,\"glasses_1\":19,\"skin\":13,\"face\":6,\"pants_2\":5,\"tshirt_1\":75,\"pants_1\":37,\"helmet_1\":57,\"torso_2\":0,\"arms\":14,\"sex\":1,\"glasses_2\":0,\"decals_1\":0,\"hair_2\":0,\"helmet_2\":0,\"hair_color_1\":0}'), +(26, 'mechanic', 0, 'recrue', 'Recruit', 12, '{}', '{}'), +(27, 'mechanic', 1, 'novice', 'Novice', 24, '{}', '{}'), +(28, 'mechanic', 2, 'experimente', 'Experienced', 36, '{}', '{}'), +(29, 'mechanic', 3, 'chief', 'Leader', 48, '{}', '{}'), +(30, 'mechanic', 4, 'boss', 'Boss', 0, '{}', '{}'), +(31, 'taxi', 0, 'recrue', 'Recruit', 12, '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":32,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":31,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":0,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":27,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":0,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":0,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":10,\"pants_1\":24}', '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":57,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":38,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":1,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":21,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":1,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":5,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":49,\"pants_1\":11}'), +(32, 'taxi', 1, 'novice', 'Cabby', 24, '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":32,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":31,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":0,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":27,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":0,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":0,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":10,\"pants_1\":24}', '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":57,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":38,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":1,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":21,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":1,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":5,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":49,\"pants_1\":11}'), +(33, 'taxi', 2, 'experimente', 'Experienced', 36, '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":26,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":57,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":4,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":11,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":0,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":0,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":0,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":10,\"pants_1\":24}', '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":57,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":38,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":1,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":21,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":1,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":5,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":49,\"pants_1\":11}'), +(34, 'taxi', 3, 'uber', 'Uber Cabby', 48, '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":26,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":57,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":4,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":11,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":0,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":0,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":0,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":10,\"pants_1\":24}', '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":57,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":38,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":1,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":21,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":1,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":5,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":49,\"pants_1\":11}'), +(35, 'taxi', 4, 'boss', 'Lead Cabby', 0, '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":29,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":31,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":4,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":1,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":0,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":0,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":0,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":4,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":10,\"pants_1\":24}', '{\"hair_2\":0,\"hair_color_2\":0,\"torso_1\":57,\"bags_1\":0,\"helmet_2\":0,\"chain_2\":0,\"eyebrows_3\":0,\"makeup_3\":0,\"makeup_2\":0,\"tshirt_1\":38,\"makeup_1\":0,\"bags_2\":0,\"makeup_4\":0,\"eyebrows_4\":0,\"chain_1\":0,\"lipstick_4\":0,\"bproof_2\":0,\"hair_color_1\":0,\"decals_2\":0,\"pants_2\":1,\"age_2\":0,\"glasses_2\":0,\"ears_2\":0,\"arms\":21,\"lipstick_1\":0,\"ears_1\":-1,\"mask_2\":0,\"sex\":1,\"lipstick_3\":0,\"helmet_1\":-1,\"shoes_2\":0,\"beard_2\":0,\"beard_1\":0,\"lipstick_2\":0,\"beard_4\":0,\"glasses_1\":5,\"bproof_1\":0,\"mask_1\":0,\"decals_1\":1,\"hair_1\":0,\"eyebrows_2\":0,\"beard_3\":0,\"age_1\":0,\"tshirt_2\":0,\"skin\":0,\"torso_2\":0,\"eyebrows_1\":0,\"face\":0,\"shoes_1\":49,\"pants_1\":11}'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `licenses` +-- + +CREATE TABLE `licenses` ( + `type` varchar(60) NOT NULL, + `label` varchar(60) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `licenses` +-- + +INSERT INTO `licenses` (`type`, `label`) VALUES +('weed_processing', 'Weed Processing License'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `owned_properties` +-- + +CREATE TABLE `owned_properties` ( + `id` int(11) NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `price` double NOT NULL, + `rented` int(11) NOT NULL, + `owner` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `owned_vehicles` +-- + +CREATE TABLE `owned_vehicles` ( + `owner` varchar(60) DEFAULT NULL, + `plate` varchar(12) NOT NULL, + `vehicle` longtext DEFAULT NULL, + `type` varchar(20) NOT NULL DEFAULT 'car', + `job` varchar(20) DEFAULT NULL, + `stored` tinyint(4) NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `properties` +-- + +CREATE TABLE `properties` ( + `id` int(11) NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `label` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `entering` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `exit` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `inside` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `outside` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `ipls` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '[]', + `gateway` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `is_single` int(11) DEFAULT NULL, + `is_room` int(11) DEFAULT NULL, + `is_gateway` int(11) DEFAULT NULL, + `room_menu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `price` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- +-- Dumping data for table `properties` +-- + +INSERT INTO `properties` (`id`, `name`, `label`, `entering`, `exit`, `inside`, `outside`, `ipls`, `gateway`, `is_single`, `is_room`, `is_gateway`, `room_menu`, `price`) VALUES +(1, 'WhispymoundDrive', '2677 Whispymound Drive', '{\"y\":564.89,\"z\":182.959,\"x\":119.384}', '{\"x\":117.347,\"y\":559.506,\"z\":183.304}', '{\"y\":557.032,\"z\":183.301,\"x\":118.037}', '{\"y\":567.798,\"z\":182.131,\"x\":119.249}', '[]', NULL, 1, 1, 0, '{\"x\":118.748,\"y\":566.573,\"z\":175.697}', 1500000), +(2, 'NorthConkerAvenue2045', '2045 North Conker Avenue', '{\"x\":372.796,\"y\":428.327,\"z\":144.685}', '{\"x\":373.548,\"y\":422.982,\"z\":144.907}', '{\"y\":420.075,\"z\":145.904,\"x\":372.161}', '{\"x\":372.454,\"y\":432.886,\"z\":143.443}', '[]', NULL, 1, 1, 0, '{\"x\":377.349,\"y\":429.422,\"z\":137.3}', 1500000), +(3, 'RichardMajesticApt2', 'Richard Majestic, Apt 2', '{\"y\":-379.165,\"z\":37.961,\"x\":-936.363}', '{\"y\":-365.476,\"z\":113.274,\"x\":-913.097}', '{\"y\":-367.637,\"z\":113.274,\"x\":-918.022}', '{\"y\":-382.023,\"z\":37.961,\"x\":-943.626}', '[]', NULL, 1, 1, 0, '{\"x\":-927.554,\"y\":-377.744,\"z\":112.674}', 1700000), +(4, 'NorthConkerAvenue2044', '2044 North Conker Avenue', '{\"y\":440.8,\"z\":146.702,\"x\":346.964}', '{\"y\":437.456,\"z\":148.394,\"x\":341.683}', '{\"y\":435.626,\"z\":148.394,\"x\":339.595}', '{\"x\":350.535,\"y\":443.329,\"z\":145.764}', '[]', NULL, 1, 1, 0, '{\"x\":337.726,\"y\":436.985,\"z\":140.77}', 1500000), +(5, 'WildOatsDrive', '3655 Wild Oats Drive', '{\"y\":502.696,\"z\":136.421,\"x\":-176.003}', '{\"y\":497.817,\"z\":136.653,\"x\":-174.349}', '{\"y\":495.069,\"z\":136.666,\"x\":-173.331}', '{\"y\":506.412,\"z\":135.0664,\"x\":-177.927}', '[]', NULL, 1, 1, 0, '{\"x\":-174.725,\"y\":493.095,\"z\":129.043}', 1500000), +(6, 'HillcrestAvenue2862', '2862 Hillcrest Avenue', '{\"y\":596.58,\"z\":142.641,\"x\":-686.554}', '{\"y\":591.988,\"z\":144.392,\"x\":-681.728}', '{\"y\":590.608,\"z\":144.392,\"x\":-680.124}', '{\"y\":599.019,\"z\":142.059,\"x\":-689.492}', '[]', NULL, 1, 1, 0, '{\"x\":-680.46,\"y\":588.6,\"z\":136.769}', 1500000), +(7, 'LowEndApartment', 'Appartement de base', '{\"y\":-1078.735,\"z\":28.4031,\"x\":292.528}', '{\"y\":-1007.152,\"z\":-102.002,\"x\":265.845}', '{\"y\":-1002.802,\"z\":-100.008,\"x\":265.307}', '{\"y\":-1078.669,\"z\":28.401,\"x\":296.738}', '[]', NULL, 1, 1, 0, '{\"x\":265.916,\"y\":-999.38,\"z\":-100.008}', 562500), +(8, 'MadWayneThunder', '2113 Mad Wayne Thunder', '{\"y\":454.955,\"z\":96.462,\"x\":-1294.433}', '{\"x\":-1289.917,\"y\":449.541,\"z\":96.902}', '{\"y\":446.322,\"z\":96.899,\"x\":-1289.642}', '{\"y\":455.453,\"z\":96.517,\"x\":-1298.851}', '[]', NULL, 1, 1, 0, '{\"x\":-1287.306,\"y\":455.901,\"z\":89.294}', 1500000), +(9, 'HillcrestAvenue2874', '2874 Hillcrest Avenue', '{\"x\":-853.346,\"y\":696.678,\"z\":147.782}', '{\"y\":690.875,\"z\":151.86,\"x\":-859.961}', '{\"y\":688.361,\"z\":151.857,\"x\":-859.395}', '{\"y\":701.628,\"z\":147.773,\"x\":-855.007}', '[]', NULL, 1, 1, 0, '{\"x\":-858.543,\"y\":697.514,\"z\":144.253}', 1500000), +(10, 'HillcrestAvenue2868', '2868 Hillcrest Avenue', '{\"y\":620.494,\"z\":141.588,\"x\":-752.82}', '{\"y\":618.62,\"z\":143.153,\"x\":-759.317}', '{\"y\":617.629,\"z\":143.153,\"x\":-760.789}', '{\"y\":621.281,\"z\":141.254,\"x\":-750.919}', '[]', NULL, 1, 1, 0, '{\"x\":-762.504,\"y\":618.992,\"z\":135.53}', 1500000), +(11, 'TinselTowersApt12', 'Tinsel Towers, Apt 42', '{\"y\":37.025,\"z\":42.58,\"x\":-618.299}', '{\"y\":58.898,\"z\":97.2,\"x\":-603.301}', '{\"y\":58.941,\"z\":97.2,\"x\":-608.741}', '{\"y\":30.603,\"z\":42.524,\"x\":-620.017}', '[]', NULL, 1, 1, 0, '{\"x\":-622.173,\"y\":54.585,\"z\":96.599}', 1700000), +(12, 'MiltonDrive', 'Milton Drive', '{\"x\":-775.17,\"y\":312.01,\"z\":84.658}', NULL, NULL, '{\"x\":-775.346,\"y\":306.776,\"z\":84.7}', '[]', NULL, 0, 0, 1, NULL, 0), +(13, 'Modern1Apartment', 'Appartement Moderne 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_01_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.661,\"y\":327.672,\"z\":210.396}', 1300000), +(14, 'Modern2Apartment', 'Appartement Moderne 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_01_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.735,\"y\":326.757,\"z\":186.313}', 1300000), +(15, 'Modern3Apartment', 'Appartement Moderne 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_01_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.386,\"y\":330.782,\"z\":195.08}', 1300000), +(16, 'Mody1Apartment', 'Appartement Mode 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_02_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.615,\"y\":327.878,\"z\":210.396}', 1300000), +(17, 'Mody2Apartment', 'Appartement Mode 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_02_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.297,\"y\":327.092,\"z\":186.313}', 1300000), +(18, 'Mody3Apartment', 'Appartement Mode 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_02_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.303,\"y\":330.932,\"z\":195.085}', 1300000), +(19, 'Vibrant1Apartment', 'Appartement Vibrant 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_03_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.885,\"y\":327.641,\"z\":210.396}', 1300000), +(20, 'Vibrant2Apartment', 'Appartement Vibrant 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_03_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.607,\"y\":327.344,\"z\":186.313}', 1300000), +(21, 'Vibrant3Apartment', 'Appartement Vibrant 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_03_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.525,\"y\":330.851,\"z\":195.085}', 1300000), +(22, 'Sharp1Apartment', 'Appartement Persan 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_04_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.527,\"y\":327.89,\"z\":210.396}', 1300000), +(23, 'Sharp2Apartment', 'Appartement Persan 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_04_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.642,\"y\":326.497,\"z\":186.313}', 1300000), +(24, 'Sharp3Apartment', 'Appartement Persan 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_04_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.503,\"y\":331.318,\"z\":195.085}', 1300000), +(25, 'Monochrome1Apartment', 'Appartement Monochrome 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_05_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.289,\"y\":328.086,\"z\":210.396}', 1300000), +(26, 'Monochrome2Apartment', 'Appartement Monochrome 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_05_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.692,\"y\":326.762,\"z\":186.313}', 1300000), +(27, 'Monochrome3Apartment', 'Appartement Monochrome 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_05_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.094,\"y\":330.976,\"z\":195.085}', 1300000), +(28, 'Seductive1Apartment', 'Appartement Séduisant 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_06_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.263,\"y\":328.104,\"z\":210.396}', 1300000), +(29, 'Seductive2Apartment', 'Appartement Séduisant 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_06_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.655,\"y\":326.611,\"z\":186.313}', 1300000), +(30, 'Seductive3Apartment', 'Appartement Séduisant 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_06_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.3,\"y\":331.414,\"z\":195.085}', 1300000), +(31, 'Regal1Apartment', 'Appartement Régal 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_07_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.956,\"y\":328.257,\"z\":210.396}', 1300000), +(32, 'Regal2Apartment', 'Appartement Régal 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_07_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.545,\"y\":326.659,\"z\":186.313}', 1300000), +(33, 'Regal3Apartment', 'Appartement Régal 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_07_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.087,\"y\":331.429,\"z\":195.123}', 1300000), +(34, 'Aqua1Apartment', 'Appartement Aqua 1', NULL, '{\"x\":-784.194,\"y\":323.636,\"z\":210.997}', '{\"x\":-779.751,\"y\":323.385,\"z\":210.997}', NULL, '[\"apa_v_mp_h_08_a\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-766.187,\"y\":328.47,\"z\":210.396}', 1300000), +(35, 'Aqua2Apartment', 'Appartement Aqua 2', NULL, '{\"x\":-786.8663,\"y\":315.764,\"z\":186.913}', '{\"x\":-781.808,\"y\":315.866,\"z\":186.913}', NULL, '[\"apa_v_mp_h_08_c\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-795.658,\"y\":326.563,\"z\":186.313}', 1300000), +(36, 'Aqua3Apartment', 'Appartement Aqua 3', NULL, '{\"x\":-774.012,\"y\":342.042,\"z\":195.686}', '{\"x\":-779.057,\"y\":342.063,\"z\":195.686}', NULL, '[\"apa_v_mp_h_08_b\"]', 'MiltonDrive', 0, 1, 0, '{\"x\":-765.287,\"y\":331.084,\"z\":195.086}', 1300000), +(37, 'IntegrityWay', '4 Integrity Way', '{\"x\":-47.804,\"y\":-585.867,\"z\":36.956}', NULL, NULL, '{\"x\":-54.178,\"y\":-583.762,\"z\":35.798}', '[]', NULL, 0, 0, 1, NULL, 0), +(38, 'IntegrityWay28', '4 Integrity Way - Apt 28', NULL, '{\"x\":-31.409,\"y\":-594.927,\"z\":79.03}', '{\"x\":-26.098,\"y\":-596.909,\"z\":79.03}', NULL, '[]', 'IntegrityWay', 0, 1, 0, '{\"x\":-11.923,\"y\":-597.083,\"z\":78.43}', 1700000), +(39, 'IntegrityWay30', '4 Integrity Way - Apt 30', NULL, '{\"x\":-17.702,\"y\":-588.524,\"z\":89.114}', '{\"x\":-16.21,\"y\":-582.569,\"z\":89.114}', NULL, '[]', 'IntegrityWay', 0, 1, 0, '{\"x\":-26.327,\"y\":-588.384,\"z\":89.123}', 1700000), +(40, 'DellPerroHeights', 'Dell Perro Heights', '{\"x\":-1447.06,\"y\":-538.28,\"z\":33.74}', NULL, NULL, '{\"x\":-1440.022,\"y\":-548.696,\"z\":33.74}', '[]', NULL, 0, 0, 1, NULL, 0), +(41, 'DellPerroHeightst4', 'Dell Perro Heights - Apt 28', NULL, '{\"x\":-1452.125,\"y\":-540.591,\"z\":73.044}', '{\"x\":-1455.435,\"y\":-535.79,\"z\":73.044}', NULL, '[]', 'DellPerroHeights', 0, 1, 0, '{\"x\":-1467.058,\"y\":-527.571,\"z\":72.443}', 1700000), +(42, 'DellPerroHeightst7', 'Dell Perro Heights - Apt 30', NULL, '{\"x\":-1451.562,\"y\":-523.535,\"z\":55.928}', '{\"x\":-1456.02,\"y\":-519.209,\"z\":55.929}', NULL, '[]', 'DellPerroHeights', 0, 1, 0, '{\"x\":-1457.026,\"y\":-530.219,\"z\":55.937}', 1700000), +(43, 'MazeBankBuilding', 'Maze Bank Building', '{\"x\":-79.18,\"y\":-795.92,\"z\":43.35}', NULL, NULL, '{\"x\":-72.50,\"y\":-786.92,\"z\":43.40}', '[]', NULL, 0, 0, 1, NULL, 0), +(44, 'OldSpiceWarm', 'Old Spice Warm', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_01a\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(45, 'OldSpiceClassical', 'Old Spice Classical', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_01b\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(46, 'OldSpiceVintage', 'Old Spice Vintage', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_01c\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(47, 'ExecutiveRich', 'Executive Rich', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_02b\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(48, 'ExecutiveCool', 'Executive Cool', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_02c\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(49, 'ExecutiveContrast', 'Executive Contrast', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_02a\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(50, 'PowerBrokerIce', 'Power Broker Ice', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_03a\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(51, 'PowerBrokerConservative', 'Power Broker Conservative', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_03b\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(52, 'PowerBrokerPolished', 'Power Broker Polished', NULL, '{\"x\":-75.69,\"y\":-827.08,\"z\":242.43}', '{\"x\":-75.51,\"y\":-823.90,\"z\":242.43}', NULL, '[\"ex_dt1_11_office_03c\"]', 'MazeBankBuilding', 0, 1, 0, '{\"x\":-71.81,\"y\":-814.34,\"z\":242.39}', 5000000), +(53, 'LomBank', 'Lom Bank', '{\"x\":-1581.36,\"y\":-558.23,\"z\":34.07}', NULL, NULL, '{\"x\":-1583.60,\"y\":-555.12,\"z\":34.07}', '[]', NULL, 0, 0, 1, NULL, 0), +(54, 'LBOldSpiceWarm', 'LB Old Spice Warm', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_01a\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(55, 'LBOldSpiceClassical', 'LB Old Spice Classical', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_01b\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(56, 'LBOldSpiceVintage', 'LB Old Spice Vintage', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_01c\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(57, 'LBExecutiveRich', 'LB Executive Rich', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_02b\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(58, 'LBExecutiveCool', 'LB Executive Cool', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_02c\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(59, 'LBExecutiveContrast', 'LB Executive Contrast', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_02a\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(60, 'LBPowerBrokerIce', 'LB Power Broker Ice', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_03a\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(61, 'LBPowerBrokerConservative', 'LB Power Broker Conservative', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_03b\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(62, 'LBPowerBrokerPolished', 'LB Power Broker Polished', NULL, '{\"x\":-1579.53,\"y\":-564.89,\"z\":107.62}', '{\"x\":-1576.42,\"y\":-567.57,\"z\":107.62}', NULL, '[\"ex_sm_13_office_03c\"]', 'LomBank', 0, 1, 0, '{\"x\":-1571.26,\"y\":-575.76,\"z\":107.52}', 3500000), +(63, 'MazeBankWest', 'Maze Bank West', '{\"x\":-1379.58,\"y\":-499.63,\"z\":32.22}', NULL, NULL, '{\"x\":-1378.95,\"y\":-502.82,\"z\":32.22}', '[]', NULL, 0, 0, 1, NULL, 0), +(64, 'MBWOldSpiceWarm', 'MBW Old Spice Warm', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_01a\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(65, 'MBWOldSpiceClassical', 'MBW Old Spice Classical', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_01b\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(66, 'MBWOldSpiceVintage', 'MBW Old Spice Vintage', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_01c\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(67, 'MBWExecutiveRich', 'MBW Executive Rich', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_02b\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(68, 'MBWExecutiveCool', 'MBW Executive Cool', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_02c\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(69, 'MBWExecutive Contrast', 'MBW Executive Contrast', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_02a\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(70, 'MBWPowerBrokerIce', 'MBW Power Broker Ice', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_03a\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(71, 'MBWPowerBrokerConvservative', 'MBW Power Broker Convservative', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_03b\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000), +(72, 'MBWPowerBrokerPolished', 'MBW Power Broker Polished', NULL, '{\"x\":-1392.74,\"y\":-480.18,\"z\":71.14}', '{\"x\":-1389.43,\"y\":-479.01,\"z\":71.14}', NULL, '[\"ex_sm_15_office_03c\"]', 'MazeBankWest', 0, 1, 0, '{\"x\":-1390.76,\"y\":-479.22,\"z\":72.04}', 2700000); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `rented_vehicles` +-- + +CREATE TABLE `rented_vehicles` ( + `vehicle` varchar(60) NOT NULL, + `plate` varchar(12) NOT NULL, + `player_name` varchar(255) NOT NULL, + `base_price` int(11) NOT NULL, + `rent_price` int(11) NOT NULL, + `owner` varchar(22) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Table structure for table `society_moneywash` +-- + +CREATE TABLE `society_moneywash` ( + `id` int(11) NOT NULL, + `identifier` varchar(60) NOT NULL, + `society` varchar(60) NOT NULL, + `amount` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE `users` ( + `identifier` varchar(60) NOT NULL, + `accounts` longtext DEFAULT NULL, + `group` varchar(50) DEFAULT 'user', + `inventory` longtext DEFAULT NULL, + `job` varchar(20) DEFAULT 'unemployed', + `job_grade` int(11) DEFAULT 0, + `loadout` longtext DEFAULT NULL, + `position` varchar(255) DEFAULT '{"x":-269.4,"y":-955.3,"z":31.2,"heading":205.8}', + `firstname` varchar(16) DEFAULT NULL, + `lastname` varchar(16) DEFAULT NULL, + `dateofbirth` varchar(10) DEFAULT NULL, + `sex` varchar(1) DEFAULT NULL, + `height` int(11) DEFAULT NULL, + `skin` longtext DEFAULT NULL, + `status` longtext DEFAULT NULL, + `is_dead` tinyint(1) DEFAULT 0, + `id` int(11) NOT NULL, + `last_property` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_licenses` +-- + +CREATE TABLE `user_licenses` ( + `id` int(11) NOT NULL, + `type` varchar(60) NOT NULL, + `owner` varchar(60) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `user_parkings` +-- + +CREATE TABLE `user_parkings` ( + `id` int(11) NOT NULL, + `identifier` varchar(60) DEFAULT NULL, + `garage` varchar(60) DEFAULT NULL, + `zone` int(11) NOT NULL, + `vehicle` longtext DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `vehicles` +-- + +CREATE TABLE `vehicles` ( + `name` varchar(60) NOT NULL, + `model` varchar(60) NOT NULL, + `price` int(11) NOT NULL, + `category` varchar(60) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `vehicles` +-- + +INSERT INTO `vehicles` (`name`, `model`, `price`, `category`) VALUES +('Adder', 'adder', 900000, 'super'), +('Akuma', 'AKUMA', 7500, 'motorcycles'), +('Alpha', 'alpha', 60000, 'sports'), +('Ardent', 'ardent', 1150000, 'sportsclassics'), +('Asea', 'asea', 5500, 'sedans'), +('Autarch', 'autarch', 1955000, 'super'), +('Avarus', 'avarus', 18000, 'motorcycles'), +('Bagger', 'bagger', 13500, 'motorcycles'), +('Baller', 'baller2', 40000, 'suvs'), +('Baller Sport', 'baller3', 60000, 'suvs'), +('Banshee', 'banshee', 70000, 'sports'), +('Banshee 900R', 'banshee2', 255000, 'super'), +('Bati 801', 'bati', 12000, 'motorcycles'), +('Bati 801RR', 'bati2', 19000, 'motorcycles'), +('Bestia GTS', 'bestiagts', 55000, 'sports'), +('BF400', 'bf400', 6500, 'motorcycles'), +('Bf Injection', 'bfinjection', 16000, 'offroad'), +('Bifta', 'bifta', 12000, 'offroad'), +('Bison', 'bison', 45000, 'vans'), +('Blade', 'blade', 15000, 'muscle'), +('Blazer', 'blazer', 6500, 'offroad'), +('Blazer Sport', 'blazer4', 8500, 'offroad'), +('blazer5', 'blazer5', 1755600, 'offroad'), +('Blista', 'blista', 8000, 'compacts'), +('BMX (velo)', 'bmx', 160, 'motorcycles'), +('Bobcat XL', 'bobcatxl', 32000, 'vans'), +('Brawler', 'brawler', 45000, 'offroad'), +('Brioso R/A', 'brioso', 18000, 'compacts'), +('Btype', 'btype', 62000, 'sportsclassics'), +('Btype Hotroad', 'btype2', 155000, 'sportsclassics'), +('Btype Luxe', 'btype3', 85000, 'sportsclassics'), +('Buccaneer', 'buccaneer', 18000, 'muscle'), +('Buccaneer Rider', 'buccaneer2', 24000, 'muscle'), +('Buffalo', 'buffalo', 12000, 'sports'), +('Buffalo S', 'buffalo2', 20000, 'sports'), +('Bullet', 'bullet', 90000, 'super'), +('Burrito', 'burrito3', 19000, 'vans'), +('Camper', 'camper', 42000, 'vans'), +('Carbonizzare', 'carbonizzare', 75000, 'sports'), +('Carbon RS', 'carbonrs', 18000, 'motorcycles'), +('Casco', 'casco', 30000, 'sportsclassics'), +('Cavalcade', 'cavalcade2', 55000, 'suvs'), +('Cheetah', 'cheetah', 375000, 'super'), +('Chimera', 'chimera', 38000, 'motorcycles'), +('Chino', 'chino', 15000, 'muscle'), +('Chino Luxe', 'chino2', 19000, 'muscle'), +('Cliffhanger', 'cliffhanger', 9500, 'motorcycles'), +('Cognoscenti Cabrio', 'cogcabrio', 55000, 'coupes'), +('Cognoscenti', 'cognoscenti', 55000, 'sedans'), +('Comet', 'comet2', 65000, 'sports'), +('Comet 5', 'comet5', 1145000, 'sports'), +('Contender', 'contender', 70000, 'suvs'), +('Coquette', 'coquette', 65000, 'sports'), +('Coquette Classic', 'coquette2', 40000, 'sportsclassics'), +('Coquette BlackFin', 'coquette3', 55000, 'muscle'), +('Cruiser (velo)', 'cruiser', 510, 'motorcycles'), +('Cyclone', 'cyclone', 1890000, 'super'), +('Daemon', 'daemon', 11500, 'motorcycles'), +('Daemon High', 'daemon2', 13500, 'motorcycles'), +('Defiler', 'defiler', 9800, 'motorcycles'), +('Deluxo', 'deluxo', 4721500, 'sportsclassics'), +('Dominator', 'dominator', 35000, 'muscle'), +('Double T', 'double', 28000, 'motorcycles'), +('Dubsta', 'dubsta', 45000, 'suvs'), +('Dubsta Luxuary', 'dubsta2', 60000, 'suvs'), +('Bubsta 6x6', 'dubsta3', 120000, 'offroad'), +('Dukes', 'dukes', 28000, 'muscle'), +('Dune Buggy', 'dune', 8000, 'offroad'), +('Elegy', 'elegy2', 38500, 'sports'), +('Emperor', 'emperor', 8500, 'sedans'), +('Enduro', 'enduro', 5500, 'motorcycles'), +('Entity XF', 'entityxf', 425000, 'super'), +('Esskey', 'esskey', 4200, 'motorcycles'), +('Exemplar', 'exemplar', 32000, 'coupes'), +('F620', 'f620', 40000, 'coupes'), +('Faction', 'faction', 20000, 'muscle'), +('Faction Rider', 'faction2', 30000, 'muscle'), +('Faction XL', 'faction3', 40000, 'muscle'), +('Faggio', 'faggio', 1900, 'motorcycles'), +('Vespa', 'faggio2', 2800, 'motorcycles'), +('Felon', 'felon', 42000, 'coupes'), +('Felon GT', 'felon2', 55000, 'coupes'), +('Feltzer', 'feltzer2', 55000, 'sports'), +('Stirling GT', 'feltzer3', 65000, 'sportsclassics'), +('Fixter (velo)', 'fixter', 225, 'motorcycles'), +('FMJ', 'fmj', 185000, 'super'), +('Fhantom', 'fq2', 17000, 'suvs'), +('Fugitive', 'fugitive', 12000, 'sedans'), +('Furore GT', 'furoregt', 45000, 'sports'), +('Fusilade', 'fusilade', 40000, 'sports'), +('Gargoyle', 'gargoyle', 16500, 'motorcycles'), +('Gauntlet', 'gauntlet', 30000, 'muscle'), +('Gang Burrito', 'gburrito', 45000, 'vans'), +('Burrito', 'gburrito2', 29000, 'vans'), +('Glendale', 'glendale', 6500, 'sedans'), +('Grabger', 'granger', 50000, 'suvs'), +('Gresley', 'gresley', 47500, 'suvs'), +('GT 500', 'gt500', 785000, 'sportsclassics'), +('Guardian', 'guardian', 45000, 'offroad'), +('Hakuchou', 'hakuchou', 31000, 'motorcycles'), +('Hakuchou Sport', 'hakuchou2', 55000, 'motorcycles'), +('Hermes', 'hermes', 535000, 'muscle'), +('Hexer', 'hexer', 12000, 'motorcycles'), +('Hotknife', 'hotknife', 125000, 'muscle'), +('Huntley S', 'huntley', 40000, 'suvs'), +('Hustler', 'hustler', 625000, 'muscle'), +('Infernus', 'infernus', 180000, 'super'), +('Innovation', 'innovation', 23500, 'motorcycles'), +('Intruder', 'intruder', 7500, 'sedans'), +('Issi', 'issi2', 10000, 'compacts'), +('Jackal', 'jackal', 38000, 'coupes'), +('Jester', 'jester', 65000, 'sports'), +('Jester(Racecar)', 'jester2', 135000, 'sports'), +('Journey', 'journey', 6500, 'vans'), +('Kamacho', 'kamacho', 345000, 'offroad'), +('Khamelion', 'khamelion', 38000, 'sports'), +('Kuruma', 'kuruma', 30000, 'sports'), +('Landstalker', 'landstalker', 35000, 'suvs'), +('RE-7B', 'le7b', 325000, 'super'), +('Lynx', 'lynx', 40000, 'sports'), +('Mamba', 'mamba', 70000, 'sports'), +('Manana', 'manana', 12800, 'sportsclassics'), +('Manchez', 'manchez', 5300, 'motorcycles'), +('Massacro', 'massacro', 65000, 'sports'), +('Massacro(Racecar)', 'massacro2', 130000, 'sports'), +('Mesa', 'mesa', 16000, 'suvs'), +('Mesa Trail', 'mesa3', 40000, 'suvs'), +('Minivan', 'minivan', 13000, 'vans'), +('Monroe', 'monroe', 55000, 'sportsclassics'), +('The Liberator', 'monster', 210000, 'offroad'), +('Moonbeam', 'moonbeam', 18000, 'vans'), +('Moonbeam Rider', 'moonbeam2', 35000, 'vans'), +('Nemesis', 'nemesis', 5800, 'motorcycles'), +('Neon', 'neon', 1500000, 'sports'), +('Nightblade', 'nightblade', 35000, 'motorcycles'), +('Nightshade', 'nightshade', 65000, 'muscle'), +('9F', 'ninef', 65000, 'sports'), +('9F Cabrio', 'ninef2', 80000, 'sports'), +('Omnis', 'omnis', 35000, 'sports'), +('Oppressor', 'oppressor', 3524500, 'super'), +('Oracle XS', 'oracle2', 35000, 'coupes'), +('Osiris', 'osiris', 160000, 'super'), +('Panto', 'panto', 10000, 'compacts'), +('Paradise', 'paradise', 19000, 'vans'), +('Pariah', 'pariah', 1420000, 'sports'), +('Patriot', 'patriot', 55000, 'suvs'), +('PCJ-600', 'pcj', 6200, 'motorcycles'), +('Penumbra', 'penumbra', 28000, 'sports'), +('Pfister', 'pfister811', 85000, 'super'), +('Phoenix', 'phoenix', 12500, 'muscle'), +('Picador', 'picador', 18000, 'muscle'), +('Pigalle', 'pigalle', 20000, 'sportsclassics'), +('Prairie', 'prairie', 12000, 'compacts'), +('Premier', 'premier', 8000, 'sedans'), +('Primo Custom', 'primo2', 14000, 'sedans'), +('X80 Proto', 'prototipo', 2500000, 'super'), +('Radius', 'radi', 29000, 'suvs'), +('raiden', 'raiden', 1375000, 'sports'), +('Rapid GT', 'rapidgt', 35000, 'sports'), +('Rapid GT Convertible', 'rapidgt2', 45000, 'sports'), +('Rapid GT3', 'rapidgt3', 885000, 'sportsclassics'), +('Reaper', 'reaper', 150000, 'super'), +('Rebel', 'rebel2', 35000, 'offroad'), +('Regina', 'regina', 5000, 'sedans'), +('Retinue', 'retinue', 615000, 'sportsclassics'), +('Revolter', 'revolter', 1610000, 'sports'), +('riata', 'riata', 380000, 'offroad'), +('Rocoto', 'rocoto', 45000, 'suvs'), +('Ruffian', 'ruffian', 6800, 'motorcycles'), +('Ruiner 2', 'ruiner2', 5745600, 'muscle'), +('Rumpo', 'rumpo', 15000, 'vans'), +('Rumpo Trail', 'rumpo3', 19500, 'vans'), +('Sabre Turbo', 'sabregt', 20000, 'muscle'), +('Sabre GT', 'sabregt2', 25000, 'muscle'), +('Sanchez', 'sanchez', 5300, 'motorcycles'), +('Sanchez Sport', 'sanchez2', 5300, 'motorcycles'), +('Sanctus', 'sanctus', 25000, 'motorcycles'), +('Sandking', 'sandking', 55000, 'offroad'), +('Savestra', 'savestra', 990000, 'sportsclassics'), +('SC 1', 'sc1', 1603000, 'super'), +('Schafter', 'schafter2', 25000, 'sedans'), +('Schafter V12', 'schafter3', 50000, 'sports'), +('Scorcher (velo)', 'scorcher', 280, 'motorcycles'), +('Seminole', 'seminole', 25000, 'suvs'), +('Sentinel', 'sentinel', 32000, 'coupes'), +('Sentinel XS', 'sentinel2', 40000, 'coupes'), +('Sentinel3', 'sentinel3', 650000, 'sports'), +('Seven 70', 'seven70', 39500, 'sports'), +('ETR1', 'sheava', 220000, 'super'), +('Shotaro Concept', 'shotaro', 320000, 'motorcycles'), +('Slam Van', 'slamvan3', 11500, 'muscle'), +('Sovereign', 'sovereign', 22000, 'motorcycles'), +('Stinger', 'stinger', 80000, 'sportsclassics'), +('Stinger GT', 'stingergt', 75000, 'sportsclassics'), +('Streiter', 'streiter', 500000, 'sports'), +('Stretch', 'stretch', 90000, 'sedans'), +('Stromberg', 'stromberg', 3185350, 'sports'), +('Sultan', 'sultan', 15000, 'sports'), +('Sultan RS', 'sultanrs', 65000, 'super'), +('Super Diamond', 'superd', 130000, 'sedans'), +('Surano', 'surano', 50000, 'sports'), +('Surfer', 'surfer', 12000, 'vans'), +('T20', 't20', 300000, 'super'), +('Tailgater', 'tailgater', 30000, 'sedans'), +('Tampa', 'tampa', 16000, 'muscle'), +('Drift Tampa', 'tampa2', 80000, 'sports'), +('Thrust', 'thrust', 24000, 'motorcycles'), +('Tri bike (velo)', 'tribike3', 520, 'motorcycles'), +('Trophy Truck', 'trophytruck', 60000, 'offroad'), +('Trophy Truck Limited', 'trophytruck2', 80000, 'offroad'), +('Tropos', 'tropos', 40000, 'sports'), +('Turismo R', 'turismor', 350000, 'super'), +('Tyrus', 'tyrus', 600000, 'super'), +('Vacca', 'vacca', 120000, 'super'), +('Vader', 'vader', 7200, 'motorcycles'), +('Verlierer', 'verlierer2', 70000, 'sports'), +('Vigero', 'vigero', 12500, 'muscle'), +('Virgo', 'virgo', 14000, 'muscle'), +('Viseris', 'viseris', 875000, 'sportsclassics'), +('Visione', 'visione', 2250000, 'super'), +('Voltic', 'voltic', 90000, 'super'), +('Voltic 2', 'voltic2', 3830400, 'super'), +('Voodoo', 'voodoo', 7200, 'muscle'), +('Vortex', 'vortex', 9800, 'motorcycles'), +('Warrener', 'warrener', 4000, 'sedans'), +('Washington', 'washington', 9000, 'sedans'), +('Windsor', 'windsor', 95000, 'coupes'), +('Windsor Drop', 'windsor2', 125000, 'coupes'), +('Woflsbane', 'wolfsbane', 9000, 'motorcycles'), +('XLS', 'xls', 32000, 'suvs'), +('Yosemite', 'yosemite', 485000, 'muscle'), +('Youga', 'youga', 10800, 'vans'), +('Youga Luxuary', 'youga2', 14500, 'vans'), +('Z190', 'z190', 900000, 'sportsclassics'), +('Zentorno', 'zentorno', 1500000, 'super'), +('Zion', 'zion', 36000, 'coupes'), +('Zion Cabrio', 'zion2', 45000, 'coupes'), +('Zombie', 'zombiea', 9500, 'motorcycles'), +('Zombie Luxuary', 'zombieb', 12000, 'motorcycles'), +('Z-Type', 'ztype', 220000, 'sportsclassics'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `vehicle_categories` +-- + +CREATE TABLE `vehicle_categories` ( + `name` varchar(60) NOT NULL, + `label` varchar(60) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `vehicle_categories` +-- + +INSERT INTO `vehicle_categories` (`name`, `label`) VALUES +('compacts', 'Compacts'), +('coupes', 'Coupés'), +('motorcycles', 'Motos'), +('muscle', 'Muscle'), +('offroad', 'Off Road'), +('sedans', 'Sedans'), +('sports', 'Sports'), +('sportsclassics', 'Sports Classics'), +('super', 'Super'), +('suvs', 'SUVs'), +('vans', 'Vans'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `vehicle_sold` +-- + +CREATE TABLE `vehicle_sold` ( + `client` varchar(50) NOT NULL, + `model` varchar(50) NOT NULL, + `plate` varchar(50) NOT NULL, + `soldby` varchar(50) NOT NULL, + `date` varchar(50) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `weashops` +-- + +CREATE TABLE `weashops` ( + `id` int(11) NOT NULL, + `zone` varchar(255) NOT NULL, + `item` varchar(255) NOT NULL, + `price` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `weashops` +-- + +INSERT INTO `weashops` (`id`, `zone`, `item`, `price`) VALUES +(1, 'GunShop', 'WEAPON_PISTOL', 300), +(2, 'BlackWeashop', 'WEAPON_PISTOL', 500), +(3, 'GunShop', 'WEAPON_FLASHLIGHT', 60), +(4, 'BlackWeashop', 'WEAPON_FLASHLIGHT', 70), +(5, 'GunShop', 'WEAPON_MACHETE', 90), +(6, 'BlackWeashop', 'WEAPON_MACHETE', 110), +(7, 'GunShop', 'WEAPON_NIGHTSTICK', 150), +(8, 'BlackWeashop', 'WEAPON_NIGHTSTICK', 150), +(9, 'GunShop', 'WEAPON_BAT', 100), +(10, 'BlackWeashop', 'WEAPON_BAT', 100), +(11, 'GunShop', 'WEAPON_STUNGUN', 50), +(12, 'BlackWeashop', 'WEAPON_STUNGUN', 50), +(13, 'GunShop', 'WEAPON_MICROSMG', 1400), +(14, 'BlackWeashop', 'WEAPON_MICROSMG', 1700), +(15, 'GunShop', 'WEAPON_PUMPSHOTGUN', 3400), +(16, 'BlackWeashop', 'WEAPON_PUMPSHOTGUN', 3500), +(17, 'GunShop', 'WEAPON_ASSAULTRIFLE', 10000), +(18, 'BlackWeashop', 'WEAPON_ASSAULTRIFLE', 11000), +(19, 'GunShop', 'WEAPON_SPECIALCARBINE', 15000), +(20, 'BlackWeashop', 'WEAPON_SPECIALCARBINE', 16500), +(21, 'GunShop', 'WEAPON_SNIPERRIFLE', 22000), +(22, 'BlackWeashop', 'WEAPON_SNIPERRIFLE', 24000), +(23, 'GunShop', 'WEAPON_FIREWORK', 18000), +(24, 'BlackWeashop', 'WEAPON_FIREWORK', 20000), +(25, 'GunShop', 'WEAPON_GRENADE', 500), +(26, 'BlackWeashop', 'WEAPON_GRENADE', 650), +(27, 'GunShop', 'WEAPON_BZGAS', 200), +(28, 'BlackWeashop', 'WEAPON_BZGAS', 350), +(29, 'GunShop', 'WEAPON_FIREEXTINGUISHER', 100), +(30, 'BlackWeashop', 'WEAPON_FIREEXTINGUISHER', 100), +(31, 'GunShop', 'WEAPON_BALL', 50), +(32, 'BlackWeashop', 'WEAPON_BALL', 50), +(33, 'GunShop', 'WEAPON_SMOKEGRENADE', 100), +(34, 'BlackWeashop', 'WEAPON_SMOKEGRENADE', 100), +(35, 'BlackWeashop', 'WEAPON_APPISTOL', 1100), +(36, 'BlackWeashop', 'WEAPON_CARBINERIFLE', 12000), +(37, 'BlackWeashop', 'WEAPON_HEAVYSNIPER', 30000), +(38, 'BlackWeashop', 'WEAPON_MINIGUN', 45000), +(39, 'BlackWeashop', 'WEAPON_RAILGUN', 50000), +(40, 'BlackWeashop', 'WEAPON_STICKYBOMB', 500); + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `addon_account` +-- +ALTER TABLE `addon_account` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `user_parkings` +-- +ALTER TABLE `user_parkings` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `addon_account_data` +-- +ALTER TABLE `addon_account_data` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `index_addon_account_data_account_name_owner` (`account_name`,`owner`), + ADD KEY `index_addon_account_data_account_name` (`account_name`); + +-- +-- Indexes for table `addon_inventory` +-- +ALTER TABLE `addon_inventory` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `addon_inventory_items` +-- +ALTER TABLE `addon_inventory_items` + ADD PRIMARY KEY (`id`), + ADD KEY `index_addon_inventory_items_inventory_name_name` (`inventory_name`,`name`), + ADD KEY `index_addon_inventory_items_inventory_name_name_owner` (`inventory_name`,`name`,`owner`), + ADD KEY `index_addon_inventory_inventory_name` (`inventory_name`); + +-- +-- Indexes for table `billing` +-- +ALTER TABLE `billing` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `cardealer_vehicles` +-- +ALTER TABLE `cardealer_vehicles` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `datastore` +-- +ALTER TABLE `datastore` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `datastore_data` +-- +ALTER TABLE `datastore_data` + ADD PRIMARY KEY (`id`), + ADD UNIQUE KEY `index_datastore_data_name_owner` (`name`,`owner`), + ADD KEY `index_datastore_data_name` (`name`); + +-- +-- Indexes for table `items` +-- +ALTER TABLE `items` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `jobs` +-- +ALTER TABLE `jobs` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `job_grades` +-- +ALTER TABLE `job_grades` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `licenses` +-- +ALTER TABLE `licenses` + ADD PRIMARY KEY (`type`); + +-- + +-- +-- Indexes for table `owned_properties` +-- +ALTER TABLE `owned_properties` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `owned_vehicles` +-- +ALTER TABLE `owned_vehicles` + ADD PRIMARY KEY (`plate`); + +-- +-- Indexes for table `properties` +-- +ALTER TABLE `properties` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `rented_vehicles` +-- +ALTER TABLE `rented_vehicles` + ADD PRIMARY KEY (`plate`); + +-- +-- Indexes for table `society_moneywash` +-- +ALTER TABLE `society_moneywash` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`identifier`), + ADD UNIQUE KEY `id` (`id`); + +-- +-- Indexes for table `user_licenses` +-- +ALTER TABLE `user_licenses` + ADD PRIMARY KEY (`id`); + +-- +-- Indexes for table `vehicle_categories` +-- +ALTER TABLE `vehicle_categories` + ADD PRIMARY KEY (`name`); + +-- +-- Indexes for table `vehicle_sold` +-- +ALTER TABLE `vehicle_sold` + ADD PRIMARY KEY (`plate`); + +-- +-- Indexes for table `weashops` +-- +ALTER TABLE `weashops` + ADD PRIMARY KEY (`id`); + +-- +-- AUTO_INCREMENT for table `addon_account_data` +-- +ALTER TABLE `addon_account_data` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9; + +-- +-- AUTO_INCREMENT for table `addon_inventory_items` +-- +ALTER TABLE `addon_inventory_items` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `billing` +-- +ALTER TABLE `billing` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `cardealer_vehicles` +-- +ALTER TABLE `cardealer_vehicles` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `datastore_data` +-- +ALTER TABLE `datastore_data` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; + +-- +-- AUTO_INCREMENT for table `job_grades` +-- +ALTER TABLE `job_grades` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=36; + +-- +-- AUTO_INCREMENT for table `owned_properties` +-- +ALTER TABLE `owned_properties` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `properties` +-- +ALTER TABLE `properties` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=73; + +-- +-- AUTO_INCREMENT for table `society_moneywash` +-- +ALTER TABLE `society_moneywash` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `users` +-- +ALTER TABLE `users` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; + +-- +-- AUTO_INCREMENT for table `user_licenses` +-- +ALTER TABLE `user_licenses` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `user_parkings` +-- +ALTER TABLE `user_parkings` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT for table `weashops` +-- +ALTER TABLE `weashops` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41; + +-- +-- ESX Phone +-- +CREATE TABLE `user_contacts` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `identifier` VARCHAR(60) NOT NULL, + `name` VARCHAR(100) NOT NULL, + `number` INT(11) NOT NULL, + + PRIMARY KEY (`id`), + INDEX `index_user_contacts_identifier_name_number` (`identifier`, `name`, `number`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + + +ALTER TABLE `users` + ADD COLUMN `phone_number` INT(11) NULL, + ADD UNIQUE INDEX `index_users_phone_number` (`phone_number`); + +-- +-- Fine Types +-- + CREATE TABLE `fine_types` ( + `id` int NOT NULL AUTO_INCREMENT, + `label` varchar(255) DEFAULT NULL, + `amount` int DEFAULT NULL, + `category` int DEFAULT NULL, + + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `fine_types` (label, amount, category) VALUES + ('Misuse of a horn', 30, 0), + ('Illegally Crossing a continuous Line', 40, 0), + ('Driving on the wrong side of the road', 250, 0), + ('Illegal U-Turn', 250, 0), + ('Illegally Driving Off-road', 170, 0), + ('Refusing a Lawful Command', 30, 0), + ('Illegally Stopping a Vehicle', 150, 0), + ('Illegal Parking', 70, 0), + ('Failing to Yield to the right', 70, 0), + ('Failure to comply with Vehicle Information', 90, 0), + ('Failing to stop at a Stop Sign ', 105, 0), + ('Failing to stop at a Red Light', 130, 0), + ('Illegal Passing', 100, 0), + ('Driving an illegal Vehicle', 100, 0), + ('Driving without a License', 1500, 0), + ('Hit and Run', 800, 0), + ('Exceeding Speeds Over < 5 mph', 90, 0), + ('Exceeding Speeds Over 5-15 mph', 120, 0), + ('Exceeding Speeds Over 15-30 mph', 180, 0), + ('Exceeding Speeds Over > 30 mph', 300, 0), + ('Impeding traffic flow', 110, 1), + ('Public Intoxication', 90, 1), + ('Disorderly conduct', 90, 1), + ('Obstruction of Justice', 130, 1), + ('Insults towards Civilans', 75, 1), + ('Disrespecting of an LEO', 110, 1), + ('Verbal Threat towards a Civilan', 90, 1), + ('Verbal Threat towards an LEO', 150, 1), + ('Providing False Information', 250, 1), + ('Attempt of Corruption', 1500, 1), + ('Brandishing a weapon in city Limits', 120, 2), + ('Brandishing a Lethal Weapon in city Limits', 300, 2), + ('No Firearms License', 600, 2), + ('Possession of an Illegal Weapon', 700, 2), + ('Possession of Burglary Tools', 300, 2), + ('Grand Theft Auto', 1800, 2), + ('Intent to Sell/Distrube of an illegal Substance', 1500, 2), + ('Frabrication of an Illegal Substance', 1500, 2), + ('Possession of an Illegal Substance ', 650, 2), + ('Kidnapping of a Civilan', 1500, 2), + ('Kidnapping of an LEO', 2000, 2), + ('Robbery', 650, 2), + ('Armed Robbery of a Store', 650, 2), + ('Armed Robbery of a Bank', 1500, 2), + ('Assault on a Civilian', 2000, 3), + ('Assault of an LEO', 2500, 3), + ('Attempt of Murder of a Civilian', 3000, 3), + ('Attempt of Murder of an LEO', 5000, 3), + ('Murder of a Civilian', 10000, 3), + ('Murder of an LEO', 30000, 3), + ('Involuntary manslaughter', 1800, 3), + ('Fraud', 2000, 2); diff --git a/[esx]/async/LICENSE b/[esx]/async/LICENSE index 3ca99747..4c37e893 100644 --- a/[esx]/async/LICENSE +++ b/[esx]/async/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. async - Copyright (C) 2015-2021 Jérémie N'gadi + Copyright (C) 2015-2022 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - async Copyright (C) 2015-2021 Jérémie N'gadi + async Copyright (C) 2015-2022 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[esx]/cron/LICENSE b/[esx]/cron/LICENSE index 29cc4574..0f8d5811 100644 --- a/[esx]/cron/LICENSE +++ b/[esx]/cron/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. cron - Copyright (C) 2015-2021 Jérémie N'gadi + Copyright (C) 2015-2022 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - cron Copyright (C) 2015-2021 Jérémie N'gadi + cron Copyright (C) 2015-2022 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[esx]/cron/README.md b/[esx]/cron/README.md index ed1e3bda..a9489046 100644 --- a/[esx]/cron/README.md +++ b/[esx]/cron/README.md @@ -43,7 +43,7 @@ TriggerEvent('cron:runAt', 18, 30, CronTask) ### License cron - do stuff in a specified time -Copyright (C) 2015-2021 Jérémie N'gadi +Copyright (C) 2015-2022 Jérémie N'gadi This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/[esx]/es_extended/LICENSE b/[esx]/es_extended/LICENSE index e7ea8b0e..53bf50d0 100644 --- a/[esx]/es_extended/LICENSE +++ b/[esx]/es_extended/LICENSE @@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. es_extended - Copyright (C) 2015-2021 Jérémie N'gadi + Copyright (C) 2015-2022 Jérémie N'gadi This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - es_extended Copyright (C) 2015-2021 Jérémie N'gadi + es_extended Copyright (C) 2015-2022 Jérémie N'gadi This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/[esx]/es_extended/README.md b/[esx]/es_extended/README.md deleted file mode 100644 index 726aba2d..00000000 --- a/[esx]/es_extended/README.md +++ /dev/null @@ -1,102 +0,0 @@ -
Development Discord - Website - Support Discord
-
-
-##### ESX is the most popular framework for creating economy-based roleplay servers on FiveM, with many official and community resources designed to utilise the tools provided here. For a taste of what's available:
-> esx_identity: Enables character registration defining a players name, sex, height, and date of birth
-
-> esx_society: Allows job resources to register a society, gaining employee management, society funds, and more
-
-> esx_billing: Allows members of some societies to send fines or bills to other players
-
-> esx_vehicleshop: Allow players to purchase vehicles from a dealership, or setup society support for a player-managed dealership
-
-> esx_ambulancejob: Adds a death and respawn system while allowing players to work as EMS to heal and revive others
-
-Many more resources are included in this repository, or you can browse the [ESX Community Github](https://github.com/esx-community/) or [Cfx.re Releases board](https://forum.cfx.re/tag/esx) for more.
-
-### Information
-##### Legacy provides some necessary bug-fixes and improvements to optimise the framework before reaching the end of official support by the development team.
-##### Most resources designed for 1.2 will have no issues with Legacy, notable exceptions are those which modify spawning/loading behaviour. There are several minor feature updates which do not impact compatibility with old resources.
-##### NOTE: The loadouts system in ESX has always been problematic, and fixing it would require a complete overhaul. Your best option is to use a resource that handles weapons as items.
-
-#### Optimisation
-- Utilise compile-time jenkins hashing over the GetHashKey native
-- Update old MySQL queries to use MySQL.store to improve performance, especially during player saving
-- Several loops will now sleep when their tasks are not necessary to perform
-- Improved support when using ESX Identity to reduce events and queries during player login
-- Support for the latest weapons and components
-
-#### Features
-- Integrated support for identity data
-- Integrated commands from esx_adminplus
-- All players will be saved immediately before a txAdmin scheduled restart
-- Detect if a player is new and send the result to the playerLoaded event
-- Support for players logging out when using multicharacter resources
-- Cache the players ped id and death state in ESX.PlayerData
-- Added an imports file (similar to locales.lua) for setting up events and functions in other resources
- - Before defining all manifest script files, add `shared_script '@es_extended/imports.lua'`
- - Automatically retrieve the ESX object, removing the need to send a callback event on both the client and server
- - Ensures current information is always returned when using `ESX.PlayerData` (except loadout and inventory)
-- Spawnmanager is being utilised to correctly handle player spawns
- - Potential conflicts with some third-party resources that do not expect spawnmanager
-- Added an improved function when performing xPlayer loops to prevent large server hitches
- - Using `ESX.GetExtendedPlayers()` instead of `ESX.GetPlayers()`
- - You can use arguments with the new function as well, such as
- - ESX.GetExtendedPlayers('job', 'police')
- - ESX.GetExtendedPlayers('group', 'admin')
-
-#### Fixes
-- ESX.Jobs table is populated after all jobs are setup, allowing other resources to retrieve it if needed
-- All weapons are properly removed when using the clearloadout command
-##### For creating or updating resources refer to the [updated boilerplate](/esx_example).
-
-### 1.2 Features
-- Weight based inventory system
-- Weapons support, including support for attachments and tints
-- Supports different money accounts (defaulted with cash, bank and black money)
-- Many official resources available in our GitHub
-- Job system, with grades and clothes support
-- Supports multiple languages, most strings are localized
-- Easy to use API for developers to easily integrate ESX to their projects
-- Register your own commands easily, with argument validation, chat suggestion and using FXServer ACL
-
-### Requirements
-- All resources from the `core` folder
-- [spawnmanager](https://github.com/citizenfx/cfx-server-data)
-- [mysql-async](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2)
-
-
-### Installation
-- Download files to the resources folder and, if desired, prepare directories for organisation (i.e. resources/[core]/es_extended)
-- Import `es_extended.sql` in your database
-- Import any other sql files for the resources you are using
-- Ensure all resources config files have been adjusted for your preferences
-- Use or refer to the included server.cfg for start order and settings
-
-### Conflicts
-* The following resources should not be used with ESX Legacy
- - essentialmode
- - basic-gamemode
- - fivem-map-skater
- - fivem-map-hipster
- - default_spawnpoint
-
-### Information
-ESX was initially developed by Gizz back in 2017 for his friend as the were creating an FiveM server and there wasn't any economy roleplaying frameworks available. The original code was written within a week or two and later open sourced, it has ever since been improved and parts been rewritten to further improve on it.
-- [ESX Documentation](https://esx-framework.github.io/es_extended/)
-- [FiveM Native Reference](https://runtime.fivem.net/doc/reference.html)
-
-
-### Legal
-
-### License
-
-es_extended - ESX framework for FiveM
-
-Copyright (C) 2015-2021 Jérémie N'gadi
-
-This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
-
-This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details.
-
-You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/.
diff --git a/[esx]/es_extended/client/common.lua b/[esx]/es_extended/client/common.lua
index 26c0ed40..441cee8e 100644
--- a/[esx]/es_extended/client/common.lua
+++ b/[esx]/es_extended/client/common.lua
@@ -2,6 +2,6 @@ AddEventHandler('esx:getSharedObject', function(cb)
cb(ESX)
end)
-function getSharedObject()
+exports('getSharedObject', function()
return ESX
-end
+end)
diff --git a/[esx]/es_extended/client/functions.lua b/[esx]/es_extended/client/functions.lua
index acf7a802..cd0e2f09 100644
--- a/[esx]/es_extended/client/functions.lua
+++ b/[esx]/es_extended/client/functions.lua
@@ -1,9 +1,10 @@
ESX = {}
+Core = {}
ESX.PlayerData = {}
ESX.PlayerLoaded = false
-ESX.CurrentRequestId = 0
-ESX.ServerCallbacks = {}
-ESX.TimeoutCallbacks = {}
+Core.CurrentRequestId = 0
+Core.ServerCallbacks = {}
+Core.TimeoutCallbacks = {}
ESX.UI = {}
ESX.UI.HUD = {}
@@ -21,15 +22,15 @@ ESX.Scaleform.Utils = {}
ESX.Streaming = {}
ESX.SetTimeout = function(msec, cb)
- table.insert(ESX.TimeoutCallbacks, {
+ table.insert(Core.TimeoutCallbacks, {
time = GetGameTimer() + msec,
cb = cb
})
- return #ESX.TimeoutCallbacks
+ return #Core.TimeoutCallbacks
end
ESX.ClearTimeout = function(i)
- ESX.TimeoutCallbacks[i] = nil
+ Core.TimeoutCallbacks[i] = nil
end
ESX.IsPlayerLoaded = function()
@@ -86,14 +87,14 @@ ESX.ShowFloatingHelpNotification = function(msg, coords)
end
ESX.TriggerServerCallback = function(name, cb, ...)
- ESX.ServerCallbacks[ESX.CurrentRequestId] = cb
+ Core.ServerCallbacks[Core.CurrentRequestId] = cb
- TriggerServerEvent('esx:triggerServerCallback', name, ESX.CurrentRequestId, ...)
+ TriggerServerEvent('esx:triggerServerCallback', name, Core.CurrentRequestId, ...)
- if ESX.CurrentRequestId < 65535 then
- ESX.CurrentRequestId = ESX.CurrentRequestId + 1
+ if Core.CurrentRequestId < 65535 then
+ Core.CurrentRequestId = Core.CurrentRequestId + 1
else
- ESX.CurrentRequestId = 0
+ Core.CurrentRequestId = 0
end
end
@@ -989,8 +990,8 @@ end
RegisterNetEvent('esx:serverCallback')
AddEventHandler('esx:serverCallback', function(requestId, ...)
- ESX.ServerCallbacks[requestId](...)
- ESX.ServerCallbacks[requestId] = nil
+ Core.ServerCallbacks[requestId](...)
+ Core.ServerCallbacks[requestId] = nil
end)
RegisterNetEvent('esx:showNotification')
@@ -1012,13 +1013,13 @@ end)
Citizen.CreateThread(function()
while true do
local sleep = 100
- if #ESX.TimeoutCallbacks > 0 then
+ if #Core.TimeoutCallbacks > 0 then
local currTime = GetGameTimer()
sleep = 0
- for i=1, #ESX.TimeoutCallbacks, 1 do
- if currTime >= ESX.TimeoutCallbacks[i].time then
- ESX.TimeoutCallbacks[i].cb()
- ESX.TimeoutCallbacks[i] = nil
+ for i=1, #Core.TimeoutCallbacks, 1 do
+ if currTime >= Core.TimeoutCallbacks[i].time then
+ Core.TimeoutCallbacks[i].cb()
+ Core.TimeoutCallbacks[i] = nil
end
end
end
diff --git a/[esx]/es_extended/client/main.lua b/[esx]/es_extended/client/main.lua
index c464139f..2fc87645 100644
--- a/[esx]/es_extended/client/main.lua
+++ b/[esx]/es_extended/client/main.lua
@@ -32,15 +32,14 @@ AddEventHandler('esx:playerLoaded', function(xPlayer, isNew, skin)
}, function()
TriggerServerEvent('esx:onPlayerSpawn')
TriggerEvent('esx:onPlayerSpawn')
- TriggerEvent('playerSpawned') -- compatibility with old scripts
TriggerEvent('esx:restoreLoadout')
+
if isNew then
- if skin.sex == 0 then
- TriggerEvent('skinchanger:loadDefaultModel', true)
- else
- TriggerEvent('skinchanger:loadDefaultModel', false)
- end
- elseif skin then TriggerEvent('skinchanger:loadSkin', skin) end
+ TriggerEvent('skinchanger:loadDefaultModel', skin.sex == 0)
+ elseif skin then
+ TriggerEvent('skinchanger:loadSkin', skin)
+ end
+
TriggerEvent('esx:loadingScreenOff')
ShutdownLoadingScreen()
ShutdownLoadingScreenNui()
@@ -65,7 +64,7 @@ AddEventHandler('esx:playerLoaded', function(xPlayer, isNew, skin)
local gradeLabel = ESX.PlayerData.job.grade_label ~= ESX.PlayerData.job.label and ESX.PlayerData.job.grade_label or ''
if gradeLabel ~= '' then gradeLabel = ' - '..gradeLabel end
-
+
ESX.UI.HUD.RegisterElement('job', #ESX.PlayerData.accounts, 0, jobTpl, {
job_label = ESX.PlayerData.job.label,
grade_label = gradeLabel
@@ -83,10 +82,15 @@ end)
RegisterNetEvent('esx:setMaxWeight')
AddEventHandler('esx:setMaxWeight', function(newMaxWeight) ESX.PlayerData.maxWeight = newMaxWeight end)
-AddEventHandler('esx:onPlayerSpawn', function()
- ESX.SetPlayerData('ped', PlayerPedId())
- ESX.SetPlayerData('dead', false)
-end)
+local function onPlayerSpawn()
+ if ESX.PlayerLoaded then
+ ESX.SetPlayerData('ped', PlayerPedId())
+ ESX.SetPlayerData('dead', false)
+ end
+end
+
+AddEventHandler('playerSpawned', onPlayerSpawn)
+AddEventHandler('esx:onPlayerSpawn', onPlayerSpawn)
AddEventHandler('esx:onPlayerDeath', function()
ESX.SetPlayerData('ped', PlayerPedId())
@@ -235,18 +239,23 @@ end)
RegisterNetEvent('esx:spawnVehicle')
AddEventHandler('esx:spawnVehicle', function(vehicle)
- local model = (type(vehicle) == 'number' and vehicle or GetHashKey(vehicle))
+ ESX.TriggerServerCallback("esx:isUserAdmin", function(admin)
+ if admin then
+ local model = (type(vehicle) == 'number' and vehicle or GetHashKey(vehicle))
- if IsModelInCdimage(model) then
- local playerCoords, playerHeading = GetEntityCoords(ESX.PlayerData.ped), GetEntityHeading(ESX.PlayerData.ped)
+ if IsModelInCdimage(model) then
+ local playerCoords, playerHeading = GetEntityCoords(ESX.PlayerData.ped), GetEntityHeading(ESX.PlayerData.ped)
- ESX.Game.SpawnVehicle(model, playerCoords, playerHeading, function(vehicle)
- TaskWarpPedIntoVehicle(ESX.PlayerData.ped, vehicle, -1)
- end)
- else
- TriggerEvent('chat:addMessage', { args = { '^1SYSTEM', 'Invalid vehicle model.' } })
- end
+ ESX.Game.SpawnVehicle(model, playerCoords, playerHeading, function(vehicle)
+ TaskWarpPedIntoVehicle(ESX.PlayerData.ped, vehicle, -1)
+ end)
+ else
+ TriggerEvent('chat:addMessage', { args = { '^1SYSTEM', 'Invalid vehicle model.' } })
+ end
+ end
+ end)
end)
+
RegisterNetEvent('esx:createPickup')
AddEventHandler('esx:createPickup', function(pickupId, label, coords, type, name, components, tintIndex)
local function setObjectProperties(object)
@@ -282,7 +291,7 @@ end)
RegisterNetEvent('esx:createMissingPickups')
AddEventHandler('esx:createMissingPickups', function(missingPickups)
- for pickupId,pickup in pairs(missingPickups) do
+ for pickupId, pickup in pairs(missingPickups) do
TriggerEvent('esx:createPickup', pickupId, pickup.label, pickup.coords, pickup.type, pickup.name, pickup.components, pickup.tintIndex)
end
end)
@@ -346,13 +355,16 @@ end)
if Config.EnableHud then
Citizen.CreateThread(function()
local isPaused = false
+ local time = 500
while true do
- Citizen.Wait(300)
+ Citizen.Wait(time)
if IsPauseMenuActive() and not isPaused then
+ time = 100
isPaused = true
ESX.UI.HUD.SetDisplay(0.0)
elseif not IsPauseMenuActive() and isPaused then
+ time = 100
isPaused = false
ESX.UI.HUD.SetDisplay(1.0)
end
@@ -488,32 +500,38 @@ end)
RegisterNetEvent("esx:tpm")
AddEventHandler("esx:tpm", function()
- local WaypointHandle = GetFirstBlipInfoId(8)
- if DoesBlipExist(WaypointHandle) then
- local waypointCoords = GetBlipInfoIdCoord(WaypointHandle)
+ ESX.TriggerServerCallback("esx:isUserAdmin", function(admin)
+ if admin then
+ local WaypointHandle = GetFirstBlipInfoId(8)
+ if DoesBlipExist(WaypointHandle) then
+ local waypointCoords = GetBlipInfoIdCoord(WaypointHandle)
- for height = 1, 1000 do
- SetPedCoordsKeepVehicle(ESX.PlayerData.ped, waypointCoords["x"], waypointCoords["y"], height + 0.0)
+ for height = 1, 1000 do
+ SetPedCoordsKeepVehicle(ESX.PlayerData.ped, waypointCoords["x"], waypointCoords["y"], height + 0.0)
- local foundGround, zPos = GetGroundZFor_3dCoord(waypointCoords["x"], waypointCoords["y"], height + 0.0)
+ local foundGround, zPos = GetGroundZFor_3dCoord(waypointCoords["x"], waypointCoords["y"], height + 0.0)
- if foundGround then
- SetPedCoordsKeepVehicle(ESX.PlayerData.ped, waypointCoords["x"], waypointCoords["y"], height + 0.0)
+ if foundGround then
+ SetPedCoordsKeepVehicle(ESX.PlayerData.ped, waypointCoords["x"], waypointCoords["y"], height + 0.0)
break
- end
+ end
Citizen.Wait(5)
- end
+ end
TriggerEvent('chatMessage', "Successfully Teleported")
- else
+ else
TriggerEvent('chatMessage', "No Waypoint Set")
- end
+ end
+ end
+ end)
end)
local noclip = false
RegisterNetEvent("esx:noclip")
AddEventHandler("esx:noclip", function(input)
+ ESX.TriggerServerCallback("esx:isUserAdmin", function(admin)
+ if admin then
local player = PlayerId()
local msg = "disabled"
@@ -528,7 +546,9 @@ AddEventHandler("esx:noclip", function(input)
end
TriggerEvent("chatMessage", "Noclip has been ^2^*" .. msg)
+ end
end)
+end)
local heading = 0
Citizen.CreateThread(function()
diff --git a/[esx]/es_extended/fxmanifest.lua b/[esx]/es_extended/fxmanifest.lua
index 738565d9..3f3c3471 100644
--- a/[esx]/es_extended/fxmanifest.lua
+++ b/[esx]/es_extended/fxmanifest.lua
@@ -8,24 +8,14 @@ version 'legacy'
shared_scripts {
'locale.lua',
- 'locales/de.lua',
- 'locales/br.lua',
- 'locales/fr.lua',
- 'locales/en.lua',
- 'locales/fi.lua',
- 'locales/sv.lua',
- 'locales/pl.lua',
- 'locales/cs.lua',
- 'locales/sc.lua',
- 'locales/tc.lua',
+ 'locales/*.lua',
'config.lua',
'config.weapons.lua',
}
server_scripts {
- '@async/async.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'server/common.lua',
'server/classes/player.lua',
@@ -78,16 +68,7 @@ files {
'html/img/accounts/money.png'
}
-exports {
- 'getSharedObject'
-}
-
-server_exports {
- 'getSharedObject'
-}
-
dependencies {
- 'mysql-async',
- 'async',
+ 'oxmysql',
'spawnmanager',
-}
\ No newline at end of file
+}
diff --git a/[esx]/es_extended/locales/en.lua b/[esx]/es_extended/locales/en.lua
index dd086601..0bbc9b9c 100644
--- a/[esx]/es_extended/locales/en.lua
+++ b/[esx]/es_extended/locales/en.lua
@@ -162,7 +162,7 @@ Locales['en'] = {
-- SMG & LMG
['weapon_assaultsmg'] = 'Assault SMG',
['weapon_combatmg'] = 'Combat MG',
- ['weapon_combatmg'] = 'Combat MG MK2',
+ ['weapon_combatmg_mk2'] = 'Combat MG MK2',
['weapon_combatpdw'] = 'Combat PDW',
['weapon_gusenberg'] = 'Gusenberg Sweeper',
['weapon_machinepistol'] = 'Machine Pistol',
diff --git a/[esx]/es_extended/locales/es.lua b/[esx]/es_extended/locales/es.lua
new file mode 100644
index 00000000..f32814b9
--- /dev/null
+++ b/[esx]/es_extended/locales/es.lua
@@ -0,0 +1,346 @@
+Locales['es'] = {
+ -- Inventory
+ ['inventory'] = 'Inventario %s / %s',
+ ['use'] = 'Usar',
+ ['give'] = 'Dar',
+ ['remove'] = 'Tirar',
+ ['return'] = 'Volver',
+ ['give_to'] = 'Dar a',
+ ['amount'] = 'Cantidad',
+ ['giveammo'] = 'Dar munición',
+ ['amountammo'] = 'Cantidad de munición',
+ ['noammo'] = 'No tienes suficiente munición!',
+ ['gave_item'] = 'Has dado ~y~%sx~s~ ~b~%s~s~ a ~y~%s~s~',
+ ['received_item'] = 'Has recibido ~y~%sx~s~ ~b~%s~s~ de ~b~%s~s~',
+ ['gave_weapon'] = 'Has dado ~b~%s~s~ a ~y~%s~s~',
+ ['gave_weapon_ammo'] = 'Has dado ~o~%sx %s~s~ para ~b~%s~s~ a ~y~%s~s~',
+ ['gave_weapon_withammo'] = 'Has dado ~b~%s~s~ con ~o~%sx %s~s~ a ~y~%s~s~',
+ ['gave_weapon_hasalready'] = '~y~%s~s~ ya tiene un/a ~y~%s~s~',
+ ['gave_weapon_noweapon'] = '~y~%s~s~ no tiene ese arma',
+ ['received_weapon'] = 'Has recibido ~b~%s~s~ de ~b~%s~s~',
+ ['received_weapon_ammo'] = 'Has recibido ~o~%sx %s~s~ para su ~b~%s~s~ de ~b~%s~s~',
+ ['received_weapon_withammo'] = 'Has recibido ~b~%s~s~ con ~o~%sx %s~s~ de ~b~%s~s~',
+ ['received_weapon_hasalready'] = '~b~%s~s~ intentó darle un/a ~y~%s~s~, pero ya tienes uno',
+ ['received_weapon_noweapon'] = '~b~%s~s~ intentó darles munición para un ~y~%s~s~, pero no tiene uno',
+ ['gave_account_money'] = 'Has dado ~g~$%s~s~ (%s) a ~y~%s~s~',
+ ['received_account_money'] = 'Has recibido ~g~$%s~s~ (%s) de ~b~%s~s~',
+ ['amount_invalid'] = 'Cantidad inválida',
+ ['players_nearby'] = 'No hay jugadores cerca',
+ ['ex_inv_lim'] = 'Acción no posible, excediendo el límite de inventario para ~y~%s~s~',
+ ['imp_invalid_quantity'] = 'Acción imposible, cantidad inválida',
+ ['imp_invalid_amount'] = 'Acción imposible, cantidad inválida',
+ ['threw_standard'] = 'Has tirado ~y~%sx~s~ ~b~%s~s~',
+ ['threw_account'] = 'Has tirado ~g~$%s~s~ ~b~%s~s~',
+ ['threw_weapon'] = 'Has tirado ~b~%s~s~',
+ ['threw_weapon_ammo'] = 'Has tirado ~b~%s~s~ con ~o~%sx %s~s~',
+ ['threw_weapon_already'] = 'Ya llevas el mismo arma',
+ ['threw_cannot_pickup'] = 'No puedes recogerlo porque tu inventario está lleno!',
+ ['threw_pickup_prompt'] = 'Pulsa ~y~E~s~ para recoger',
+
+ -- Key mapping
+ ['keymap_showinventory'] = 'Ver Inventario',
+
+ -- Salary related
+ ['received_salary'] = 'Has recibido tu sueldo: ~g~$%s~s~',
+ ['received_help'] = 'Has recibido su cheque de bienestar: ~g~$%s~s~',
+ ['company_nomoney'] = 'La empresa en la que trabajas no tiene dinero para pagar tu sueldo',
+ ['received_paycheck'] = 'Recibió su paga',
+ ['bank'] = 'Banco',
+ ['account_bank'] = 'Banco',
+ ['account_black_money'] = 'Dinero Negro',
+ ['account_money'] = 'Efectivo',
+
+ ['act_imp'] = 'Acción imposible',
+ ['in_vehicle'] = 'No se puede dar nada a alguien en un vehículo',
+
+ -- Commands
+ ['command_car'] = 'Generar un vehiculo',
+ ['command_car_car'] = 'Nombre o hash del vehículo',
+ ['command_cardel'] = 'Eliminar vehículos cercanos',
+ ['command_cardel_radius'] = 'Opcional, eliminar todos los vehículos en el radio especificado',
+ ['command_clear'] = 'Limpiar chat',
+ ['command_clearall'] = 'Limpiar chat para todos los jugadores',
+ ['command_clearinventory'] = 'Limpiar el inventario del jugador',
+ ['command_clearloadout'] = 'Limpiar inventario de un jugador',
+ ['command_giveaccountmoney'] = 'Dar dinero',
+ ['command_giveaccountmoney_account'] = 'Nombre de cuenta válido',
+ ['command_giveaccountmoney_amount'] = 'Cantidad a añadir',
+ ['command_giveaccountmoney_invalid'] = 'Nombre de cuenta inválido',
+ ['command_giveitem'] = 'Dar un objeto a un jugador',
+ ['command_giveitem_item'] = 'Nombre del artículo',
+ ['command_giveitem_count'] = 'Cantidad de articulos',
+ ['command_giveweapon'] = 'Dar un arma a un jugador',
+ ['command_giveweapon_weapon'] = 'Nombre del arma',
+ ['command_giveweapon_ammo'] = 'Cantidad de municion',
+ ['command_giveweapon_hasalready'] = 'El jugador ya tiene esa arma',
+ ['command_giveweaponcomponent'] = 'Dar el componente del arma',
+ ['command_giveweaponcomponent_component'] = 'Nombre del componente',
+ ['command_giveweaponcomponent_invalid'] = 'Componente del arma no válido',
+ ['command_giveweaponcomponent_hasalready'] = 'El jugador ya tiene ese componente del arma',
+ ['command_giveweaponcomponent_missingweapon'] = 'El jugador no tiene esa arma',
+ ['command_save'] = 'Guardar un jugador en la base de datos',
+ ['command_saveall'] = 'Guardar todos los jugadores en la base de datos',
+ ['command_setaccountmoney'] = 'Establecer el dinero de la cuenta para un jugador',
+ ['command_setaccountmoney_amount'] = 'Cantidad de dinero para fijar',
+ ['command_setcoords'] = 'Teletransporte a coordenadas',
+ ['command_setcoords_x'] = 'Eje X',
+ ['command_setcoords_y'] = 'Eje Y',
+ ['command_setcoords_z'] = 'Eje Z',
+ ['command_setjob'] = 'Dar un trabajo a un jugador',
+ ['command_setjob_job'] = 'Nombre del trabajo',
+ ['command_setjob_grade'] = 'Rango del trabajo',
+ ['command_setjob_invalid'] = 'El trabajo, el rango o ambos no son válidos',
+ ['command_setgroup'] = 'Establecer el grupo de un jugador',
+ ['command_setgroup_group'] = 'Nombre del grupo',
+ ['commanderror_argumentmismatch'] = 'error en el recuento de argumentos (pasado %s, deseado %s)',
+ ['commanderror_argumentmismatch_number'] = 'argumento #%s tipo no coincide (cadena pasada, número deseado)',
+ ['commanderror_invaliditem'] = 'Nombre del artículo no válido',
+ ['commanderror_invalidweapon'] = 'Arma inválida',
+ ['commanderror_console'] = 'Ese comando no se puede ejecutar desde la consola',
+ ['commanderror_invalidcommand'] = '^3%s^0 ¡No es un comando válido!',
+ ['commanderror_invalidplayerid'] = 'No hay ningún jugador en línea que coincida con la ID del servidor',
+ ['commandgeneric_playerid'] = 'ID del jugador',
+
+ -- Locale settings
+ ['locale_digit_grouping_symbol'] = ',',
+ ['locale_currency'] = '$%s',
+
+ -- Weapons
+
+ -- Melee
+ ['weapon_dagger'] = 'Daga',
+ ['weapon_bat'] = 'Bate',
+ ['weapon_battleaxe'] = 'Hacha de combate',
+ ['weapon_bottle'] = 'Botella',
+ ['weapon_crowbar'] = 'Palanca',
+ ['weapon_flashlight'] = 'Linterna',
+ ['weapon_golfclub'] = 'Palos de Golf',
+ ['weapon_hammer'] = 'Martillo',
+ ['weapon_hatchet'] = 'Hacha',
+ ['weapon_knife'] = 'Cuchillo',
+ ['weapon_knuckle'] = 'Puños Americanos',
+ ['weapon_machete'] = 'Machete',
+ ['weapon_nightstick'] = 'Porra',
+ ['weapon_wrench'] = 'Llave Inglesa',
+ ['weapon_poolcue'] = 'Taco de Billar',
+ ['weapon_stone_hatchet'] = 'Hacha de Piedra',
+ ['weapon_switchblade'] = 'Navaja',
+
+ -- Handguns
+ ['weapon_appistol'] = 'Pistola AP ',
+ ['weapon_ceramicpistol'] = 'Pistola Corta',
+ ['weapon_combatpistol'] = 'Pistola Combate',
+ ['weapon_doubleaction'] = 'Revólver de Doble Acción',
+ ['weapon_navyrevolver'] = 'Revólver de la Armada',
+ ['weapon_flaregun'] = 'Pistola de Bengalas',
+ ['weapon_gadgetpistol'] = 'Pistola de Perico',
+ ['weapon_heavypistol'] = 'Pistola Pesada',
+ ['weapon_revolver'] = 'Revólver Pesado',
+ ['weapon_revolver_mk2'] = 'Revólver Pesado MK2',
+ ['weapon_marksmanpistol'] = 'Pistola Marksman',
+ ['weapon_pistol'] = 'Pistola',
+ ['weapon_pistol_mk2'] = 'Pistola MK2',
+ ['weapon_pistol50'] = 'Pistola .50',
+ ['weapon_snspistol'] = 'Pistola SNS',
+ ['weapon_snspistol_mk2'] = 'Pistola SNS MK2',
+ ['weapon_stungun'] = 'Tazer',
+ ['weapon_raypistol'] = 'Up-N-Atomizer',
+ ['weapon_vintagepistol'] = 'Pistola Vintage',
+
+ -- Shotguns
+ ['weapon_assaultshotgun'] = 'Escopeta de Asalto',
+ ['weapon_autoshotgun'] = 'Escopeta Automática',
+ ['weapon_bullpupshotgun'] = 'Escopeta Bullpup',
+ ['weapon_combatshotgun'] = 'Escopeta Combate',
+ ['weapon_dbshotgun'] = 'Escopeta de Doble Barril',
+ ['weapon_heavyshotgun'] = 'Escopeta Pesada',
+ ['weapon_musket'] = 'Mosquete',
+ ['weapon_pumpshotgun'] = 'Escopeta de Bombeo',
+ ['weapon_pumpshotgun_mk2'] = 'Escopeta de Bombeo MK2',
+ ['weapon_sawnoffshotgun'] = 'Escopeta Recortada',
+
+ -- SMG & LMG
+ ['weapon_assaultsmg'] = 'Subfusil de Asalto',
+ ['weapon_combatmg'] = 'Ametralladora de Combate',
+ ['weapon_combatmg'] = 'Ametralladora MK2',
+ ['weapon_combatpdw'] = 'Subfusil PDW',
+ ['weapon_gusenberg'] = 'Subfusil de Barril',
+ ['weapon_machinepistol'] = 'Pistola Ametralladora',
+ ['weapon_mg'] = 'Ametralladora',
+ ['weapon_microsmg'] = 'Micro Subfusil',
+ ['weapon_minismg'] = 'Mini Subfusil',
+ ['weapon_smg'] = 'Subfusil',
+ ['weapon_smg_mk2'] = 'Subfusil MK2',
+ ['weapon_raycarbine'] = 'Ametralladora de Rayos',
+
+ -- Rifles
+ ['weapon_advancedrifle'] = 'Rifle Avanzado',
+ ['weapon_assaultrifle'] = 'Rifle de Asalto',
+ ['weapon_assaultrifle_mk2'] = 'Rifle de Asalto MK2',
+ ['weapon_bullpuprifle'] = 'Rifle Bullpup',
+ ['weapon_bullpuprifle_mk2'] = 'Rifle Bullpup MK2',
+ ['weapon_carbinerifle'] = 'Carabina',
+ ['weapon_carbinerifle_mk2'] = 'Carabina MK2',
+ ['weapon_compactrifle'] = 'Rifle Compacto',
+ ['weapon_militaryrifle'] = 'Rifle Militar',
+ ['weapon_specialcarbine'] = 'Carabina Especial',
+ ['weapon_specialcarbine_mk2'] = 'Carabina Especial MK2',
+
+ -- Sniper
+ ['weapon_heavysniper'] = 'Francotirador Pesado',
+ ['weapon_heavysniper_mk2'] = 'Francotirador Pesado MK2',
+ ['weapon_marksmanrifle'] = 'Rifle Marksman',
+ ['weapon_marksmanrifle_mk2'] = 'Rifle Marksman MK2',
+ ['weapon_sniperrifle'] = 'Rifle de Francotirador',
+
+ -- Heavy / Launchers
+ ['weapon_compactlauncher'] = 'Lanzador Compacto',
+ ['weapon_firework'] = 'Lanzador de Fuegos Artificiales',
+ ['weapon_grenadelauncher'] = 'Lanzagranadas',
+ ['weapon_hominglauncher'] = 'Lanzacohetes Guiado',
+ ['weapon_minigun'] = 'Minigun',
+ ['weapon_railgun'] = 'Cañón de riel',
+ ['weapon_rpg'] = 'Lanzador de cohetes',
+ ['weapon_rayminigun'] = 'Minigun de Rayos',
+
+ -- Thrown
+ ['weapon_ball'] = 'Pelota de Beisbol',
+ ['weapon_bzgas'] = 'Gas Pimienta',
+ ['weapon_flare'] = 'Bengala',
+ ['weapon_grenade'] = 'Granada',
+ ['weapon_petrolcan'] = 'Bidon de Gasolina',
+ ['weapon_hazardcan'] = 'Bidón de Gasolina Peligroso',
+ ['weapon_molotov'] = 'Molotov',
+ ['weapon_proxmine'] = 'Mina de Proximidad ',
+ ['weapon_pipebomb'] = 'Bomba de Tubo',
+ ['weapon_snowball'] = 'Bola de nieve',
+ ['weapon_stickybomb'] = 'Bomba Pegajosa',
+ ['weapon_smokegrenade'] = 'Granada de Humo',
+
+ -- Special
+ ['weapon_fireextinguisher'] = 'Extintor',
+ ['weapon_digiscanner'] = 'Escaner Digital',
+ ['weapon_garbagebag'] = 'Bolsa de Basura',
+ ['weapon_handcuffs'] = 'Grilletes',
+ ['gadget_nightvision'] = 'Vision Nocturna',
+ ['gadget_parachute'] = 'Paracaidas',
+
+ -- Weapon Components
+ ['component_knuckle_base'] = 'Modelo Basico',
+ ['component_knuckle_pimp'] = 'el Proxeneta',
+ ['component_knuckle_ballas'] = 'los Ballas',
+ ['component_knuckle_dollar'] = 'el Buscavidas',
+ ['component_knuckle_diamond'] = 'la Roca',
+ ['component_knuckle_hate'] = 'el Hater',
+ ['component_knuckle_love'] = 'el Amante',
+ ['component_knuckle_player'] = 'el Jugador',
+ ['component_knuckle_king'] = 'el Rey',
+ ['component_knuckle_vagos'] = 'los Vagos',
+
+ ['component_luxary_finish'] = 'Acabado de Armas de Lujo',
+
+ ['component_handle_default'] = 'Mango Default',
+ ['component_handle_vip'] = 'Mango VIP',
+ ['component_handle_bodyguard'] = 'Mango de Guardaespaldas',
+
+ ['component_vip_finish'] = 'Acabado VIP',
+ ['component_bodyguard_finish'] = 'Acabado Guardaespaldas',
+
+ ['component_camo_finish'] = 'Camuflaje Digital',
+ ['component_camo_finish2'] = 'Camuflaje Pincelada',
+ ['component_camo_finish3'] = 'Camuflaje Bosque',
+ ['component_camo_finish4'] = 'Camuflaje Calavera',
+ ['component_camo_finish5'] = 'Camuflaje Sessanta Nove',
+ ['component_camo_finish6'] = 'Camuflaje Perseo',
+ ['component_camo_finish7'] = 'Camuflaje Leopardo',
+ ['component_camo_finish8'] = 'Camuflaje Zebra',
+ ['component_camo_finish9'] = 'Camuflaje Geométrico',
+ ['component_camo_finish10'] = 'Camuflaje Boom',
+ ['component_camo_finish11'] = 'Camuflaje Patriotico',
+
+ ['component_camo_slide_finish'] = 'Camuflaje Digital Deslizante',
+ ['component_camo_slide_finish2'] = 'Camuflaje Pincelada Deslizante',
+ ['component_camo_slide_finish3'] = 'Camuflaje Bosque Deslizante',
+ ['component_camo_slide_finish4'] = 'Camuflaje Calavera Deslizante',
+ ['component_camo_slide_finish5'] = 'Camuflaje Sessanta Nove Deslizante',
+ ['component_camo_slide_finish6'] = 'Camuflaje Perseo Deslizante',
+ ['component_camo_slide_finish7'] = 'Camuflaje Leopardo Deslizante',
+ ['component_camo_slide_finish8'] = 'Camuflaje Zebra Deslizante',
+ ['component_camo_slide_finish9'] = 'Camuflaje Geométrico Deslizante',
+ ['component_camo_slide_finish10'] = 'Camuflaje Boom Deslizante',
+ ['component_camo_slide_finish11'] = 'Camuflaje Patriotico Deslizante',
+
+ ['component_clip_default'] = 'Cargador Default',
+ ['component_clip_extended'] = 'Cargador Extendido',
+ ['component_clip_drum'] = 'Cargador Barril',
+ ['component_clip_box'] = 'Caja de Cargador',
+
+ ['component_scope_holo'] = 'Mira Holográfico',
+ ['component_scope_small'] = 'Mira Pequeña',
+ ['component_scope_medium'] = 'Mira Mediana',
+ ['component_scope_large'] = 'Mira Larga',
+ ['component_scope'] = 'Mira',
+ ['component_scope_advanced'] = 'Mira Avanzada',
+ ['component_ironsights'] = 'Mira de Hierro',
+
+ ['component_suppressor'] = 'Supresor',
+ ['component_compensator'] = 'Compensador',
+
+ ['component_muzzle_flat'] = 'Boquilla de Freno Plana',
+ ['component_muzzle_tactical'] = 'Boquilla de Freno Tactica',
+ ['component_muzzle_fat'] = 'Boquilla de Freno Punta Gorda',
+ ['component_muzzle_precision'] = 'Boquilla de Freno de Precision',
+ ['component_muzzle_heavy'] = 'Boquilla de Freno Pesada',
+ ['component_muzzle_slanted'] = 'Boquilla de Freno inclinada',
+ ['component_muzzle_split'] = 'Boquilla de Freno de Puntas Abiertas',
+ ['component_muzzle_squared'] = 'Boquilla de Freno Cuadrada',
+
+ ['component_flashlight'] = 'Linterna',
+ ['component_grip'] = 'Agarre',
+
+ ['component_barrel_default'] = 'Barril Por Defecto',
+ ['component_barrel_heavy'] = 'Barril Pesado',
+
+ ['component_ammo_tracer'] = 'Munición de Rastreo',
+ ['component_ammo_incendiary'] = 'Munición Incendiaria',
+ ['component_ammo_hollowpoint'] = 'Munición de Punta Hueca',
+ ['component_ammo_fmj'] = 'Munición fMJ',
+ ['component_ammo_armor'] = 'Munición Perforante para Blindaje',
+ ['component_ammo_explosive'] = 'Munición Incendiaria Perforadora de Blindajes',
+
+ ['component_shells_default'] = 'Casquillos Por Defecto',
+ ['component_shells_incendiary'] = 'Casquillos Aliento de Dragón',
+ ['component_shells_armor'] = 'Casquillos Perdigones de Acero',
+ ['component_shells_hollowpoint'] = 'Casquillos Punta Hueca',
+ ['component_shells_explosive'] = 'Casquillos Posta Explosiva',
+
+ -- Weapon Ammo
+ ['ammo_rounds'] = 'Redonda/s',
+ ['ammo_shells'] = 'Casquillo/s',
+ ['ammo_charge'] = 'Carga',
+ ['ammo_petrol'] = 'Galones de Combustible',
+ ['ammo_firework'] = 'Fuegos Artificiale/s',
+ ['ammo_rockets'] = 'Cohete/s',
+ ['ammo_grenadelauncher'] = 'Granada/s',
+ ['ammo_grenade'] = 'Granada/s',
+ ['ammo_stickybomb'] = 'Bomba/s',
+ ['ammo_pipebomb'] = 'Bomba/s',
+ ['ammo_smokebomb'] = 'Bomba/s',
+ ['ammo_molotov'] = 'Molotov/s',
+ ['ammo_proxmine'] = 'Mina(s)',
+ ['ammo_bzgas'] = 'Lata(s)',
+ ['ammo_ball'] = 'Bola(s)',
+ ['ammo_snowball'] = 'Bola(s)',
+ ['ammo_flare'] = 'Bengala(s)',
+ ['ammo_flaregun'] = 'Bengala(s)',
+
+ -- Weapon Tints
+ ['tint_default'] = 'Skin Por Defecto',
+ ['tint_green'] = 'Skin Verde',
+ ['tint_gold'] = 'Skin Oro',
+ ['tint_pink'] = 'Skin Rosa',
+ ['tint_army'] = 'Skin Militar',
+ ['tint_lspd'] = 'Skin Azul',
+ ['tint_orange'] = 'Skin Naranja',
+ ['tint_platinum'] = 'Skin Plata',
+}
diff --git a/[esx]/es_extended/server/classes/player.lua b/[esx]/es_extended/server/classes/player.lua
index 148210b4..69f95f70 100644
--- a/[esx]/es_extended/server/classes/player.lua
+++ b/[esx]/es_extended/server/classes/player.lua
@@ -14,7 +14,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory,
self.variables = {}
self.weight = weight
self.maxWeight = Config.MaxWeight
- if Config.Multichar then self.license = 'license'..string.sub(identifier, 6) else self.license = 'license:'..identifier end
+ if Config.Multichar then self.license = 'license'.. identifier:sub(identifier:find(':'), identifier:len()) else self.license = 'license:'..identifier end
ExecuteCommand(('add_principal identifier.%s group.%s'):format(self.license, self.group))
diff --git a/[esx]/es_extended/server/commands.lua b/[esx]/es_extended/server/commands.lua
index cdc668aa..9b2d38e7 100644
--- a/[esx]/es_extended/server/commands.lua
+++ b/[esx]/es_extended/server/commands.lua
@@ -19,7 +19,7 @@ end, true, {help = _U('command_setjob'), validate = true, arguments = {
}})
ESX.RegisterCommand('car', 'admin', function(xPlayer, args, showError)
- if not args.car then args.car = "baller2" end
+ if not args.car then args.car = "Prototipo" end
xPlayer.triggerEvent('esx:spawnVehicle', args.car)
end, false, {help = _U('command_car'), validate = false, arguments = {
{name = 'car', help = _U('command_car_car'), type = 'any'}
@@ -134,31 +134,32 @@ end, true, {help = _U('command_setgroup'), validate = true, arguments = {
}})
ESX.RegisterCommand('save', 'admin', function(xPlayer, args, showError)
- ESX.SavePlayer(args.playerId)
+ Core.SavePlayer(args.playerId)
+ print("[^2Info^0] Saved Player!")
end, true, {help = _U('command_save'), validate = true, arguments = {
{name = 'playerId', help = _U('commandgeneric_playerid'), type = 'player'}
}})
ESX.RegisterCommand('saveall', 'admin', function(xPlayer, args, showError)
- ESX.SavePlayers()
+ Core.SavePlayers()
end, true, {help = _U('command_saveall')})
ESX.RegisterCommand('group', {"user", "admin"}, function(xPlayer, args, showError)
- print(xPlayer.getName()..", You are currently: ^5".. xPlayer.getGroup())
+ print(xPlayer.getName()..", You are currently: ^5".. xPlayer.getGroup() .. "^0")
end, true)
ESX.RegisterCommand('job', {"user", "admin"}, function(xPlayer, args, showError)
-print(xPlayer.getName()..", You are currently: ^5".. xPlayer.getJob().name.. "^0 - ^5".. xPlayer.getJob().grade_label)
+print(xPlayer.getName()..", You are currently: ^5".. xPlayer.getJob().name.. "^0 - ^5".. xPlayer.getJob().grade_label .. "^0")
end, true)
ESX.RegisterCommand('info', {"user", "admin"}, function(xPlayer, args, showError)
local job = xPlayer.getJob().name
local jobgrade = xPlayer.getJob().grade_name
- print("^2ID : ^5"..xPlayer.source.." ^0| ^2Name:^5"..xPlayer.getName().." ^0 | ^2Group:^5"..xPlayer.getGroup().."^0 | ^2Job:^5".. job.."")
+ print("^2ID : ^5"..xPlayer.source.." ^0| ^2Name:^5"..xPlayer.getName().." ^0 | ^2Group:^5"..xPlayer.getGroup().."^0 | ^2Job:^5".. job.."^0")
end, true)
ESX.RegisterCommand('coords', "admin", function(xPlayer, args, showError)
- print("".. xPlayer.getName().. ": ^5".. xPlayer.getCoords(true))
+ print("Coords:^5 ".. GetEntityCoords(GetPlayerPed(xPlayer.source)).. "^0")
end, true)
ESX.RegisterCommand('tpm', "admin", function(xPlayer, args, showError)
@@ -180,7 +181,7 @@ end, true, {help = _U('bring'), validate = true, arguments = {
}})
ESX.RegisterCommand('kill', "admin", function(xPlayer, args, showError)
- args.playerId.triggerEvent('esx:killPlayer')
+ args.playerId.triggerEvent("esx:killPlayer")
end, true, {help = _U('kill'), validate = true, arguments = {
{name = 'playerId', help = _U('commandgeneric_playerid'), type = 'player'}
}})
@@ -197,12 +198,6 @@ end, true, {help = _U('kill'), validate = true, arguments = {
{name = 'playerId', help = _U('commandgeneric_playerid'), type = 'player'}
}})
-ESX.RegisterCommand('reviveall', "admin", function(xPlayer, args, showError)
- for _, playerId in ipairs(GetPlayers()) do
- TriggerClientEvent('esx_ambulancejob:revive', playerId)
- end
-end, false)
-
ESX.RegisterCommand("noclip", 'admin', function(xPlayer, args, showError)
xPlayer.triggerEvent('esx:noclip')
end, false)
diff --git a/[esx]/es_extended/server/common.lua b/[esx]/es_extended/server/common.lua
index f6352ec4..63fd8f6b 100644
--- a/[esx]/es_extended/server/common.lua
+++ b/[esx]/es_extended/server/common.lua
@@ -1,34 +1,35 @@
ESX = {}
ESX.Players = {}
-ESX.UsableItemsCallbacks = {}
-ESX.Items = {}
-ESX.ServerCallbacks = {}
-ESX.TimeoutCount = -1
-ESX.CancelledTimeouts = {}
-ESX.Pickups = {}
-ESX.PickupId = 0
ESX.Jobs = {}
-ESX.RegisteredCommands = {}
+ESX.Items = {}
+Core = {}
+Core.UsableItemsCallbacks = {}
+Core.ServerCallbacks = {}
+Core.TimeoutCount = -1
+Core.CancelledTimeouts = {}
+Core.RegisteredCommands = {}
+Core.Pickups = {}
+Core.PickupId = 0
AddEventHandler('esx:getSharedObject', function(cb)
cb(ESX)
end)
-function getSharedObject()
+exports('getSharedObject', function()
return ESX
-end
+end)
local function StartDBSync()
Citizen.CreateThread(function()
while true do
Citizen.Wait(10 * 60 * 1000)
- ESX.SavePlayers()
+ Core.SavePlayers()
end
end)
end
MySQL.ready(function()
- MySQL.Async.fetchAll('SELECT * FROM items', {}, function(result)
+ MySQL.query('SELECT * FROM items', {}, function(result)
for k,v in ipairs(result) do
ESX.Items[v.name] = {
label = v.label,
@@ -40,13 +41,13 @@ MySQL.ready(function()
end)
local Jobs = {}
- MySQL.Async.fetchAll('SELECT * FROM jobs', {}, function(jobs)
+ MySQL.query('SELECT * FROM jobs', {}, function(jobs)
for k,v in ipairs(jobs) do
Jobs[v.name] = v
Jobs[v.name].grades = {}
end
- MySQL.Async.fetchAll('SELECT * FROM job_grades', {}, function(jobGrades)
+ MySQL.query('SELECT * FROM job_grades', {}, function(jobGrades)
for k,v in ipairs(jobGrades) do
if Jobs[v.job_name] then
Jobs[v.job_name].grades[tostring(v.grade)] = v
diff --git a/[esx]/es_extended/server/functions.lua b/[esx]/es_extended/server/functions.lua
index 1f5d41ee..540f920c 100644
--- a/[esx]/es_extended/server/functions.lua
+++ b/[esx]/es_extended/server/functions.lua
@@ -5,17 +5,17 @@ ESX.Trace = function(msg)
end
ESX.SetTimeout = function(msec, cb)
- local id = ESX.TimeoutCount + 1
+ local id = Core.TimeoutCount + 1
SetTimeout(msec, function()
- if ESX.CancelledTimeouts[id] then
- ESX.CancelledTimeouts[id] = nil
+ if Core.CancelledTimeouts[id] then
+ Core.CancelledTimeouts[id] = nil
else
cb()
end
end)
- ESX.TimeoutCount = id
+ Core.TimeoutCount = id
return id
end
@@ -29,10 +29,10 @@ ESX.RegisterCommand = function(name, group, cb, allowConsole, suggestion)
return
end
- if ESX.RegisteredCommands[name] then
+ if Core.RegisteredCommands[name] then
print(('[^3WARNING^7] Command ^5"%s" already registered, overriding command'):format(name))
- if ESX.RegisteredCommands[name].suggestion then
+ if Core.RegisteredCommands[name].suggestion then
TriggerClientEvent('chat:removeSuggestion', -1, ('/%s'):format(name))
end
end
@@ -44,10 +44,10 @@ ESX.RegisterCommand = function(name, group, cb, allowConsole, suggestion)
TriggerClientEvent('chat:addSuggestion', -1, ('/%s'):format(name), suggestion.help, suggestion.arguments)
end
- ESX.RegisteredCommands[name] = {group = group, cb = cb, allowConsole = allowConsole, suggestion = suggestion}
+ Core.RegisteredCommands[name] = {group = group, cb = cb, allowConsole = allowConsole, suggestion = suggestion}
RegisterCommand(name, function(playerId, args, rawCommand)
- local command = ESX.RegisteredCommands[name]
+ local command = Core.RegisteredCommands[name]
if not command.allowConsole and playerId == 0 then
print(('[^3WARNING^7] ^5%s'):format(_U('commanderror_console')))
@@ -148,92 +148,62 @@ ESX.RegisterCommand = function(name, group, cb, allowConsole, suggestion)
end
ESX.ClearTimeout = function(id)
- ESX.CancelledTimeouts[id] = true
+ Core.CancelledTimeouts[id] = true
end
ESX.RegisterServerCallback = function(name, cb)
- ESX.ServerCallbacks[name] = cb
+ Core.ServerCallbacks[name] = cb
end
ESX.TriggerServerCallback = function(name, requestId, source, cb, ...)
- if ESX.ServerCallbacks[name] then
- ESX.ServerCallbacks[name](source, cb, ...)
+ if Core.ServerCallbacks[name] then
+ Core.ServerCallbacks[name](source, cb, ...)
else
print(('[^3WARNING^7] Server callback ^5"%s"^0 does not exist. ^1Please Check The Server File for Errors!'):format(name))
end
end
-local savePlayers = -1
-Citizen.CreateThread(function()
- savePlayers = MySQL.Sync.store("UPDATE users SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?")
-end)
-
-ESX.SavePlayer = function(xPlayer, cb)
- local asyncTasks = {}
-
- table.insert(asyncTasks, function(cb2)
- MySQL.Async.execute(savePlayers, {
- json.encode(xPlayer.getAccounts(true)),
- xPlayer.job.name,
- xPlayer.job.grade,
- xPlayer.getGroup(),
- json.encode(xPlayer.getCoords()),
- json.encode(xPlayer.getInventory(true)),
- json.encode(xPlayer.getLoadout(true)),
- xPlayer.getIdentifier()
- }, function(rowsChanged)
- cb2()
- end)
- end)
-
- Async.parallel(asyncTasks, function(results)
- print(('[^2INFO^7] Saved player ^5"%s^7"'):format(xPlayer.getName()))
-
- if cb then
- cb()
+Core.SavePlayer = function(xPlayer, cb)
+ MySQL.prepare('UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?', {
+ json.encode(xPlayer.getAccounts(true)),
+ xPlayer.job.name,
+ xPlayer.job.grade,
+ xPlayer.group,
+ json.encode(xPlayer.getCoords()),
+ json.encode(xPlayer.getInventory(true)),
+ json.encode(xPlayer.getLoadout(true)),
+ xPlayer.identifier
+ }, function(affectedRows)
+ if affectedRows == 1 then
+ print(('[^2INFO^7] Saved player ^5"%s^7"'):format(xPlayer.name))
end
+ if cb then cb() end
end)
end
-ESX.SavePlayers = function(cb)
+Core.SavePlayers = function(cb)
local xPlayers = ESX.GetExtendedPlayers()
- if #xPlayers > 0 then
+ local count = #xPlayers
+ if count > 0 then
+ local parameters = {}
local time = os.time()
-
- local selectListWithNames = "SELECT '%s' AS identifier, '%s' AS new_accounts, '%s' AS new_job, %s AS new_job_grade, '%s' AS new_group, '%s' AS new_loadout, '%s' AS new_position, '%s' AS new_inventory "
- local selectListNoNames = "SELECT '%s', '%s', '%s' , %s, '%s', '%s', '%s', '%s' "
-
- local updateCommand = 'UPDATE users u JOIN ('
-
- local selectList = selectListNoNames
- local first = true
- for k, xPlayer in pairs(xPlayers) do
- if first == false then
- updateCommand = updateCommand .. ' UNION '
- else
- selectList = selectListWithNames
- end
-
- updateCommand = updateCommand .. string.format(selectList,
- xPlayer.identifier,
+ for i=1, count do
+ local xPlayer = xPlayers[i]
+ parameters[#parameters+1] = {
json.encode(xPlayer.getAccounts(true)),
xPlayer.job.name,
xPlayer.job.grade,
- xPlayer.getGroup(),
- json.encode(xPlayer.getLoadout(true)),
+ xPlayer.group,
json.encode(xPlayer.getCoords()),
- json.encode(xPlayer.getInventory(true))
- )
-
- first = false
+ json.encode(xPlayer.getInventory(true)),
+ json.encode(xPlayer.getLoadout(true)),
+ xPlayer.identifier
+ }
end
-
- updateCommand = updateCommand .. ' ) vals ON u.identifier = vals.identifier SET accounts = new_accounts, job = new_job, job_grade = new_job_grade, `group` = new_group, loadout = new_loadout, `position` = new_position, inventory = new_inventory'
-
- MySQL.Async.fetchAll(updateCommand, {},
- function(result)
- if result then
- if cb then cb() else print(('[^2INFO^7] Saved %s of %s player(s) over %s seconds'):format(result.affectedRows, #xPlayers, os.time() - time)) end
+ MySQL.prepare("UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?", parameters,
+ function(results)
+ if results then
+ if type(cb) == 'function' then cb() else print(('[^2INFO^7] Saved %s %s over %s ms'):format(count, count > 1 and 'players' or 'player', (os.time() - time) / 1000000)) end
end
end)
end
@@ -285,11 +255,11 @@ ESX.GetIdentifier = function(playerId)
end
ESX.RegisterUsableItem = function(item, cb)
- ESX.UsableItemsCallbacks[item] = cb
+ Core.UsableItemsCallbacks[item] = cb
end
ESX.UseItem = function(source, item)
- ESX.UsableItemsCallbacks[item](source, item)
+ Core.UsableItemsCallbacks[item](source, item)
end
ESX.GetItemLabel = function(item)
@@ -298,24 +268,36 @@ ESX.GetItemLabel = function(item)
end
end
+ESX.GetJobs = function()
+ return ESX.Jobs
+end
+
+ESX.GetUsableItems = function()
+ local Usables = {}
+ for k in pairs(Core.UsableItemsCallbacks) do
+ Usables[k] = true
+ end
+ return Usables
+end
+
ESX.CreatePickup = function(type, name, count, label, playerId, components, tintIndex)
- local pickupId = (ESX.PickupId == 65635 and 0 or ESX.PickupId + 1)
+ local pickupId = (Core.PickupId == 65635 and 0 or Core.PickupId + 1)
local xPlayer = ESX.GetPlayerFromId(playerId)
local coords = xPlayer.getCoords()
- ESX.Pickups[pickupId] = {
+ Core.Pickups[pickupId] = {
type = type, name = name,
count = count, label = label,
coords = coords
}
if type == 'item_weapon' then
- ESX.Pickups[pickupId].components = components
- ESX.Pickups[pickupId].tintIndex = tintIndex
+ Core.Pickups[pickupId].components = components
+ Core.Pickups[pickupId].tintIndex = tintIndex
end
TriggerClientEvent('esx:createPickup', -1, pickupId, label, coords, type, name, components, tintIndex)
- ESX.PickupId = pickupId
+ Core.PickupId = pickupId
end
ESX.DoesJobExist = function(job, grade)
@@ -329,3 +311,18 @@ ESX.DoesJobExist = function(job, grade)
return false
end
+
+Core.IsPlayerAdmin = function(playerId)
+ if (IsPlayerAceAllowed(playerId, 'command') or GetConvar('sv_lan', '') == 'true') and true or false then
+ return true
+ end
+
+ local xPlayer = ESX.GetPlayerFromId(playerId)
+ if xPlayer then
+ if xPlayer.group == 'admin' then
+ return true
+ end
+ end
+
+ return false
+end
diff --git a/[esx]/es_extended/server/main.lua b/[esx]/es_extended/server/main.lua
index bb5bfcd8..81afead3 100644
--- a/[esx]/es_extended/server/main.lua
+++ b/[esx]/es_extended/server/main.lua
@@ -1,27 +1,18 @@
-local NewPlayer, LoadPlayer = -1, -1
-Citizen.CreateThread(function()
- SetMapName('San Andreas')
- SetGameType('ESX Legacy')
+SetMapName('San Andreas')
+SetGameType('ESX Legacy')
- local query = '`accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`' -- Select these fields from the database
- if Config.Multichar or Config.Identity then -- append these fields to the select query
- query = query..', `firstname`, `lastname`, `dateofbirth`, `sex`, `height`'
- end
+local newPlayer = 'INSERT INTO `users` SET `accounts` = ?, `identifier` = ?, `group` = ?'
+local loadPlayer = 'SELECT `accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`'
- if Config.Multichar then -- insert identity data with creation
- MySQL.Async.store("INSERT INTO `users` SET `accounts` = ?, `identifier` = ?, `group` = ?, `firstname` = ?, `lastname` = ?, `dateofbirth` = ?, `sex` = ?, `height` = ?", function(storeId)
- NewPlayer = storeId
- end)
- else
- MySQL.Async.store("INSERT INTO `users` SET `accounts` = ?, `identifier` = ?, `group` = ?", function(storeId)
- NewPlayer = storeId
- end)
- end
+if Config.Multichar then
+ newPlayer = newPlayer..', `firstname` = ?, `lastname` = ?, `dateofbirth` = ?, `sex` = ?, `height` = ?'
+end
- MySQL.Async.store("SELECT "..query.." FROM `users` WHERE identifier = ?", function(storeId)
- LoadPlayer = storeId
- end)
-end)
+if Config.Multichar or Config.Identity then
+ loadPlayer = loadPlayer..', `firstname`, `lastname`, `dateofbirth`, `sex`, `height`'
+end
+
+loadPlayer = loadPlayer..' FROM `users` WHERE identifier = ?'
if Config.Multichar then
AddEventHandler('esx:onPlayerJoined', function(src, char, data)
@@ -49,13 +40,12 @@ function onPlayerJoined(playerId)
if ESX.GetPlayerFromIdentifier(identifier) then
DropPlayer(playerId, ('there was an error loading your character!\nError code: identifier-active-ingame\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same Rockstar account.\n\nYour Rockstar identifier: %s'):format(identifier))
else
- MySQL.Async.fetchScalar('SELECT 1 FROM users WHERE identifier = @identifier', {
- ['@identifier'] = identifier
- }, function(result)
- if result then
- loadESXPlayer(identifier, playerId, false)
- else createESXPlayer(identifier, playerId) end
- end)
+ local result = MySQL.scalar.await('SELECT 1 FROM users WHERE identifier = ?', { identifier })
+ if result then
+ loadESXPlayer(identifier, playerId, false)
+ else
+ createESXPlayer(identifier, playerId)
+ end
end
else
DropPlayer(playerId, 'there was an error loading your character!\nError code: identifier-missing-ingame\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team.')
@@ -69,7 +59,7 @@ function createESXPlayer(identifier, playerId, data)
accounts[account] = money
end
- if IsPlayerAceAllowed(playerId, "command") then
+ if Core.IsPlayerAdmin(playerId) then
print(('^2[INFO] ^0 Player ^5%s ^0Has been granted admin permissions via ^5Ace Perms.^7'):format(playerId))
defaultGroup = "admin"
else
@@ -77,49 +67,44 @@ function createESXPlayer(identifier, playerId, data)
end
if not Config.Multichar then
- MySQL.Async.execute(NewPlayer, {
- json.encode(accounts),
- identifier,
- defaultGroup,
- }, function(rowsChanged)
+ MySQL.prepare(newPlayer, { json.encode(accounts), identifier, defaultGroup }, function()
loadESXPlayer(identifier, playerId, true)
end)
else
- MySQL.Async.execute(NewPlayer, {
- json.encode(accounts),
- identifier,
- defaultGroup,
- data.firstname,
- data.lastname,
- data.dateofbirth,
- data.sex,
- data.height,
- }, function(rowsChanged)
+ MySQL.prepare(newPlayer, {
+ json.encode(accounts),
+ identifier,
+ defaultGroup,
+ data.firstname,
+ data.lastname,
+ data.dateofbirth,
+ data.sex,
+ data.height
+ }, function()
loadESXPlayer(identifier, playerId, true)
end)
end
end
-AddEventHandler('playerConnecting', function(name, setCallback, deferrals)
- deferrals.defer()
- local playerId = source
- local identifier = ESX.GetIdentifier(playerId)
- Citizen.Wait(100)
+if not Config.Multichar then
+ AddEventHandler('playerConnecting', function(name, setCallback, deferrals)
+ deferrals.defer()
+ local playerId = source
+ local identifier = ESX.GetIdentifier(playerId)
- if identifier then
- if ESX.GetPlayerFromIdentifier(identifier) then
- deferrals.done(('There was an error loading your character!\nError code: identifier-active\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same account.\n\nYour identifier: %s'):format(identifier))
+ if identifier then
+ if ESX.GetPlayerFromIdentifier(identifier) then
+ deferrals.done(('There was an error loading your character!\nError code: identifier-active\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same account.\n\nYour identifier: %s'):format(identifier))
+ else
+ deferrals.done()
+ end
else
- deferrals.done()
+ deferrals.done('There was an error loading your character!\nError code: identifier-missing\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team.')
end
- else
- deferrals.done('There was an error loading your character!\nError code: identifier-missing\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team.')
- end
-end)
+ end)
+end
function loadESXPlayer(identifier, playerId, isNew)
- local tasks = {}
-
local userData = {
accounts = {},
inventory = {},
@@ -129,179 +114,171 @@ function loadESXPlayer(identifier, playerId, isNew)
weight = 0
}
- table.insert(tasks, function(cb)
- MySQL.Async.fetchAll(LoadPlayer, { identifier
- }, function(result)
- local job, grade, jobObject, gradeObject = result[1].job, tostring(result[1].job_grade)
- local foundAccounts, foundItems = {}, {}
+ local result = MySQL.prepare.await(loadPlayer, { identifier })
+ local job, grade, jobObject, gradeObject = result.job, tostring(result.job_grade)
+ local foundAccounts, foundItems = {}, {}
- -- Accounts
- if result[1].accounts and result[1].accounts ~= '' then
- local accounts = json.decode(result[1].accounts)
+ -- Accounts
+ if result.accounts and result.accounts ~= '' then
+ local accounts = json.decode(result.accounts)
- for account,money in pairs(accounts) do
- foundAccounts[account] = money
- end
- end
-
- for account,label in pairs(Config.Accounts) do
- table.insert(userData.accounts, {
- name = account,
- money = foundAccounts[account] or Config.StartingAccountMoney[account] or 0,
- label = label
- })
- end
-
- -- Job
- if ESX.DoesJobExist(job, grade) then
- jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
- else
- print(('[^3WARNING^7] Ignoring invalid job for %s [job: %s, grade: %s]'):format(identifier, job, grade))
- job, grade = 'unemployed', '0'
- jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
- end
-
- userData.job.id = jobObject.id
- userData.job.name = jobObject.name
- userData.job.label = jobObject.label
-
- userData.job.grade = tonumber(grade)
- userData.job.grade_name = gradeObject.name
- userData.job.grade_label = gradeObject.label
- userData.job.grade_salary = gradeObject.salary
-
- userData.job.skin_male = {}
- userData.job.skin_female = {}
-
- if gradeObject.skin_male then userData.job.skin_male = json.decode(gradeObject.skin_male) end
- if gradeObject.skin_female then userData.job.skin_female = json.decode(gradeObject.skin_female) end
-
- -- Inventory
- if result[1].inventory and result[1].inventory ~= '' then
- local inventory = json.decode(result[1].inventory)
-
- for name,count in pairs(inventory) do
- local item = ESX.Items[name]
-
- if item then
- foundItems[name] = count
- else
- print(('[^3WARNING^7] Ignoring invalid item "%s" for "%s"'):format(name, identifier))
- end
- end
- end
-
- for name,item in pairs(ESX.Items) do
- local count = foundItems[name] or 0
- if count > 0 then userData.weight = userData.weight + (item.weight * count) end
-
- table.insert(userData.inventory, {
- name = name,
- count = count,
- label = item.label,
- weight = item.weight,
- usable = ESX.UsableItemsCallbacks[name] ~= nil,
- rare = item.rare,
- canRemove = item.canRemove
- })
- end
-
- table.sort(userData.inventory, function(a, b)
- return a.label < b.label
- end)
-
- -- Group
- if result[1].group then
- if result[1].group == "superadmin" then
- userData.group = "admin"
- else
- userData.group = result[1].group
- end
- else
- userData.group = 'user'
- end
-
- -- Loadout
- if result[1].loadout and result[1].loadout ~= '' then
- local loadout = json.decode(result[1].loadout)
-
- for name,weapon in pairs(loadout) do
- local label = ESX.GetWeaponLabel(name)
-
- if label then
- if not weapon.components then weapon.components = {} end
- if not weapon.tintIndex then weapon.tintIndex = 0 end
-
- table.insert(userData.loadout, {
- name = name,
- ammo = weapon.ammo,
- label = label,
- components = weapon.components,
- tintIndex = weapon.tintIndex
- })
- end
- end
- end
-
- -- Position
- if result[1].position and result[1].position ~= '' then
- userData.coords = json.decode(result[1].position)
- else
- print('[^3WARNING^7] Column ^5"position"^0 in ^5"users"^0 table is missing required default value. Using backup coords, fix your database.')
- userData.coords = {x = -269.4, y = -955.3, z = 31.2, heading = 205.8}
- end
-
- -- Skin
- if result[1].skin and result[1].skin ~= '' then
- userData.skin = json.decode(result[1].skin)
- else
- if userData.sex == 'f' then userData.skin = {sex=1} else userData.skin = {sex=0} end
- end
-
- -- Identity
- if result[1].firstname and result[1].firstname ~= '' then
- userData.firstname = result[1].firstname
- userData.lastname = result[1].lastname
- userData.playerName = userData.firstname..' '..userData.lastname
- if result[1].dateofbirth then userData.dateofbirth = result[1].dateofbirth end
- if result[1].sex then userData.sex = result[1].sex end
- if result[1].height then userData.height = result[1].height end
- end
-
- cb()
- end)
- end)
-
- Async.parallel(tasks, function(results)
- local xPlayer = CreateExtendedPlayer(playerId, identifier, userData.group, userData.accounts, userData.inventory, userData.weight, userData.job, userData.loadout, userData.playerName, userData.coords)
- ESX.Players[playerId] = xPlayer
-
- if userData.firstname then
- xPlayer.set('firstName', userData.firstname)
- xPlayer.set('lastName', userData.lastname)
- if userData.dateofbirth then xPlayer.set('dateofbirth', userData.dateofbirth) end
- if userData.sex then xPlayer.set('sex', userData.sex) end
- if userData.height then xPlayer.set('height', userData.height) end
+ for account,money in pairs(accounts) do
+ foundAccounts[account] = money
end
+ end
- TriggerEvent('esx:playerLoaded', playerId, xPlayer, isNew)
+ for account,label in pairs(Config.Accounts) do
+ table.insert(userData.accounts, {
+ name = account,
+ money = foundAccounts[account] or Config.StartingAccountMoney[account] or 0,
+ label = label
+ })
+ end
- xPlayer.triggerEvent('esx:playerLoaded', {
- accounts = xPlayer.getAccounts(),
- coords = xPlayer.getCoords(),
- identifier = xPlayer.getIdentifier(),
- inventory = xPlayer.getInventory(),
- job = xPlayer.getJob(),
- loadout = xPlayer.getLoadout(),
- maxWeight = xPlayer.getMaxWeight(),
- money = xPlayer.getMoney(),
- dead = false
- }, isNew, userData.skin)
+ -- Job
+ if ESX.DoesJobExist(job, grade) then
+ jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
+ else
+ print(('[^3WARNING^7] Ignoring invalid job for %s [job: %s, grade: %s]'):format(identifier, job, grade))
+ job, grade = 'unemployed', '0'
+ jobObject, gradeObject = ESX.Jobs[job], ESX.Jobs[job].grades[grade]
+ end
- xPlayer.triggerEvent('esx:createMissingPickups', ESX.Pickups)
- xPlayer.triggerEvent('esx:registerSuggestions', ESX.RegisteredCommands)
- print(('[^2INFO^0] Player ^5"%s" ^0has connected to the server. ID: ^5%s^7'):format(xPlayer.getName(), playerId))
+ userData.job.id = jobObject.id
+ userData.job.name = jobObject.name
+ userData.job.label = jobObject.label
+
+ userData.job.grade = tonumber(grade)
+ userData.job.grade_name = gradeObject.name
+ userData.job.grade_label = gradeObject.label
+ userData.job.grade_salary = gradeObject.salary
+
+ userData.job.skin_male = {}
+ userData.job.skin_female = {}
+
+ if gradeObject.skin_male then userData.job.skin_male = json.decode(gradeObject.skin_male) end
+ if gradeObject.skin_female then userData.job.skin_female = json.decode(gradeObject.skin_female) end
+
+ -- Inventory
+ if result.inventory and result.inventory ~= '' then
+ local inventory = json.decode(result.inventory)
+
+ for name,count in pairs(inventory) do
+ local item = ESX.Items[name]
+
+ if item then
+ foundItems[name] = count
+ else
+ print(('[^3WARNING^7] Ignoring invalid item "%s" for "%s"'):format(name, identifier))
+ end
+ end
+ end
+
+ for name,item in pairs(ESX.Items) do
+ local count = foundItems[name] or 0
+ if count > 0 then userData.weight = userData.weight + (item.weight * count) end
+
+ table.insert(userData.inventory, {
+ name = name,
+ count = count,
+ label = item.label,
+ weight = item.weight,
+ usable = Core.UsableItemsCallbacks[name] ~= nil,
+ rare = item.rare,
+ canRemove = item.canRemove
+ })
+ end
+
+ table.sort(userData.inventory, function(a, b)
+ return a.label < b.label
end)
+
+ -- Group
+ if result.group then
+ if result.group == "superadmin" then
+ userData.group = "admin"
+ else
+ userData.group = result.group
+ end
+ else
+ userData.group = 'user'
+ end
+
+ -- Loadout
+ if result.loadout and result.loadout ~= '' then
+ local loadout = json.decode(result.loadout)
+
+ for name,weapon in pairs(loadout) do
+ local label = ESX.GetWeaponLabel(name)
+
+ if label then
+ if not weapon.components then weapon.components = {} end
+ if not weapon.tintIndex then weapon.tintIndex = 0 end
+
+ table.insert(userData.loadout, {
+ name = name,
+ ammo = weapon.ammo,
+ label = label,
+ components = weapon.components,
+ tintIndex = weapon.tintIndex
+ })
+ end
+ end
+ end
+
+ -- Position
+ if result.position and result.position ~= '' then
+ userData.coords = json.decode(result.position)
+ else
+ print('[^3WARNING^7] Column ^5"position"^0 in ^5"users"^0 table is missing required default value. Using backup coords, fix your database.')
+ userData.coords = {x = -269.4, y = -955.3, z = 31.2, heading = 205.8}
+ end
+
+ -- Skin
+ if result.skin and result.skin ~= '' then
+ userData.skin = json.decode(result.skin)
+ else
+ if userData.sex == 'f' then userData.skin = {sex=1} else userData.skin = {sex=0} end
+ end
+
+ -- Identity
+ if result.firstname and result.firstname ~= '' then
+ userData.firstname = result.firstname
+ userData.lastname = result.lastname
+ userData.playerName = userData.firstname..' '..userData.lastname
+ if result.dateofbirth then userData.dateofbirth = result.dateofbirth end
+ if result.sex then userData.sex = result.sex end
+ if result.height then userData.height = result.height end
+ end
+
+ local xPlayer = CreateExtendedPlayer(playerId, identifier, userData.group, userData.accounts, userData.inventory, userData.weight, userData.job, userData.loadout, userData.playerName, userData.coords)
+ ESX.Players[playerId] = xPlayer
+
+ if userData.firstname then
+ xPlayer.set('firstName', userData.firstname)
+ xPlayer.set('lastName', userData.lastname)
+ if userData.dateofbirth then xPlayer.set('dateofbirth', userData.dateofbirth) end
+ if userData.sex then xPlayer.set('sex', userData.sex) end
+ if userData.height then xPlayer.set('height', userData.height) end
+ end
+
+ TriggerEvent('esx:playerLoaded', playerId, xPlayer, isNew)
+
+ xPlayer.triggerEvent('esx:playerLoaded', {
+ accounts = xPlayer.getAccounts(),
+ coords = xPlayer.getCoords(),
+ identifier = xPlayer.getIdentifier(),
+ inventory = xPlayer.getInventory(),
+ job = xPlayer.getJob(),
+ loadout = xPlayer.getLoadout(),
+ maxWeight = xPlayer.getMaxWeight(),
+ money = xPlayer.getMoney(),
+ dead = false
+ }, isNew, userData.skin)
+
+ xPlayer.triggerEvent('esx:createMissingPickups', Core.Pickups)
+ xPlayer.triggerEvent('esx:registerSuggestions', Core.RegisteredCommands)
+ print(('[^2INFO^0] Player ^5"%s" ^0has connected to the server. ID: ^5%s^7'):format(xPlayer.getName(), playerId))
end
AddEventHandler('chatMessage', function(playerId, author, message)
@@ -319,7 +296,7 @@ AddEventHandler('playerDropped', function(reason)
if xPlayer then
TriggerEvent('esx:playerDropped', playerId, reason)
- ESX.SavePlayer(xPlayer, function()
+ Core.SavePlayer(xPlayer, function()
ESX.Players[playerId] = nil
end)
end
@@ -331,7 +308,7 @@ if Config.Multichar then
if xPlayer then
TriggerEvent('esx:playerDropped', playerId, reason)
- ESX.SavePlayer(xPlayer, function()
+ Core.SavePlayer(xPlayer, function()
ESX.Players[playerId] = nil
end)
end
@@ -512,7 +489,7 @@ end)
RegisterNetEvent('esx:onPickup')
AddEventHandler('esx:onPickup', function(pickupId)
- local pickup, xPlayer, success = ESX.Pickups[pickupId], ESX.GetPlayerFromId(source)
+ local pickup, xPlayer, success = Core.Pickups[pickupId], ESX.GetPlayerFromId(source)
if pickup then
if pickup.type == 'item_standard' then
@@ -540,7 +517,7 @@ AddEventHandler('esx:onPickup', function(pickupId)
end
if success then
- ESX.Pickups[pickupId] = nil
+ Core.Pickups[pickupId] = nil
TriggerClientEvent('esx:removePickup', -1, pickupId)
end
end
@@ -559,6 +536,10 @@ ESX.RegisterServerCallback('esx:getPlayerData', function(source, cb)
})
end)
+ESX.RegisterServerCallback('esx:isUserAdmin', function(source, cb)
+ cb(Core.IsPlayerAdmin(source))
+end)
+
ESX.RegisterServerCallback('esx:getOtherPlayerData', function(source, cb, target)
local xPlayer = ESX.GetPlayerFromId(target)
@@ -592,7 +573,7 @@ AddEventHandler('txAdmin:events:scheduledRestart', function(eventData)
if eventData.secondsRemaining == 60 then
Citizen.CreateThread(function()
Citizen.Wait(50000)
- ESX.SavePlayers()
+ Core.SavePlayers()
end)
end
end)
diff --git a/[esx]/es_extended/version.json b/[esx]/es_extended/version.json
index 477b5b19..9f3db69d 100644
--- a/[esx]/es_extended/version.json
+++ b/[esx]/es_extended/version.json
@@ -1,5 +1,5 @@
{
"version": "legacy",
- "commit" : "1.3.5",
- "changelog": "\n- Base resources updated to use ESX Legacy improvements\n - Improved functionality for ESX.GetExtendedPlayers to return specific players only\n - "
+ "commit" : "1.4.2",
+ "changelog": "\n- Updated `Car` Command. Fixed some vulnerabilities. Fix SQL. Updated Commands."
}
diff --git a/[esx]/esx_identity/LICENSE b/[esx]/esx_identity/LICENSE
index 6fb71ffc..9cba2328 100644
--- a/[esx]/esx_identity/LICENSE
+++ b/[esx]/esx_identity/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_identity
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_identity Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_identity Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/esx_identity/README.md b/[esx]/esx_identity/README.md
index 8335e286..a310d94b 100644
--- a/[esx]/esx_identity/README.md
+++ b/[esx]/esx_identity/README.md
@@ -44,7 +44,7 @@ start esx_identity
### License
esx_identity - rp characters
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx]/esx_identity/client/main.lua b/[esx]/esx_identity/client/main.lua
index 3f49ae4d..e333bb1a 100644
--- a/[esx]/esx_identity/client/main.lua
+++ b/[esx]/esx_identity/client/main.lua
@@ -27,7 +27,12 @@ if not Config.UseDeferrals then
function EnableGui(state)
SetNuiFocus(state, state)
guiEnabled = state
-
+ --[[ Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(20000) -- UNCOMMENT THIS METHOD IF YOU ARE EXPERIENCING ISSUES WITH THE UI ON LOCALHOST | IF YOU STILL EXPERIENCE ISSUES AFTER REMOVING COMMENTS, INCREASE THE TIME.
+ end
+ end)
+ ]]--
SendNUIMessage({
type = "enableui",
enable = state
diff --git a/[esx]/esx_identity/fxmanifest.lua b/[esx]/esx_identity/fxmanifest.lua
index 4dbd7d4b..157b7ca4 100644
--- a/[esx]/esx_identity/fxmanifest.lua
+++ b/[esx]/esx_identity/fxmanifest.lua
@@ -10,23 +10,15 @@ shared_script '@es_extended/imports.lua'
server_scripts {
'@es_extended/locale.lua',
- '@mysql-async/lib/MySQL.lua',
- 'locales/en.lua',
- 'locales/es.lua',
- 'locales/cs.lua',
- 'locales/pl.lua',
- 'locales/fi.lua',
+ '@oxmysql/lib/MySQL.lua',
+ 'locales/*.lua',
'config.lua',
'server/main.lua'
}
client_scripts {
'@es_extended/locale.lua',
- 'locales/en.lua',
- 'locales/es.lua',
- 'locales/cs.lua',
- 'locales/pl.lua',
- 'locales/fi.lua',
+ 'locales/*.lua',
'config.lua',
'client/main.lua'
}
diff --git a/[esx]/esx_identity/server/main.lua b/[esx]/esx_identity/server/main.lua
index 88223d0d..6bee931b 100644
--- a/[esx]/esx_identity/server/main.lua
+++ b/[esx]/esx_identity/server/main.lua
@@ -9,17 +9,16 @@ if Config.UseDeferrals then
Citizen.Wait(100)
if identifier then
- MySQL.Async.fetchAll('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = @identifier', {
- ['@identifier'] = identifier
- }, function(result)
- if result[1] then
- if result[1].firstname then
+ MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {identifier},
+ function(result)
+ if result then
+ if result.firstname then
playerIdentity[identifier] = {
- firstName = result[1].firstname,
- lastName = result[1].lastname,
- dateOfBirth = result[1].dateofbirth,
- sex = result[1].sex,
- height = result[1].height
+ firstName = result.firstname,
+ lastName = result.lastname,
+ dateOfBirth = result.dateofbirth,
+ sex = result.sex,
+ height = result.height
}
deferrals.done()
@@ -107,17 +106,16 @@ elseif not Config.UseDeferrals then
Citizen.Wait(40)
if identifier then
- MySQL.Async.fetchAll('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = @identifier', {
- ['@identifier'] = identifier
- }, function(result)
- if result[1] then
- if result[1].firstname then
+ MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {identifier},
+ function(result)
+ if result then
+ if result.firstname then
playerIdentity[identifier] = {
- firstName = result[1].firstname,
- lastName = result[1].lastname,
- dateOfBirth = result[1].dateofbirth,
- sex = result[1].sex,
- height = result[1].height
+ firstName = result.firstname,
+ lastName = result.lastname,
+ dateOfBirth = result.dateofbirth,
+ sex = result.sex,
+ height = result.height
}
alreadyRegistered[identifier] = true
@@ -225,17 +223,16 @@ elseif not Config.UseDeferrals then
end)
function checkIdentity(xPlayer)
- MySQL.Async.fetchAll('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier
- }, function(result)
- if result[1] then
- if result[1].firstname then
+ MySQL.single('SELECT firstname, lastname, dateofbirth, sex, height FROM users WHERE identifier = ?', {identifier},
+ function(result)
+ if result then
+ if result.firstname then
playerIdentity[xPlayer.identifier] = {
- firstName = result[1].firstname,
- lastName = result[1].lastname,
- dateOfBirth = result[1].dateofbirth,
- sex = result[1].sex,
- height = result[1].height
+ firstName = result.firstname,
+ lastName = result.lastname,
+ dateOfBirth = result.dateofbirth,
+ sex = result.sex,
+ height = result.height
}
alreadyRegistered[xPlayer.identifier] = true
@@ -284,7 +281,7 @@ if Config.EnableCommands then
ESX.RegisterCommand('chardel', 'user', function(xPlayer, args, showError)
if xPlayer and xPlayer.getName() then
if Config.UseDeferrals then
- xPlayer.kick(_('deleted_identity'))
+ xPlayer.kick(_U('deleted_identity'))
Citizen.Wait(1500)
deleteIdentity(xPlayer)
xPlayer.showNotification(_U('deleted_character'))
@@ -367,61 +364,16 @@ function deleteIdentity(xPlayer)
end
function saveIdentityToDatabase(identifier, identity)
- MySQL.Sync.execute('UPDATE users SET firstname = @firstname, lastname = @lastname, dateofbirth = @dateofbirth, sex = @sex, height = @height WHERE identifier = @identifier', {
- ['@identifier'] = identifier,
- ['@firstname'] = identity.firstName,
- ['@lastname'] = identity.lastName,
- ['@dateofbirth'] = identity.dateOfBirth,
- ['@sex'] = identity.sex,
- ['@height'] = identity.height
- })
+ MySQL.update.await('UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ? WHERE identifier = ?', {identity.firstName, identity.lastName, identity.dateOfBirth, identity.sex, identity.height, identifier})
end
function deleteIdentityFromDatabase(xPlayer)
- MySQL.Sync.execute('UPDATE users SET firstname = @firstname, lastname = @lastname, dateofbirth = @dateofbirth, sex = @sex, height = @height , skin = @skin WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier,
- ['@firstname'] = NULL,
- ['@lastname'] = NULL,
- ['@dateofbirth'] = NULL,
- ['@sex'] = NULL,
- ['@height'] = NULL,
- ['@skin'] = NULL
- })
+ MySQL.query.await('UPDATE users SET firstname = ?, lastname = ?, dateofbirth = ?, sex = ?, height = ?, skin = ? WHERE identifier = ?', {nil, nil, nil, nil, nil, nil, xPlayer.identifier})
if Config.FullCharDelete then
- MySQL.Sync.execute('UPDATE addon_account_data SET money = 0 WHERE account_name = @account_name AND owner = @owner', {
- ['@account_name'] = 'bank_savings',
- ['@owner'] = xPlayer.identifier
- })
+ MySQL.update.await('UPDATE addon_account_data SET money = 0 WHERE account_name IN (?) AND owner = ?', {{'bank_savings', 'caution'}, xPlayer.identifier})
- MySQL.Sync.execute('UPDATE addon_account_data SET money = 0 WHERE account_name = @account_name AND owner = @owner', {
- ['@account_name'] = 'caution',
- ['@owner'] = xPlayer.identifier
- })
-
- MySQL.Sync.execute('UPDATE datastore_data SET data = @data WHERE name = @name AND owner = @owner', {
- ['@data'] = '\'{}\'',
- ['@name'] = 'user_ears',
- ['@owner'] = xPlayer.identifier
- })
-
- MySQL.Sync.execute('UPDATE datastore_data SET data = @data WHERE name = @name AND owner = @owner', {
- ['@data'] = '\'{}\'',
- ['@name'] = 'user_glasses',
- ['@owner'] = xPlayer.identifier
- })
-
- MySQL.Sync.execute('UPDATE datastore_data SET data = @data WHERE name = @name AND owner = @owner', {
- ['@data'] = '\'{}\'',
- ['@name'] = 'user_helmet',
- ['@owner'] = xPlayer.identifier
- })
-
- MySQL.Sync.execute('UPDATE datastore_data SET data = @data WHERE name = @name AND owner = @owner', {
- ['@data'] = '\'{}\'',
- ['@name'] = 'user_mask',
- ['@owner'] = xPlayer.identifier
- })
+ MySQL.prepare.await('UPDATE datastore_data SET data = ? WHERE name IN (?) AND owner = ?', {'\'{}\'', {'user_ears', 'user_glasses', 'user_helmet', 'user_mask'}, xPlayer.identifier})
end
end
diff --git a/[esx]/esx_menu_default/LICENSE b/[esx]/esx_menu_default/LICENSE
index 085b4e27..1e4d06cf 100644
--- a/[esx]/esx_menu_default/LICENSE
+++ b/[esx]/esx_menu_default/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_menu_default
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_menu_default Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_menu_default Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/esx_menu_default/client/main.lua b/[esx]/esx_menu_default/client/main.lua
index 54a6d428..2873f490 100644
--- a/[esx]/esx_menu_default/client/main.lua
+++ b/[esx]/esx_menu_default/client/main.lua
@@ -1,97 +1,95 @@
-Citizen.CreateThread(function()
- local ESX = exports['es_extended']:getSharedObject()
- local GUI, MenuType = {}, 'default'
- GUI.Time = 0
+local ESX = exports.es_extended:getSharedObject()
+local GUI, MenuType = {}, 'default'
+GUI.Time = 0
- local openMenu = function(namespace, name, data)
- SendNUIMessage({
- action = 'openMenu',
- namespace = namespace,
- name = name,
- data = data
- })
+local openMenu = function(namespace, name, data)
+ SendNUIMessage({
+ action = 'openMenu',
+ namespace = namespace,
+ name = name,
+ data = data
+ })
+end
+
+local closeMenu = function(namespace, name)
+ SendNUIMessage({
+ action = 'closeMenu',
+ namespace = namespace,
+ name = name,
+ data = data
+ })
+end
+
+ESX.UI.Menu.RegisterType(MenuType, openMenu, closeMenu)
+
+RegisterNUICallback('menu_submit', function(data, cb)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+ if menu.submit ~= nil then
+ menu.submit(data, menu)
+ end
+ cb('OK')
+end)
+
+RegisterNUICallback('menu_cancel', function(data, cb)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+
+ if menu.cancel ~= nil then
+ menu.cancel(data, menu)
+ end
+ cb('OK')
+end)
+
+RegisterNUICallback('menu_change', function(data, cb)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+
+ for i=1, #data.elements, 1 do
+ menu.setElement(i, 'value', data.elements[i].value)
+
+ if data.elements[i].selected then
+ menu.setElement(i, 'selected', true)
+ else
+ menu.setElement(i, 'selected', false)
+ end
+ end
+
+ if menu.change ~= nil then
+ menu.change(data, menu)
+ end
+ cb('OK')
+end)
+
+Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(15)
+
+ if IsControlPressed(0, 18) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
+ SendNUIMessage({action = 'controlPressed', control = 'ENTER'})
+ GUI.Time = GetGameTimer()
+ end
+
+ if IsControlPressed(0, 177) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
+ SendNUIMessage({action = 'controlPressed', control = 'BACKSPACE'})
+ GUI.Time = GetGameTimer()
+ end
+
+ if IsControlPressed(0, 27) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
+ SendNUIMessage({action = 'controlPressed', control = 'TOP'})
+ GUI.Time = GetGameTimer()
+ end
+
+ if IsControlPressed(0, 173) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
+ SendNUIMessage({action = 'controlPressed', control = 'DOWN'})
+ GUI.Time = GetGameTimer()
+ end
+
+ if IsControlPressed(0, 174) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
+ SendNUIMessage({action = 'controlPressed', control = 'LEFT'})
+ GUI.Time = GetGameTimer()
+ end
+
+ if IsControlPressed(0, 175) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
+ SendNUIMessage({action = 'controlPressed', control = 'RIGHT'})
+ GUI.Time = GetGameTimer()
+ end
end
-
- local closeMenu = function(namespace, name)
- SendNUIMessage({
- action = 'closeMenu',
- namespace = namespace,
- name = name,
- data = data
- })
- end
-
- ESX.UI.Menu.RegisterType(MenuType, openMenu, closeMenu)
-
- RegisterNUICallback('menu_submit', function(data, cb)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
- if menu.submit ~= nil then
- menu.submit(data, menu)
- end
- cb('OK')
- end)
-
- RegisterNUICallback('menu_cancel', function(data, cb)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
-
- if menu.cancel ~= nil then
- menu.cancel(data, menu)
- end
- cb('OK')
- end)
-
- RegisterNUICallback('menu_change', function(data, cb)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
-
- for i=1, #data.elements, 1 do
- menu.setElement(i, 'value', data.elements[i].value)
-
- if data.elements[i].selected then
- menu.setElement(i, 'selected', true)
- else
- menu.setElement(i, 'selected', false)
- end
- end
-
- if menu.change ~= nil then
- menu.change(data, menu)
- end
- cb('OK')
- end)
-
- Citizen.CreateThread(function()
- while true do
- Citizen.Wait(15)
-
- if IsControlPressed(0, 18) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
- SendNUIMessage({action = 'controlPressed', control = 'ENTER'})
- GUI.Time = GetGameTimer()
- end
-
- if IsControlPressed(0, 177) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
- SendNUIMessage({action = 'controlPressed', control = 'BACKSPACE'})
- GUI.Time = GetGameTimer()
- end
-
- if IsControlPressed(0, 27) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
- SendNUIMessage({action = 'controlPressed', control = 'TOP'})
- GUI.Time = GetGameTimer()
- end
-
- if IsControlPressed(0, 173) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 200 then
- SendNUIMessage({action = 'controlPressed', control = 'DOWN'})
- GUI.Time = GetGameTimer()
- end
-
- if IsControlPressed(0, 174) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
- SendNUIMessage({action = 'controlPressed', control = 'LEFT'})
- GUI.Time = GetGameTimer()
- end
-
- if IsControlPressed(0, 175) and IsInputDisabled(0) and (GetGameTimer() - GUI.Time) > 150 then
- SendNUIMessage({action = 'controlPressed', control = 'RIGHT'})
- GUI.Time = GetGameTimer()
- end
- end
- end)
end)
diff --git a/[esx]/esx_menu_dialog/LICENSE b/[esx]/esx_menu_dialog/LICENSE
index fe750f87..5d570bfa 100644
--- a/[esx]/esx_menu_dialog/LICENSE
+++ b/[esx]/esx_menu_dialog/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_menu_dialog
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_menu_dialog Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_menu_dialog Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/esx_menu_dialog/README.md b/[esx]/esx_menu_dialog/README.md
index df9a896f..a6af27e7 100644
--- a/[esx]/esx_menu_dialog/README.md
+++ b/[esx]/esx_menu_dialog/README.md
@@ -29,7 +29,7 @@ start esx_menu_dialog
### License
esx_menu_dialog - input dialog for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx]/esx_menu_dialog/client/main.lua b/[esx]/esx_menu_dialog/client/main.lua
index 8afb263f..b7662af3 100644
--- a/[esx]/esx_menu_dialog/client/main.lua
+++ b/[esx]/esx_menu_dialog/client/main.lua
@@ -1,105 +1,103 @@
+local ESX = exports.es_extended:getSharedObject()
+local Timeouts, OpenedMenus, MenuType = {}, {}, 'dialog'
+
+local openMenu = function(namespace, name, data)
+ for i=1, #Timeouts, 1 do
+ ESX.ClearTimeout(Timeouts[i])
+ end
+
+ OpenedMenus[namespace .. '_' .. name] = true
+
+ SendNUIMessage({
+ action = 'openMenu',
+ namespace = namespace,
+ name = name,
+ data = data
+ })
+
+ local timeoutId = ESX.SetTimeout(200, function()
+ SetNuiFocus(true, true)
+ end)
+
+ table.insert(Timeouts, timeoutId)
+end
+
+local closeMenu = function(namespace, name)
+ OpenedMenus[namespace .. '_' .. name] = nil
+
+ SendNUIMessage({
+ action = 'closeMenu',
+ namespace = namespace,
+ name = name,
+ data = data
+ })
+
+ if ESX.Table.SizeOf(OpenedMenus) == 0 then
+ SetNuiFocus(false)
+ end
+
+end
+
+ESX.UI.Menu.RegisterType(MenuType, openMenu, closeMenu)
+
+AddEventHandler('esx_menu_dialog:message:menu_submit', function(data)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+ local cancel = false
+
+ if menu.submit then
+ -- is the submitted data a number?
+ if tonumber(data.value) then
+ data.value = ESX.Math.Round(tonumber(data.value))
+
+ -- check for negative value
+ if tonumber(data.value) <= 0 then
+ cancel = true
+ end
+ end
+
+ data.value = ESX.Math.Trim(data.value)
+
+ -- don't submit if the value is negative or if it's 0
+ if cancel then
+ ESX.ShowNotification('That input is not allowed!')
+ else
+ menu.submit(data, menu)
+ end
+ end
+end)
+
+AddEventHandler('esx_menu_dialog:message:menu_cancel', function(data)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+
+ if menu.cancel ~= nil then
+ menu.cancel(data, menu)
+ end
+end)
+
+AddEventHandler('esx_menu_dialog:message:menu_change', function(data)
+ local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
+
+ if menu.change ~= nil then
+ menu.change(data, menu)
+ end
+end)
+
Citizen.CreateThread(function()
- local ESX = exports['es_extended']:getSharedObject()
- local Timeouts, OpenedMenus, MenuType = {}, {}, 'dialog'
+ while true do
+ Citizen.Wait(10)
- local openMenu = function(namespace, name, data)
- for i=1, #Timeouts, 1 do
- ESX.ClearTimeout(Timeouts[i])
+ if ESX.Table.SizeOf(OpenedMenus) > 0 then
+ DisableControlAction(0, 1, true) -- LookLeftRight
+ DisableControlAction(0, 2, true) -- LookUpDown
+ DisableControlAction(0, 142, true) -- MeleeAttackAlternate
+ DisableControlAction(0, 106, true) -- VehicleMouseControlOverride
+ DisableControlAction(0, 12, true) -- WeaponWheelUpDown
+ DisableControlAction(0, 14, true) -- WeaponWheelNext
+ DisableControlAction(0, 15, true) -- WeaponWheelPrev
+ DisableControlAction(0, 16, true) -- SelectNextWeapon
+ DisableControlAction(0, 17, true) -- SelectPrevWeapon
+ else
+ Citizen.Wait(500)
end
-
- OpenedMenus[namespace .. '_' .. name] = true
-
- SendNUIMessage({
- action = 'openMenu',
- namespace = namespace,
- name = name,
- data = data
- })
-
- local timeoutId = ESX.SetTimeout(200, function()
- SetNuiFocus(true, true)
- end)
-
- table.insert(Timeouts, timeoutId)
end
-
- local closeMenu = function(namespace, name)
- OpenedMenus[namespace .. '_' .. name] = nil
-
- SendNUIMessage({
- action = 'closeMenu',
- namespace = namespace,
- name = name,
- data = data
- })
-
- if ESX.Table.SizeOf(OpenedMenus) == 0 then
- SetNuiFocus(false)
- end
-
- end
-
- ESX.UI.Menu.RegisterType(MenuType, openMenu, closeMenu)
-
- AddEventHandler('esx_menu_dialog:message:menu_submit', function(data)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
- local cancel = false
-
- if menu.submit then
- -- is the submitted data a number?
- if tonumber(data.value) then
- data.value = ESX.Math.Round(tonumber(data.value))
-
- -- check for negative value
- if tonumber(data.value) <= 0 then
- cancel = true
- end
- end
-
- data.value = ESX.Math.Trim(data.value)
-
- -- don't submit if the value is negative or if it's 0
- if cancel then
- ESX.ShowNotification('That input is not allowed!')
- else
- menu.submit(data, menu)
- end
- end
- end)
-
- AddEventHandler('esx_menu_dialog:message:menu_cancel', function(data)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
-
- if menu.cancel ~= nil then
- menu.cancel(data, menu)
- end
- end)
-
- AddEventHandler('esx_menu_dialog:message:menu_change', function(data)
- local menu = ESX.UI.Menu.GetOpened(MenuType, data._namespace, data._name)
-
- if menu.change ~= nil then
- menu.change(data, menu)
- end
- end)
-
- Citizen.CreateThread(function()
- while true do
- Citizen.Wait(10)
-
- if ESX.Table.SizeOf(OpenedMenus) > 0 then
- DisableControlAction(0, 1, true) -- LookLeftRight
- DisableControlAction(0, 2, true) -- LookUpDown
- DisableControlAction(0, 142, true) -- MeleeAttackAlternate
- DisableControlAction(0, 106, true) -- VehicleMouseControlOverride
- DisableControlAction(0, 12, true) -- WeaponWheelUpDown
- DisableControlAction(0, 14, true) -- WeaponWheelNext
- DisableControlAction(0, 15, true) -- WeaponWheelPrev
- DisableControlAction(0, 16, true) -- SelectNextWeapon
- DisableControlAction(0, 17, true) -- SelectPrevWeapon
- else
- Citizen.Wait(500)
- end
- end
- end)
end)
\ No newline at end of file
diff --git a/[esx]/esx_menu_list/LICENSE b/[esx]/esx_menu_list/LICENSE
index f258a3b7..65d7dded 100644
--- a/[esx]/esx_menu_list/LICENSE
+++ b/[esx]/esx_menu_list/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_menu_list
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_menu_list Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_menu_list Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/esx_menu_list/README.md b/[esx]/esx_menu_list/README.md
index 99c2f79c..7f8d2802 100644
--- a/[esx]/esx_menu_list/README.md
+++ b/[esx]/esx_menu_list/README.md
@@ -29,7 +29,7 @@ start esx_menu_list
### License
esx_menu_list - advanced menu inputs for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx]/esx_skin/LICENSE b/[esx]/esx_skin/LICENSE
index 73d52ac8..a8eb3e5f 100644
--- a/[esx]/esx_skin/LICENSE
+++ b/[esx]/esx_skin/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_skin
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_skin Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_skin Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/esx_skin/README.md b/[esx]/esx_skin/README.md
index 309bb0c0..6b73bdac 100644
--- a/[esx]/esx_skin/README.md
+++ b/[esx]/esx_skin/README.md
@@ -32,7 +32,7 @@ start esx_skin
### License
esx_skin - skin selector for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx]/esx_skin/fxmanifest.lua b/[esx]/esx_skin/fxmanifest.lua
index 34ecaff3..f41346c3 100644
--- a/[esx]/esx_skin/fxmanifest.lua
+++ b/[esx]/esx_skin/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/de.lua',
'locales/br.lua',
diff --git a/[esx]/esx_skin/server/main.lua b/[esx]/esx_skin/server/main.lua
index 01dbba3e..18460ca2 100644
--- a/[esx]/esx_skin/server/main.lua
+++ b/[esx]/esx_skin/server/main.lua
@@ -10,7 +10,7 @@ AddEventHandler('esx_skin:save', function(skin)
xPlayer.setMaxWeight(defaultMaxWeight)
end
- MySQL.Async.execute('UPDATE users SET skin = @skin WHERE identifier = @identifier', {
+ MySQL.update('UPDATE users SET skin = @skin WHERE identifier = @identifier', {
['@skin'] = json.encode(skin),
['@identifier'] = xPlayer.identifier
})
@@ -34,7 +34,7 @@ end)
ESX.RegisterServerCallback('esx_skin:getPlayerSkin', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT skin FROM users WHERE identifier = @identifier', {
+ MySQL.query('SELECT skin FROM users WHERE identifier = @identifier', {
['@identifier'] = xPlayer.identifier
}, function(users)
local user, skin = users[1]
diff --git a/[esx]/skinchanger/LICENSE b/[esx]/skinchanger/LICENSE
index b087d524..22b3a7be 100644
--- a/[esx]/skinchanger/LICENSE
+++ b/[esx]/skinchanger/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
skinchanger
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- skinchanger Copyright (C) 2015-2021 Jérémie N'gadi
+ skinchanger Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx]/skinchanger/README.md b/[esx]/skinchanger/README.md
index 748ae6b9..6bf24f50 100644
--- a/[esx]/skinchanger/README.md
+++ b/[esx]/skinchanger/README.md
@@ -94,7 +94,7 @@ end)
### License
skinchanger - make your own skin!
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_accessories/LICENSE b/[esx_addons]/esx_accessories/LICENSE
index e6da8029..c990bf6d 100644
--- a/[esx_addons]/esx_accessories/LICENSE
+++ b/[esx_addons]/esx_accessories/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_accessories
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_accessories Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_accessories Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_accessories/README.md b/[esx_addons]/esx_accessories/README.md
index 9dd93907..ef4ea00b 100644
--- a/[esx_addons]/esx_accessories/README.md
+++ b/[esx_addons]/esx_accessories/README.md
@@ -37,7 +37,7 @@ start esx_accessories
### License
esx_accessories - buy some shiny stuff!
-Copyright (C) 2015-2021 Lenaic Corbeau
+Copyright (C) 2015-2022Lenaic Corbeau
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_accessories/fxmanifest.lua b/[esx_addons]/esx_accessories/fxmanifest.lua
index a1d13121..5bf4dcb1 100644
--- a/[esx_addons]/esx_accessories/fxmanifest.lua
+++ b/[esx_addons]/esx_accessories/fxmanifest.lua
@@ -18,6 +18,7 @@ server_scripts {
'locales/sv.lua',
'locales/cs.lua',
'locales/pl.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -32,6 +33,7 @@ client_scripts {
'locales/sv.lua',
'locales/cs.lua',
'locales/pl.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua'
}
diff --git a/[esx_addons]/esx_accessories/locales/hu.lua b/[esx_addons]/esx_accessories/locales/hu.lua
new file mode 100644
index 00000000..8c0458e8
--- /dev/null
+++ b/[esx_addons]/esx_accessories/locales/hu.lua
@@ -0,0 +1,19 @@
+Locales ['hu'] = {
+ ['valid_purchase'] = 'Biztosan megveszed?',
+ ['yes'] = 'Igen ($%s)',
+ ['no'] = 'Nem',
+ ['helmet'] = 'sisak / kalap',
+ ['glasses'] = 'szemüveg',
+ ['mask'] = 'maszk',
+ ['ears'] = 'fül tartozékok',
+ ['shop'] = '%s bolt',
+ ['set_unset'] = 'Felvenni / Levenni',
+ ['not_enough_money'] = 'Nincsen elég pénzed',
+ ['press_access'] = 'Nyomj ~INPUT_CONTEXT~ hogy megnyisd a kiegészítöket',
+ ['accessories_blip'] = 'Kiegészítők',
+ ['no_ears'] = 'Nincsen fülbevalód',
+ ['no_glasses'] = 'Nincsen szemüveged',
+ ['no_helmet'] = 'Nincsen sapkád',
+ ['no_mask'] = 'Nincsen maszkod',
+ ['you_paid'] = 'Fizettél ~g~$%s~s~',
+}
diff --git a/[esx_addons]/esx_addonaccount/LICENSE b/[esx_addons]/esx_addonaccount/LICENSE
index 4ec26eb3..84e62eb2 100644
--- a/[esx_addons]/esx_addonaccount/LICENSE
+++ b/[esx_addons]/esx_addonaccount/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_addonaccount
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_addonaccount Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_addonaccount Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_addonaccount/README.md b/[esx_addons]/esx_addonaccount/README.md
index dff7e315..0b8a9acc 100644
--- a/[esx_addons]/esx_addonaccount/README.md
+++ b/[esx_addons]/esx_addonaccount/README.md
@@ -52,7 +52,7 @@ end)
### License
esx_addonaccount - addon account for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_addonaccount/fxmanifest.lua b/[esx_addons]/esx_addonaccount/fxmanifest.lua
index ae6a5ebf..e69a6599 100644
--- a/[esx_addons]/esx_addonaccount/fxmanifest.lua
+++ b/[esx_addons]/esx_addonaccount/fxmanifest.lua
@@ -8,7 +8,7 @@ version 'legacy'
server_scripts {
'@es_extended/imports.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'server/classes/addonaccount.lua',
'server/main.lua'
}
diff --git a/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua b/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua
index 7f082cd4..df099306 100644
--- a/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua
+++ b/[esx_addons]/esx_addonaccount/server/classes/addonaccount.lua
@@ -8,37 +8,25 @@ function CreateAddonAccount(name, owner, money)
self.addMoney = function(m)
self.money = self.money + m
self.save()
-
- TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.removeMoney = function(m)
self.money = self.money - m
self.save()
-
- TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.setMoney = function(m)
self.money = m
self.save()
-
- TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
self.save = function()
if self.owner == nil then
- MySQL.Async.execute('UPDATE addon_account_data SET money = @money WHERE account_name = @account_name', {
- ['@account_name'] = self.name,
- ['@money'] = self.money
- })
+ MySQL.update('UPDATE addon_account_data SET money = ? WHERE account_name = ?', {self.money, self.name})
else
- MySQL.Async.execute('UPDATE addon_account_data SET money = @money WHERE account_name = @account_name AND owner = @owner', {
- ['@account_name'] = self.name,
- ['@money'] = self.money,
- ['@owner'] = self.owner
- })
+ MySQL.update('UPDATE addon_account_data SET money = ? WHERE account_name = ? AND owner = ?', {self.money, self.name, self.owner})
end
+ TriggerClientEvent('esx_addonaccount:setMoney', -1, self.name, self.money)
end
return self
diff --git a/[esx_addons]/esx_addonaccount/server/main.lua b/[esx_addons]/esx_addonaccount/server/main.lua
index 26172ea4..39a580fe 100644
--- a/[esx_addons]/esx_addonaccount/server/main.lua
+++ b/[esx_addons]/esx_addonaccount/server/main.lua
@@ -1,41 +1,33 @@
local AccountsIndex, Accounts, SharedAccounts = {}, {}, {}
-MySQL.ready(function()
- local result = MySQL.Sync.fetchAll('SELECT * FROM addon_account')
+AddEventHandler('onResourceStart', function(resourceName)
+ if resourceName == GetCurrentResourceName() then
+ local accounts = MySQL.query.await('SELECT * FROM addon_account LEFT JOIN addon_account_data ON addon_account.name = addon_account_data.account_name UNION SELECT * FROM addon_account RIGHT JOIN addon_account_data ON addon_account.name = addon_account_data.account_name')
- for i=1, #result, 1 do
- local name = result[i].name
- local label = result[i].label
- local shared = result[i].shared
-
- local result2 = MySQL.Sync.fetchAll('SELECT * FROM addon_account_data WHERE account_name = @account_name', {
- ['@account_name'] = name
- })
-
- if shared == 0 then
- table.insert(AccountsIndex, name)
- Accounts[name] = {}
-
- for j=1, #result2, 1 do
- local addonAccount = CreateAddonAccount(name, result2[j].owner, result2[j].money)
- table.insert(Accounts[name], addonAccount)
- end
- else
- local money = nil
-
- if #result2 == 0 then
- MySQL.Sync.execute('INSERT INTO addon_account_data (account_name, money, owner) VALUES (@account_name, @money, NULL)', {
- ['@account_name'] = name,
- ['@money'] = 0
- })
-
- money = 0
+ local newAccounts = {}
+ for i = 1, #accounts do
+ local account = accounts[i]
+ if account.shared == 0 then
+ if not Accounts[account.name] then
+ AccountsIndex[#AccountsIndex + 1] = account.name
+ Accounts[account.name] = {}
+ end
+ Accounts[account.name][#Accounts[account.name] + 1] = CreateAddonAccount(account.name, account.owner, account.money)
else
- money = result2[1].money
+ if account.money then
+ SharedAccounts[account.name] = CreateAddonAccount(account.name, nil, account.money)
+ else
+ newAccounts[#newAccounts + 1] = {account.name, 0}
+ end
end
+ end
- local addonAccount = CreateAddonAccount(name, nil, money)
- SharedAccounts[name] = addonAccount
+ if next(newAccounts) then
+ MySQL.prepare('INSERT INTO addon_account_data (account_name, money) VALUES (?, ?)', newAccounts)
+ for i = 1, #newAccounts do
+ local newAccount = newAccounts[i]
+ SharedAccounts[newAccount[1]] = CreateAddonAccount(newAccount[1], nil, 0)
+ end
end
end
end)
@@ -68,17 +60,13 @@ AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
local account = GetAccount(name, xPlayer.identifier)
if account == nil then
- MySQL.Async.execute('INSERT INTO addon_account_data (account_name, money, owner) VALUES (@account_name, @money, @owner)', {
- ['@account_name'] = name,
- ['@money'] = 0,
- ['@owner'] = xPlayer.identifier
- })
+ MySQL.insert('INSERT INTO addon_account_data (account_name, money, owner) VALUES (?, ?, ?)', {name, 0, xPlayer.identifier})
account = CreateAddonAccount(name, xPlayer.identifier, 0)
- table.insert(Accounts[name], account)
+ Accounts[name][#Accounts[name] + 1] = account
end
- table.insert(addonAccounts, account)
+ addonAccounts[#addonAccounts + 1] = account
end
xPlayer.set('addonAccounts', addonAccounts)
diff --git a/[esx_addons]/esx_addoninventory/LICENSE b/[esx_addons]/esx_addoninventory/LICENSE
index 107773f4..b13054b5 100644
--- a/[esx_addons]/esx_addoninventory/LICENSE
+++ b/[esx_addons]/esx_addoninventory/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_addoninventory
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_addoninventory Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_addoninventory Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_addoninventory/README.md b/[esx_addons]/esx_addoninventory/README.md
index 8c7445e0..bb901bc5 100644
--- a/[esx_addons]/esx_addoninventory/README.md
+++ b/[esx_addons]/esx_addoninventory/README.md
@@ -52,7 +52,7 @@ end)
### License
esx_addoninventory - inventories!
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_addoninventory/fxmanifest.lua b/[esx_addons]/esx_addoninventory/fxmanifest.lua
index ce07097a..e28543f3 100644
--- a/[esx_addons]/esx_addoninventory/fxmanifest.lua
+++ b/[esx_addons]/esx_addoninventory/fxmanifest.lua
@@ -8,7 +8,7 @@ version 'legacy'
server_scripts {
'@es_extended/imports.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'server/classes/addoninventory.lua',
'server/main.lua'
}
diff --git a/[esx_addons]/esx_addoninventory/server/classes/addoninventory.lua b/[esx_addons]/esx_addoninventory/server/classes/addoninventory.lua
index e4f02a2c..5955ca72 100644
--- a/[esx_addons]/esx_addoninventory/server/classes/addoninventory.lua
+++ b/[esx_addons]/esx_addoninventory/server/classes/addoninventory.lua
@@ -42,14 +42,14 @@ function CreateAddonInventory(name, owner, items)
table.insert(self.items, item)
if self.owner == nil then
- MySQL.Async.execute('INSERT INTO addon_inventory_items (inventory_name, name, count) VALUES (@inventory_name, @item_name, @count)',
+ MySQL.update('INSERT INTO addon_inventory_items (inventory_name, name, count) VALUES (@inventory_name, @item_name, @count)',
{
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = 0
})
else
- MySQL.Async.execute('INSERT INTO addon_inventory_items (inventory_name, name, count, owner) VALUES (@inventory_name, @item_name, @count, @owner)',
+ MySQL.update('INSERT INTO addon_inventory_items (inventory_name, name, count, owner) VALUES (@inventory_name, @item_name, @count, @owner)',
{
['@inventory_name'] = self.name,
['@item_name'] = name,
@@ -63,13 +63,13 @@ function CreateAddonInventory(name, owner, items)
self.saveItem = function(name, count)
if self.owner == nil then
- MySQL.Async.execute('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name', {
+ MySQL.update('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name', {
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = count
})
else
- MySQL.Async.execute('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name AND owner = @owner', {
+ MySQL.update('UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name AND owner = @owner', {
['@inventory_name'] = self.name,
['@item_name'] = name,
['@count'] = count,
diff --git a/[esx_addons]/esx_addoninventory/server/main.lua b/[esx_addons]/esx_addoninventory/server/main.lua
index e9193177..509da8a3 100644
--- a/[esx_addons]/esx_addoninventory/server/main.lua
+++ b/[esx_addons]/esx_addoninventory/server/main.lua
@@ -2,20 +2,20 @@ Items = {}
local InventoriesIndex, Inventories, SharedInventories = {}, {}, {}
MySQL.ready(function()
- local items = MySQL.Sync.fetchAll('SELECT * FROM items')
+ local items = MySQL.query.await('SELECT * FROM items')
for i=1, #items, 1 do
Items[items[i].name] = items[i].label
end
- local result = MySQL.Sync.fetchAll('SELECT * FROM addon_inventory')
+ local result = MySQL.query.await('SELECT * FROM addon_inventory')
for i=1, #result, 1 do
local name = result[i].name
local label = result[i].label
local shared = result[i].shared
- local result2 = MySQL.Sync.fetchAll('SELECT * FROM addon_inventory_items WHERE inventory_name = @inventory_name', {
+ local result2 = MySQL.query.await('SELECT * FROM addon_inventory_items WHERE inventory_name = @inventory_name', {
['@inventory_name'] = name
})
diff --git a/[esx_addons]/esx_ambulancejob/LICENSE b/[esx_addons]/esx_ambulancejob/LICENSE
index 46c7df66..5b386246 100644
--- a/[esx_addons]/esx_ambulancejob/LICENSE
+++ b/[esx_addons]/esx_ambulancejob/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_ambulancejob
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_ambulancejob Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_ambulancejob Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_ambulancejob/README.md b/[esx_addons]/esx_ambulancejob/README.md
index 79a37642..7e7a53e5 100644
--- a/[esx_addons]/esx_ambulancejob/README.md
+++ b/[esx_addons]/esx_ambulancejob/README.md
@@ -44,7 +44,7 @@ start esx_ambulancejob
### License
esx_ambulancejob - ambulance script for fivem
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_ambulancejob/client/main.lua b/[esx_addons]/esx_ambulancejob/client/main.lua
index a5d382c0..5a736fe0 100644
--- a/[esx_addons]/esx_ambulancejob/client/main.lua
+++ b/[esx_addons]/esx_ambulancejob/client/main.lua
@@ -26,14 +26,14 @@ AddEventHandler('esx:onPlayerSpawn', function()
if firstSpawn then
firstSpawn = false
- if Config.AntiCombatLog then
+ if Config.SaveDeathStatus then
while not ESX.PlayerLoaded do
Citizen.Wait(1000)
end
ESX.TriggerServerCallback('esx_ambulancejob:getDeathStatus', function(shouldDie)
if shouldDie then
- Citizen.Wait(5000)
+ Citizen.Wait(1000)
SetEntityHealth(PlayerPedId(), 0)
end
end)
diff --git a/[esx_addons]/esx_ambulancejob/client/vehicle.lua b/[esx_addons]/esx_ambulancejob/client/vehicle.lua
index a14a6b33..0b2013ed 100644
--- a/[esx_addons]/esx_ambulancejob/client/vehicle.lua
+++ b/[esx_addons]/esx_ambulancejob/client/vehicle.lua
@@ -109,17 +109,17 @@ function OpenVehicleSpawnerMenu(type, hospital, part, partNum)
end
function StoreNearbyVehicle(playerCoords)
- local vehicles, vehiclePlates = ESX.Game.GetVehiclesInArea(playerCoords, 30.0), {}
-
- if #vehicles > 0 then
- for k,v in ipairs(vehicles) do
+ local vehicles, plates, index = ESX.Game.GetVehiclesInArea(playerCoords, 30.0), {}, {}
+ if next(vehicles) then
+ for i = 1, #vehicles do
+ local vehicle = vehicles[i]
+
-- Make sure the vehicle we're saving is empty, or else it wont be deleted
- if GetVehicleNumberOfPassengers(v) == 0 and IsVehicleSeatFree(v, -1) then
- table.insert(vehiclePlates, {
- vehicle = v,
- plate = ESX.Math.Trim(GetVehicleNumberPlateText(v))
- })
+ if GetVehicleNumberOfPassengers(vehicle) == 0 and IsVehicleSeatFree(vehicle, -1) then
+ local plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle))
+ plates[#plates + 1] = plate
+ index[plate] = vehicle
end
end
else
@@ -127,11 +127,11 @@ function StoreNearbyVehicle(playerCoords)
return
end
- ESX.TriggerServerCallback('esx_ambulancejob:storeNearbyVehicle', function(storeSuccess, foundNum)
- if storeSuccess then
- local vehicleId = vehiclePlates[foundNum]
+ ESX.TriggerServerCallback('esx_ambulancejob:storeNearbyVehicle', function(plate)
+ if plate then
+ local vehicleId = index[plate]
local attempts = 0
- ESX.Game.DeleteVehicle(vehicleId.vehicle)
+ ESX.Game.DeleteVehicle(vehicleId)
isBusy = true
Citizen.CreateThread(function()
@@ -142,7 +142,7 @@ function StoreNearbyVehicle(playerCoords)
end)
-- Workaround for vehicle not deleting when other players are near it.
- while DoesEntityExist(vehicleId.vehicle) do
+ while DoesEntityExist(vehicleId) do
Citizen.Wait(500)
attempts = attempts + 1
@@ -153,9 +153,10 @@ function StoreNearbyVehicle(playerCoords)
vehicles = ESX.Game.GetVehiclesInArea(playerCoords, 30.0)
if #vehicles > 0 then
- for k,v in ipairs(vehicles) do
- if ESX.Math.Trim(GetVehicleNumberPlateText(v)) == vehicleId.plate then
- ESX.Game.DeleteVehicle(v)
+ for i = 1, #vehicles do
+ local vehicle = vehicles[i]
+ if ESX.Math.Trim(GetVehicleNumberPlateText(vehicle)) == plate then
+ ESX.Game.DeleteVehicle(vehicle)
break
end
end
@@ -167,7 +168,7 @@ function StoreNearbyVehicle(playerCoords)
else
ESX.ShowNotification(_U('garage_has_notstored'))
end
- end, vehiclePlates)
+ end, plates)
end
function GetAvailableVehicleSpawnPoint(hospital, part, partNum)
diff --git a/[esx_addons]/esx_ambulancejob/config.lua b/[esx_addons]/esx_ambulancejob/config.lua
index 9993ff39..8b26ada4 100644
--- a/[esx_addons]/esx_ambulancejob/config.lua
+++ b/[esx_addons]/esx_ambulancejob/config.lua
@@ -5,7 +5,7 @@ Config.DrawDistance = 20.0 -- How close do you need to be in order
Config.Marker = {type = 1, x = 1.5, y = 1.5, z = 0.5, r = 102, g = 0, b = 102, a = 100, rotate = false}
Config.ReviveReward = 700 -- Revive reward, set to 0 if you don't want it enabled
-Config.AntiCombatLog = true -- Enable anti-combat logging? (Removes Items when a player logs back after intentionally logging out while dead.)
+Config.SaveDeathStatus = true -- Save Death Status?
Config.LoadIpl = true -- Disable if you're using fivem-ipl or other IPL loaders
Config.Locale = 'en'
diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua
index b207a63a..53f3cc05 100644
--- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua
+++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/br.lua',
'locales/en.lua',
@@ -22,6 +22,7 @@ server_scripts {
'locales/cs.lua',
'locales/nl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -38,6 +39,7 @@ client_scripts {
'locales/cs.lua',
'locales/nl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua',
'client/job.lua',
diff --git a/[esx_addons]/esx_ambulancejob/locales/br.lua b/[esx_addons]/esx_ambulancejob/locales/br.lua
index dead693d..58284626 100644
--- a/[esx_addons]/esx_ambulancejob/locales/br.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/br.lua
@@ -71,7 +71,7 @@ Locales['br'] = {
['respawn_bleedout_fine_msg'] = 'você precisa pagar ~r~$%s~s~ para reviver',
['distress_send'] = 'pressione [~b~G~s~] enviar sinal de socorro',
['distress_sent'] = 'sinal de socorro foi enviado para as unidades disponíveis!',
- ['combatlog_message'] = 'você foi revivido porque deixou o servidor anteriormente quando estava morto.',
+
-- Revive
['revive_help'] = 'reviver um cidadão',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/cs.lua b/[esx_addons]/esx_ambulancejob/locales/cs.lua
index dfc9a125..4462052b 100644
--- a/[esx_addons]/esx_ambulancejob/locales/cs.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/cs.lua
@@ -71,7 +71,6 @@ Locales['cs'] = {
['respawn_bleedout_fine_msg'] = 'zaplatili jste ~r~$%s~s~ za respawn.',
['distress_send'] = 'stiskněte [~b~G~s~] pro vyslání tísňového signálu',
['distress_sent'] = 'tísňový signál byl vyslán dostupným jednotkám!',
- ['combatlog_message'] = 'byli jste násilně oživeni, protože jste předtím opustili server, když jste byli mrtví.',
-- Revive
['revive_help'] = 'oživit hráče',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/de.lua b/[esx_addons]/esx_ambulancejob/locales/de.lua
index 3da9bbdf..efa572cf 100644
--- a/[esx_addons]/esx_ambulancejob/locales/de.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/de.lua
@@ -70,7 +70,6 @@ Locales['de'] = {
['respawn_bleedout_fine_msg'] = 'Du hast ~r~$%s~s~ bezahlt, um zu respawnen.',
['distress_send'] = 'Drücke [~b~G~s~] um ein Notsignal zu senden',
['distress_sent'] = 'Notsignal wurde an den Rettungsdienst übermittelt!',
- ['combatlog_message'] = 'Du wurdest respawnt, da du den Server verlassen hast, als du gestorben bist.',
-- Revive
['revive_help'] = 'Belebe einen Spieler wieder',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/en.lua b/[esx_addons]/esx_ambulancejob/locales/en.lua
index d00b4ab4..80540568 100644
--- a/[esx_addons]/esx_ambulancejob/locales/en.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/en.lua
@@ -71,7 +71,6 @@ Locales['en'] = {
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
['distress_send'] = 'press [~b~G~s~] to send distress signal',
['distress_sent'] = 'distress signal has been sent to available units!',
- ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
-- Revive
['revive_help'] = 'revive a player',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/es.lua b/[esx_addons]/esx_ambulancejob/locales/es.lua
index 1a49ee32..fc947ade 100644
--- a/[esx_addons]/esx_ambulancejob/locales/es.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/es.lua
@@ -73,7 +73,7 @@ Locales['es'] = {
['respawn_bleedout_fine_msg'] = 'Tu pagaste ~r~$%s~s~ para reaparecer.',
['distress_send'] = 'Presiona [~b~G~s~] para enviar señal de socorro',
['distress_sent'] = 'Se ha enviado una señal de socorro a las unidades disponibles.',
- ['combatlog_message'] = 'Ha sido reaparecido a la fuerza porque anteriormente abandonó el servidor cuando estaba muerto.',
+
-- Revive
['revive_help'] = 'Revivir un jugador',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/fi.lua b/[esx_addons]/esx_ambulancejob/locales/fi.lua
index bc100b14..4c9b0b0e 100644
--- a/[esx_addons]/esx_ambulancejob/locales/fi.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/fi.lua
@@ -71,7 +71,6 @@ Locales['fi'] = {
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
['distress_send'] = 'press [~b~G~s~] to send distress signal',
['distress_sent'] = 'distress signal has been sent to available units!',
- ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
-- Revive
['revive_help'] = 'elvytä pelaaja',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/fr.lua b/[esx_addons]/esx_ambulancejob/locales/fr.lua
index b639cd85..07b4570d 100644
--- a/[esx_addons]/esx_ambulancejob/locales/fr.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/fr.lua
@@ -71,7 +71,6 @@ Locales['fr'] = {
['respawn_bleedout_fine_msg'] = 'vous avez payé ~r~$%s~s~ pour être réanimer.',
['distress_send'] = 'appuyez sur [~b~G~s~] pour envoyer un signal de détresse',
['distress_sent'] = 'un signal a été envoyé à toutes les unités disponibles!',
- ['combatlog_message'] = 'vous avez été réanimé de force car vous avez quitté le serveur.',
-- Revive
['revive_help'] = 'relancer un joueur',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/hu.lua b/[esx_addons]/esx_ambulancejob/locales/hu.lua
new file mode 100644
index 00000000..debffd18
--- /dev/null
+++ b/[esx_addons]/esx_ambulancejob/locales/hu.lua
@@ -0,0 +1,85 @@
+Locales['hu'] = {
+ -- Cloakroom
+ ['cloakroom'] = 'Öltöző',
+ ['ems_clothes_civil'] = 'Civil ruházat',
+ ['ems_clothes_ems'] = 'Munkaruha',
+ -- Vehicles
+ ['ambulance'] = 'Mentőautó',
+ ['helicopter_prompt'] = '~b~[Információ]:~s~ Nyomd meg az ~INPUT_CONTEXT~ gombot a helikopter listához.',
+ ['garage_prompt'] = '~b~[Információ]:~s~ Nyomd meg az ~INPUT_CONTEXT~ gombot a kocsi listához.',
+ ['garage_title'] = 'Autó funkciók',
+ ['garage_stored'] = 'Garázsba',
+ ['garage_notstored'] = 'Ismeretlen helyen',
+ ['garage_storing'] = 'Próbáljuk betteni a kocsid a garázsodba, de előtte nézz körül, hogy biztos nincs melletted senki',
+ ['garage_has_stored'] = '~b~[Információ]:~s~ Sikeresen tároltad a garázsba!',
+ ['garage_has_notstored'] = '~r~[Információ]:~s~ Nincs a közeledben semmi!',
+ ['garage_notavailable'] = '~r~[Információ]:~s~ Nem tárolhatod a garázsba!',
+ ['garage_blocked'] = '~r~[Információ]:~s~ Valami gátolja a kocsi lehívását!',
+ ['garage_empty'] = '~r~[Információ]:~s~ Nem teheted a garázsba!',
+ ['garage_released'] = '~b~[Információ]:~s~ Sikeresen kivetted!',
+ ['garage_store_nearby'] = '~r~[Információ]:~s~ Nincs a közeledben semmi!',
+ ['garage_storeditem'] = 'Garázs megnyitása',
+ ['garage_storeitem'] = 'Kocsi berakása a garázsba',
+ ['garage_buyitem'] = 'Kocsi igénylés',
+ ['shop_item'] = '$%s',
+ ['vehicleshop_title'] = 'Autókereskedés',
+ ['vehicleshop_confirm'] = 'Megszeretnéd venni ezt a járművet?',
+ ['vehicleshop_bought'] = '~b~[Információ]:~s~ Sikeresen igényeltél egy ~b~%s~s~ ennyiért: ~r~%s~s~$',
+ ['vehicleshop_money'] = '~r~[Információ]:~s~ Ezt most nem tudod megtenni!',
+ ['vehicleshop_awaiting_model'] = 'Betöltés..',
+ ['confirm_no'] = 'Vissza',
+ ['confirm_yes'] = 'Igényel',
+ -- Action Menu
+ ['revive_inprogress'] = '~b~[Információ]:~s~ Elkezdted az újraélesztést!',
+ ['revive_complete'] = '~b~[Információ]:~s~ Újraélesztetted: ~b~%s~s~',
+ ['revive_complete_award'] = '~b~[Információ]:~s~ Újraélesztetted: ~b~%s~s~ játékost.',
+ ['revive_fail_offline'] = 'A játékos nem elérhető',
+ ['heal_inprogress'] = '~b~[Információ]:~s~ Elkezdted a gyógyítást!',
+ ['heal_complete'] = '~b~[Információ]:~s~ Meggyógyítottad: ~b~%s~s~ játékost.',
+ ['no_players'] = '~r~[Információ]:~s~ Nincs a közeledben senki!',
+ ['player_not_unconscious'] = '~b~[Információ]:~s~ A játékos nincs öntudatánál!',
+ ['player_not_conscious'] = '~b~[Információ]:~s~ A játékos nincs öntudatánál!',
+ -- Boss Menu
+ ['boss_actions'] = 'Leader panel',
+ -- Misc
+ ['invalid_amount'] = '~r~Érvénytelen mennyiség',
+ ['actions_prompt'] = '~b~[Információ]:~s~ Nyomd meg az ~INPUT_CONTEXT~ gombot a panel megnyitásához.',
+ ['deposit_amount'] = 'Összeg betétele',
+ ['money_withdraw'] = 'Összeg kivétele',
+ ['fast_travel'] = 'Nyomj ~INPUT_CONTEXT~ hogy használd a liftet',
+ ['open_pharmacy'] = '~b~[Információ]:~s~ Nyomd meg az ~INPUT_CONTEXT~ gombot a gyógyszer kivételéhez.',
+ ['pharmacy_menu_title'] = 'Kellékek',
+ ['pharmacy_take'] = 'Kivétel: %s',
+ ['medikit'] = 'Elsősegély készlet',
+ ['bandage'] = 'Kötszer',
+ ['max_item'] = '~r~[Információ]:~s~ Nem fér már el nálad!',
+ -- F6 Menu
+ ['ems_menu'] = 'EMS menü',
+ ['ems_menu_title'] = 'EMS Menu',
+ ['ems_menu_revive'] = 'Újraélesztés',
+ ['ems_menu_putincar'] = 'Jármübe rakás',
+ ['ems_menu_small'] = 'Kis sebek meggyógyítása',
+ ['ems_menu_big'] = 'Súlyos sérülések kezelése',
+ ['ems_menu_search'] = 'Civil megkeresése',
+ -- Phone
+ ['alert_ambulance'] = 'EMS értesités',
+ -- Death
+ ['respawn_available_in'] = 'Újraéledés: ~r~%s : %s',
+ ['respawn_bleedout_in'] = 'Elfogsz vérezni ~b~%s perc %s másodperc~s~ múlva...\n',
+ ['respawn_bleedout_prompt'] = 'Nyomd meg az ~b~[E]~s~ gombot az újraéledéshez',
+ ['respawn_bleedout_fine'] = 'Újraéledéshez: ~b~[E]~s~',
+ ['respawn_bleedout_fine_msg'] = '~b~[Információ]:Ennyit fizettél ~r~$%s~s~, hogy újraéledj',
+ ['distress_send'] = 'Nyomd meg a ~r~[G]~s~ gombot a segítségkéréshez',
+ ['distress_sent'] = '~b~[Információ]:~s~ Egy civil értesítette az illetékes szervezetet!',
+ -- Revive
+ ['revive_help'] = 'újraéleszteni egy játékos',
+ -- Item
+ ['used_medikit'] = '~b~[Információ]:~s~ Elhasználtál ~b~1x Segélytáskát~s~.',
+ ['used_bandage'] = '~b~[Információ]:~s~ Elhasználtál ~b~1x Kötszert~s~.',
+ ['not_enough_medikit'] = '~r~[Információ]:~s~ Nincs nálad: ~b~Defibrillátor~s~.',
+ ['not_enough_bandage'] = '~r~[Információ]:~s~ Nincs nálad: ~b~Kötszer~s~.',
+ ['healed'] = '~b~[Információ]:~s~ Meggyógyítottak!',
+ -- Blips
+ ['blip_hospital'] = 'Korház',
+ ['blip_dead'] = 'Eszméletlen játékos',
+}
diff --git a/[esx_addons]/esx_ambulancejob/locales/nl.lua b/[esx_addons]/esx_ambulancejob/locales/nl.lua
index 91b54447..3efb3300 100644
--- a/[esx_addons]/esx_ambulancejob/locales/nl.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/nl.lua
@@ -70,7 +70,6 @@ Locales['nl'] = {
['respawn_bleedout_fine_msg'] = 'Je hebt ~r~€%s~s~ betaald om te respawnen.',
['distress_send'] = 'Druk op [~b~G~s~] om een noodsignaal te verzenden',
['distress_sent'] = 'Noodsignaal verzonden naar alle beschikbare eenheden!',
- ['combatlog_message'] = 'Je bent gerespawned omdat je uitgelogt bent terwijl je dood was.',
-- Revive
['revive_help'] = 'Revive een speler',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/pl.lua b/[esx_addons]/esx_ambulancejob/locales/pl.lua
index 80b1378b..d6b706cf 100644
--- a/[esx_addons]/esx_ambulancejob/locales/pl.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/pl.lua
@@ -71,7 +71,6 @@ Locales['pl'] = {
['respawn_bleedout_fine_msg'] = 'you paid ~r~$%s~s~ to respawn.',
['distress_send'] = 'press [~b~G~s~] to send distress signal',
['distress_sent'] = 'distress signal has been sent to available units!',
- ['combatlog_message'] = 'you have been force-respawned because you\'ve previously left the server when dead.',
-- Revive
['revive_help'] = 'ożyw gracza',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/sv.lua b/[esx_addons]/esx_ambulancejob/locales/sv.lua
index 26b244f5..45eb082a 100644
--- a/[esx_addons]/esx_ambulancejob/locales/sv.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/sv.lua
@@ -71,7 +71,6 @@ Locales['sv'] = {
['respawn_bleedout_fine_msg'] = 'du betalade ~r~%s SEK~s~ för att respawna.',
['distress_send'] = 'tryck ~b~[G]~s~ för att skicka nödsignal',
['distress_sent'] = 'nödsignal har skickats till samtliga enheter!',
- ['combatlog_message'] = 'du har force-respawnats på grund av att du lämnat servern medans du var död',
-- Revive
['revive_help'] = 'återuppliva en spelare',
-- Item
diff --git a/[esx_addons]/esx_ambulancejob/locales/tr.lua b/[esx_addons]/esx_ambulancejob/locales/tr.lua
index 024bda63..899b6466 100644
--- a/[esx_addons]/esx_ambulancejob/locales/tr.lua
+++ b/[esx_addons]/esx_ambulancejob/locales/tr.lua
@@ -70,8 +70,6 @@ Locales['tr'] = {
['respawn_bleedout_fine_msg'] = 'yeniden doğmak için ~r~$%s~s~ ödediniz.',
['distress_send'] = 'acile sinyal göndermek için [~b~G~s~] basın',
['distress_sent'] = 'acil durum sinyali gönderildi!',
- ['combatlog_message'] = 'daha önce öldüğünüzde sunucudan ayrıldığınız için zorunlu olarak yeniden doğdunuz.',
- -- Revive
['revive_help'] = 'oyuncuyu canlandır',
-- Item
['used_medikit'] = '~y~1x~s~ sağlık kiti kullanıldı.',
diff --git a/[esx_addons]/esx_ambulancejob/server/main.lua b/[esx_addons]/esx_ambulancejob/server/main.lua
index ee7a5b7c..ed70c75b 100644
--- a/[esx_addons]/esx_ambulancejob/server/main.lua
+++ b/[esx_addons]/esx_ambulancejob/server/main.lua
@@ -178,14 +178,8 @@ ESX.RegisterServerCallback('esx_ambulancejob:buyJobVehicle', function(source, cb
if xPlayer.getMoney() >= price then
xPlayer.removeMoney(price)
- MySQL.Async.execute('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (@owner, @vehicle, @plate, @type, @job, @stored)', {
- ['@owner'] = xPlayer.identifier,
- ['@vehicle'] = json.encode(vehicleProps),
- ['@plate'] = vehicleProps.plate,
- ['@type'] = type,
- ['@job'] = xPlayer.job.name,
- ['@stored'] = true
- }, function (rowsChanged)
+ MySQL.insert('INSERT INTO owned_vehicles (owner, vehicle, plate, type, job, `stored`) VALUES (?, ?, ?, ?, ?, ?)', {xPlayer.identifier, json.encode(vehicleProps), vehicleProps.plate, type, xPlayer.job.name, true},
+ function (rowsChanged)
cb(true)
end)
else
@@ -194,46 +188,32 @@ ESX.RegisterServerCallback('esx_ambulancejob:buyJobVehicle', function(source, cb
end
end)
-ESX.RegisterServerCallback('esx_ambulancejob:storeNearbyVehicle', function(source, cb, nearbyVehicles)
+ESX.RegisterServerCallback('esx_ambulancejob:storeNearbyVehicle', function(source, cb, plates)
local xPlayer = ESX.GetPlayerFromId(source)
- local foundPlate, foundNum
- for k,v in ipairs(nearbyVehicles) do
- local result = MySQL.Sync.fetchAll('SELECT plate FROM owned_vehicles WHERE owner = @owner AND plate = @plate AND job = @job', {
- ['@owner'] = xPlayer.identifier,
- ['@plate'] = v.plate,
- ['@job'] = xPlayer.job.name
- })
+ local plate = MySQL.scalar.await('SELECT plate FROM owned_vehicles WHERE owner = ? AND plate IN (?) AND job = ?', {xPlayer.identifier, plates, xPlayer.job.name})
- if result[1] then
- foundPlate, foundNum = result[1].plate, k
- break
- end
- end
-
- if not foundPlate then
- cb(false)
- else
- MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = true WHERE owner = @owner AND plate = @plate AND job = @job', {
- ['@owner'] = xPlayer.identifier,
- ['@plate'] = foundPlate,
- ['@job'] = xPlayer.job.name
- }, function (rowsChanged)
+ if plate then
+ MySQL.update('UPDATE owned_vehicles SET `stored` = true WHERE owner = ? AND plate = ? AND job = ?', {xPlayer.identifier, plate, xPlayer.job.name},
+ function(rowsChanged)
if rowsChanged == 0 then
cb(false)
else
- cb(true, foundNum)
+ cb(plate)
end
end)
+ else
+ cb(false)
end
end)
function getPriceFromHash(vehicleHash, jobGrade, type)
local vehicles = Config.AuthorizedVehicles[type][jobGrade]
- for k,v in ipairs(vehicles) do
- if GetHashKey(v.model) == vehicleHash then
- return v.price
+ for i = 1, #vehicles do
+ local vehicle = vehicles[i]
+ if GetHashKey(vehicle.model) == vehicleHash then
+ return vehicle.price
end
end
@@ -277,6 +257,12 @@ end, true, {help = _U('revive_help'), validate = true, arguments = {
{name = 'playerId', help = 'The player id', type = 'player'}
}})
+ESX.RegisterCommand('reviveall', "admin", function(xPlayer, args, showError)
+ for _, playerId in ipairs(GetPlayers()) do
+ TriggerClientEvent('esx_ambulancejob:revive', playerId)
+ end
+end, false)
+
ESX.RegisterUsableItem('medikit', function(source)
if not playersHealing[source] then
local xPlayer = ESX.GetPlayerFromId(source)
@@ -305,16 +291,13 @@ end)
ESX.RegisterServerCallback('esx_ambulancejob:getDeathStatus', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
+ MySQL.scalar('SELECT is_dead FROM users WHERE identifier = ?', {xPlayer.identifier}, function(isDead)
- MySQL.Async.fetchScalar('SELECT is_dead FROM users WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier
- }, function(isDead)
-
- if isDead then
- print(('[esx_ambulancejob] [^2INFO^7] "%s" attempted combat logging'):format(xPlayer.identifier))
- end
-
- cb(isDead)
+ if isDead == 1 then
+ cb(true)
+ else
+ cb(false)
+ end
end)
end)
@@ -323,9 +306,6 @@ AddEventHandler('esx_ambulancejob:setDeathStatus', function(isDead)
local xPlayer = ESX.GetPlayerFromId(source)
if type(isDead) == 'boolean' then
- MySQL.Sync.execute('UPDATE users SET is_dead = @isDead WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier,
- ['@isDead'] = isDead
- })
+ MySQL.update('UPDATE users SET is_dead = ? WHERE identifier = ?', {isDead, xPlayer.identifier})
end
end)
diff --git a/[esx_addons]/esx_animations/LICENSE b/[esx_addons]/esx_animations/LICENSE
index b99379bf..caf36e98 100644
--- a/[esx_addons]/esx_animations/LICENSE
+++ b/[esx_addons]/esx_animations/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_animations
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_animations Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_animations Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_animations/README.md b/[esx_addons]/esx_animations/README.md
index ca823890..55451cd6 100644
--- a/[esx_addons]/esx_animations/README.md
+++ b/[esx_addons]/esx_animations/README.md
@@ -28,7 +28,7 @@ start esx_animations
### License
esx_animations - play anims!
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_atm/LICENSE b/[esx_addons]/esx_atm/LICENSE
index 5944b889..1a7441aa 100644
--- a/[esx_addons]/esx_atm/LICENSE
+++ b/[esx_addons]/esx_atm/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_atm
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_atm Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_atm Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_atm/README.md b/[esx_addons]/esx_atm/README.md
index 0aa3ebf8..b6c9a9bb 100644
--- a/[esx_addons]/esx_atm/README.md
+++ b/[esx_addons]/esx_atm/README.md
@@ -28,7 +28,7 @@ start esx_atm
### License
esx_atm - atm script for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_atm/client/main.lua b/[esx_addons]/esx_atm/client/main.lua
index 28aa00a6..fa1f2aee 100644
--- a/[esx_addons]/esx_atm/client/main.lua
+++ b/[esx_addons]/esx_atm/client/main.lua
@@ -52,6 +52,7 @@ Citizen.CreateThread(function()
for k,v in pairs(Config.ATMLocations) do
if #(coords - v) < 1.0 then
+
isInATMMarker, canSleep = true, false
break
end
diff --git a/[esx_addons]/esx_bankerjob/LICENSE b/[esx_addons]/esx_bankerjob/LICENSE
index b3c6b94d..86ecbcaf 100644
--- a/[esx_addons]/esx_bankerjob/LICENSE
+++ b/[esx_addons]/esx_bankerjob/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_bankerjob
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_bankerjob Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_bankerjob Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_bankerjob/README.md b/[esx_addons]/esx_bankerjob/README.md
index 18e8b6d5..545fdb0e 100644
--- a/[esx_addons]/esx_bankerjob/README.md
+++ b/[esx_addons]/esx_bankerjob/README.md
@@ -35,7 +35,7 @@ start esx_bankerjob
### License
esx_bankerjob - bank script
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_bankerjob/fxmanifest.lua b/[esx_addons]/esx_bankerjob/fxmanifest.lua
index 1e955d39..af347498 100644
--- a/[esx_addons]/esx_bankerjob/fxmanifest.lua
+++ b/[esx_addons]/esx_bankerjob/fxmanifest.lua
@@ -10,7 +10,7 @@ shared_script '@es_extended/imports.lua'
server_scripts {
'@async/async.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'config.lua',
'locales/de.lua',
@@ -20,6 +20,7 @@ server_scripts {
'locales/fi.lua',
'locales/fr.lua',
'locales/sv.lua',
+ 'locales/hu.lua',
'server/main.lua'
}
@@ -33,6 +34,7 @@ client_scripts {
'locales/fi.lua',
'locales/fr.lua',
'locales/sv.lua',
+ 'locales/hu.lua',
'client/main.lua'
}
diff --git a/[esx_addons]/esx_bankerjob/locales/hu.lua b/[esx_addons]/esx_bankerjob/locales/hu.lua
new file mode 100644
index 00000000..d68a1818
--- /dev/null
+++ b/[esx_addons]/esx_bankerjob/locales/hu.lua
@@ -0,0 +1,18 @@
+Locales['hu'] = {
+ ['actions'] = 'műveletek',
+ ['amount'] = 'összeg',
+ ['balance'] = 'egyenleg',
+ ['bank'] = 'bank',
+ ['bill_amount'] = 'Számla összege',
+ ['billing'] = 'Számlázás',
+ ['customer'] = 'Vevő',
+ ['customers'] = 'Kliensek',
+ ['deposit'] = 'Befizetés',
+ ['invalid_amount'] = 'Érvénytelen mennyiség',
+ ['no_player_nearby'] = 'Nincsen játékos a közeledben',
+ ['press_input_context_to_open_menu'] = 'Nyomj ~INPUT_CONTEXT~ hogy megnyisd a bankot.',
+ ['withdraw'] = 'Kivétel',
+ ['boss_actions'] = 'Főnöki menü',
+ ['phone_receive'] = 'banki ügyfél',
+ ['phone_label'] = 'bank',
+}
diff --git a/[esx_addons]/esx_bankerjob/server/main.lua b/[esx_addons]/esx_bankerjob/server/main.lua
index 9af78dbf..394d5fcc 100644
--- a/[esx_addons]/esx_bankerjob/server/main.lua
+++ b/[esx_addons]/esx_bankerjob/server/main.lua
@@ -56,7 +56,7 @@ end)
function CalculateBankSavings(d, h, m)
local asyncTasks = {}
- MySQL.Async.fetchAll('SELECT * FROM addon_account_data WHERE account_name = @account_name', {
+ MySQL.query('SELECT * FROM addon_account_data WHERE account_name = @account_name', {
['@account_name'] = 'bank_savings'
}, function(result)
local bankInterests = 0
@@ -80,7 +80,7 @@ function CalculateBankSavings(d, h, m)
local scope = function(newMoney, owner)
table.insert(asyncTasks, function(cb)
- MySQL.Async.execute('UPDATE addon_account_data SET money = @money WHERE owner = @owner AND account_name = @account_name', {
+ MySQL.update('UPDATE addon_account_data SET money = @money WHERE owner = @owner AND account_name = @account_name', {
['@money'] = newMoney,
['@owner'] = owner,
['@account_name'] = 'bank_savings',
diff --git a/[esx_addons]/esx_barbershop/LICENSE b/[esx_addons]/esx_barbershop/LICENSE
index fceb47c8..5575ab2c 100644
--- a/[esx_addons]/esx_barbershop/LICENSE
+++ b/[esx_addons]/esx_barbershop/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_barbershop
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_barbershop Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_barbershop Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_barbershop/README.md b/[esx_addons]/esx_barbershop/README.md
index 60ae5401..dbd5cd6e 100644
--- a/[esx_addons]/esx_barbershop/README.md
+++ b/[esx_addons]/esx_barbershop/README.md
@@ -31,7 +31,7 @@ start esx_barbershop
### License
esx_barbershop - barber shop!
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_barbershop/fxmanifest.lua b/[esx_addons]/esx_barbershop/fxmanifest.lua
index 1adcca76..33a8c731 100644
--- a/[esx_addons]/esx_barbershop/fxmanifest.lua
+++ b/[esx_addons]/esx_barbershop/fxmanifest.lua
@@ -19,6 +19,7 @@ server_scripts {
'locales/cs.lua',
'locales/pl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -34,6 +35,7 @@ client_scripts {
'locales/cs.lua',
'locales/pl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua'
}
diff --git a/[esx_addons]/esx_barbershop/locales/hu.lua b/[esx_addons]/esx_barbershop/locales/hu.lua
new file mode 100644
index 00000000..005a233c
--- /dev/null
+++ b/[esx_addons]/esx_barbershop/locales/hu.lua
@@ -0,0 +1,9 @@
+Locales['hu'] = {
+ ['valid_purchase'] = 'Biztosan kifizeted?',
+ ['yes'] = 'Igen',
+ ['no'] = 'Nem',
+ ['not_enough_money'] = 'Nincsen elég pénzed',
+ ['press_access'] = 'Nyomj ~INPUT_CONTEXT~ hogy megnyisd a ~y~Fodrászatot~s~.',
+ ['barber_blip'] = 'Fodrászat',
+ ['you_paid'] = 'Fizettél ~g~$%s~s~',
+}
diff --git a/[esx_addons]/esx_basicneeds/LICENSE b/[esx_addons]/esx_basicneeds/LICENSE
index 7ac56c99..e315a449 100644
--- a/[esx_addons]/esx_basicneeds/LICENSE
+++ b/[esx_addons]/esx_basicneeds/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_basicneeds
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_basicneeds Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_basicneeds Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_basicneeds/README.md b/[esx_addons]/esx_basicneeds/README.md
index 5f083302..0a3bfe24 100644
--- a/[esx_addons]/esx_basicneeds/README.md
+++ b/[esx_addons]/esx_basicneeds/README.md
@@ -34,7 +34,7 @@ start esx_basicneeds
### License
esx_basicneeds - thirst and hunger system
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_basicneeds/fxmanifest.lua b/[esx_addons]/esx_basicneeds/fxmanifest.lua
index 1258f13a..f24d1c4e 100644
--- a/[esx_addons]/esx_basicneeds/fxmanifest.lua
+++ b/[esx_addons]/esx_basicneeds/fxmanifest.lua
@@ -19,6 +19,7 @@ server_scripts {
'locales/sv.lua',
'locales/pl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -34,6 +35,7 @@ client_scripts {
'locales/sv.lua',
'locales/pl.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua'
}
diff --git a/[esx_addons]/esx_basicneeds/locales/hu.lua b/[esx_addons]/esx_basicneeds/locales/hu.lua
new file mode 100644
index 00000000..06204b41
--- /dev/null
+++ b/[esx_addons]/esx_basicneeds/locales/hu.lua
@@ -0,0 +1,4 @@
+Locales['hu'] = {
+ ['used_bread'] = 'Megettél egy ~y~1x~s~ ~b~kenyeret~s~.',
+ ['used_water'] = 'Megittál egy ~y~1x~s~ ~b~vizet~s~.',
+}
\ No newline at end of file
diff --git a/[esx_addons]/esx_billing/LICENSE b/[esx_addons]/esx_billing/LICENSE
index 84c1570d..b2029366 100644
--- a/[esx_addons]/esx_billing/LICENSE
+++ b/[esx_addons]/esx_billing/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_billing
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_billing Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_billing Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_billing/README.md b/[esx_addons]/esx_billing/README.md
index 5c04c698..dc399931 100644
--- a/[esx_addons]/esx_billing/README.md
+++ b/[esx_addons]/esx_billing/README.md
@@ -48,7 +48,7 @@ end
### License
esx_billing - billing for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_billing/fxmanifest.lua b/[esx_addons]/esx_billing/fxmanifest.lua
index 781765c3..ffc3dcd7 100644
--- a/[esx_addons]/esx_billing/fxmanifest.lua
+++ b/[esx_addons]/esx_billing/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/de.lua',
'locales/br.lua',
@@ -21,6 +21,7 @@ server_scripts {
'locales/pl.lua',
'locales/cs.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -37,6 +38,7 @@ client_scripts {
'locales/pl.lua',
'locales/cs.lua',
'locales/tr.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua'
}
diff --git a/[esx_addons]/esx_billing/locales/de.lua b/[esx_addons]/esx_billing/locales/de.lua
index 80991e28..e9508757 100644
--- a/[esx_addons]/esx_billing/locales/de.lua
+++ b/[esx_addons]/esx_billing/locales/de.lua
@@ -1,12 +1,12 @@
Locales['de'] = {
- ['invoices'] = 'rechnungen',
+ ['invoices'] = 'Rechnungen',
['invoices_item'] = '$%s',
- ['received_invoice'] = 'you hast eine Rechnung ~r~erhlaten~s~',
- ['paid_invoice'] = 'du ~g~bezahlst~s~ eine Rechnung von ~r~$%s~s~',
- ['no_invoices'] = 'you do not have any bills to pay at this moment',
- ['received_payment'] = 'du ~g~erhältst~s~ eine Zahlung von ~r~$%s~s~',
- ['player_not_online'] = 'der Spieler ist nicht online',
- ['no_money'] = 'you do not have enough money to pay this bill',
- ['target_no_money'] = 'the player ~r~does not~s~ have enough money to pay the bill!',
- ['keymap_showbills'] = 'open bills menu',
-}
+ ['received_invoice'] = 'Sie haben eine Rechnung ~r~erhalten~s~.',
+ ['paid_invoice'] = 'Sie ~g~bezahlen~s~ eine Rechnung von ~r~$%s~s~.',
+ ['no_invoices'] = 'Sie haben keine offenen Rechnungen.',
+ ['received_payment'] = 'Sie ~g~erhalten~s~ eine Zahlung von ~r~$%s~s~.',
+ ['player_not_online'] = 'Die Person ist nicht erreichbar.',
+ ['no_money'] = 'Sie haben nicht genug Geld, um diese Rechnung zu bezahlen.',
+ ['target_no_money'] = 'Die Person kann die Rechnung nicht bezahlen.',
+ ['keymap_showbills'] = 'Rechnungen anzeigen',
+}
\ No newline at end of file
diff --git a/[esx_addons]/esx_billing/locales/hu.lua b/[esx_addons]/esx_billing/locales/hu.lua
new file mode 100644
index 00000000..02d4aeb3
--- /dev/null
+++ b/[esx_addons]/esx_billing/locales/hu.lua
@@ -0,0 +1,12 @@
+Locales['hu'] = {
+ ['invoices'] = 'Számlák',
+ ['invoices_item'] = '$%s',
+ ['received_invoice'] = 'Kaptál egy számlát',
+ ['paid_invoice'] = 'Befizettél egy számlát ( ~r~$%s~s~ )',
+ ['no_invoices'] = 'Nincsen számlád amit kifizethetnél',
+ ['received_payment'] = 'Fizetést kaptál: ~r~$%s~s~',
+ ['player_not_online'] = 'A játékos nem elérhető',
+ ['no_money'] = 'Nincsen elég pénzed, hogy kifizesd ezt a számlát',
+ ['target_no_money'] = 'A játékosnak nincsen annyi pénze, hogy befizesse a számlát',
+ ['keymap_showbills'] = 'Számlák megnézése',
+}
diff --git a/[esx_addons]/esx_billing/server/main.lua b/[esx_addons]/esx_billing/server/main.lua
index 92ef1283..7b5853b5 100644
--- a/[esx_addons]/esx_billing/server/main.lua
+++ b/[esx_addons]/esx_billing/server/main.lua
@@ -7,25 +7,13 @@ AddEventHandler('esx_billing:sendBill', function(playerId, sharedAccountName, la
if amount > 0 and xTarget then
TriggerEvent('esx_addonaccount:getSharedAccount', sharedAccountName, function(account)
if account then
- MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', {
- ['@identifier'] = xTarget.identifier,
- ['@sender'] = xPlayer.identifier,
- ['@target_type'] = 'society',
- ['@target'] = sharedAccountName,
- ['@label'] = label,
- ['@amount'] = amount
- }, function(rowsChanged)
+ MySQL.insert('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (?, ?, ?, ?, ?, ?)', {xTarget.identifier, xPlayer.identifier, 'society', sharedAccountName, label, amount},
+ function(rowsChanged)
xTarget.showNotification(_U('received_invoice'))
end)
else
- MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', {
- ['@identifier'] = xTarget.identifier,
- ['@sender'] = xPlayer.identifier,
- ['@target_type'] = 'player',
- ['@target'] = xPlayer.identifier,
- ['@label'] = label,
- ['@amount'] = amount
- }, function(rowsChanged)
+ MySQL.insert('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (?, ?, ?, ?, ?, ?)', {xTarget.identifier, xPlayer.identifier, 'player', xPlayer.identifier, label, amount},
+ function(rowsChanged)
xTarget.showNotification(_U('received_invoice'))
end)
end
@@ -36,9 +24,8 @@ end)
ESX.RegisterServerCallback('esx_billing:getBills', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT amount, id, label FROM billing WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier
- }, function(result)
+ MySQL.query('SELECT amount, id, label FROM billing WHERE identifier = ?', {xPlayer.identifier},
+ function(result)
cb(result)
end)
end)
@@ -47,9 +34,8 @@ ESX.RegisterServerCallback('esx_billing:getTargetBills', function(source, cb, ta
local xPlayer = ESX.GetPlayerFromId(target)
if xPlayer then
- MySQL.Async.fetchAll('SELECT amount, id, label FROM billing WHERE identifier = @identifier', {
- ['@identifier'] = xPlayer.identifier
- }, function(result)
+ MySQL.query('SELECT amount, id, label FROM billing WHERE identifier = ?', {xPlayer.identifier},
+ function(result)
cb(result)
end)
else
@@ -60,19 +46,17 @@ end)
ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, billId)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT sender, target_type, target, amount FROM billing WHERE id = @id', {
- ['@id'] = billId
- }, function(result)
- if result[1] then
- local amount = result[1].amount
- local xTarget = ESX.GetPlayerFromIdentifier(result[1].sender)
+ MySQL.single('SELECT sender, target_type, target, amount FROM billing WHERE id = ?', {billId},
+ function(result)
+ if result then
+ local amount = result.amount
+ local xTarget = ESX.GetPlayerFromIdentifier(result.sender)
- if result[1].target_type == 'player' then
+ if result.target_type == 'player' then
if xTarget then
if xPlayer.getMoney() >= amount then
- MySQL.Async.execute('DELETE FROM billing WHERE id = @id', {
- ['@id'] = billId
- }, function(rowsChanged)
+ MySQL.update('DELETE FROM billing WHERE id = ?', {billId},
+ function(rowsChanged)
if rowsChanged == 1 then
xPlayer.removeMoney(amount)
xTarget.addMoney(amount)
@@ -84,9 +68,8 @@ ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, billId)
cb()
end)
elseif xPlayer.getAccount('bank').money >= amount then
- MySQL.Async.execute('DELETE FROM billing WHERE id = @id', {
- ['@id'] = billId
- }, function(rowsChanged)
+ MySQL.update('DELETE FROM billing WHERE id = ?', {billId},
+ function(rowsChanged)
if rowsChanged == 1 then
xPlayer.removeAccountMoney('bank', amount)
xTarget.addAccountMoney('bank', amount)
@@ -109,9 +92,8 @@ ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, billId)
else
TriggerEvent('esx_addonaccount:getSharedAccount', result[1].target, function(account)
if xPlayer.getMoney() >= amount then
- MySQL.Async.execute('DELETE FROM billing WHERE id = @id', {
- ['@id'] = billId
- }, function(rowsChanged)
+ MySQL.update('DELETE FROM billing WHERE id = ?', {billId},
+ function(rowsChanged)
if rowsChanged == 1 then
xPlayer.removeMoney(amount)
account.addMoney(amount)
@@ -125,9 +107,8 @@ ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, billId)
cb()
end)
elseif xPlayer.getAccount('bank').money >= amount then
- MySQL.Async.execute('DELETE FROM billing WHERE id = @id', {
- ['@id'] = billId
- }, function(rowsChanged)
+ MySQL.update('DELETE FROM billing WHERE id = ?', {billId},
+ function(rowsChanged)
if rowsChanged == 1 then
xPlayer.removeAccountMoney('bank', amount)
account.addMoney(amount)
diff --git a/[esx_addons]/esx_boat/LICENSE b/[esx_addons]/esx_boat/LICENSE
index bb673aa4..357d9c56 100644
--- a/[esx_addons]/esx_boat/LICENSE
+++ b/[esx_addons]/esx_boat/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_boat
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_boat Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_boat Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_boat/README.md b/[esx_addons]/esx_boat/README.md
index 3d657268..4edd6200 100644
--- a/[esx_addons]/esx_boat/README.md
+++ b/[esx_addons]/esx_boat/README.md
@@ -33,7 +33,7 @@ start esx_boat
### License
esx_boat - Boat shop and garage for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_boat/fxmanifest.lua b/[esx_addons]/esx_boat/fxmanifest.lua
index 2fee0493..48015f9e 100644
--- a/[esx_addons]/esx_boat/fxmanifest.lua
+++ b/[esx_addons]/esx_boat/fxmanifest.lua
@@ -9,13 +9,14 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/en.lua',
'locales/fr.lua',
'locales/sv.lua',
'locales/pl.lua',
'locales/es.lua',
+ 'locales/hu.lua',
'config.lua',
'server/main.lua'
}
@@ -27,6 +28,7 @@ client_scripts {
'locales/sv.lua',
'locales/pl.lua',
'locales/es.lua',
+ 'locales/hu.lua',
'config.lua',
'client/main.lua',
'client/marker.lua'
diff --git a/[esx_addons]/esx_boat/locales/hu.lua b/[esx_addons]/esx_boat/locales/hu.lua
new file mode 100644
index 00000000..70ca9ca3
--- /dev/null
+++ b/[esx_addons]/esx_boat/locales/hu.lua
@@ -0,0 +1,31 @@
+Locales['hu'] = {
+ -- shop
+ ['boat_shop'] = 'Hajóbolt',
+ ['boat_shop_open'] = 'Nyomj ~INPUT_CONTEXT~ hogy megnézd a hajókat',
+ ['boat_shop_confirm'] = 'hajó: %s ára: $%s',
+ ['boat_shop_bought'] = 'Vettél ~b~%s~s~ ennyiért: ~g~$%s~s~',
+ ['boat_shop_nomoney'] = '~r~Ezt nem engedheted meg magadnak!',
+ ['confirm_no'] = 'Nem',
+ ['confirm_yes'] = 'Igen',
+
+ -- garage
+ ['garage'] = 'Hajógarázs',
+ ['garage_open'] = 'Nyomj ~INPUT_CONTEXT~ hogy megnyisd a garázst',
+ ['garage_store'] = 'Nyomj ~INPUT_CONTEXT~ hogy kikösd a hajót',
+ ['garage_taken'] = 'Sikeresen kivetted a hajót',
+ ['garage_stored'] = 'Sikeresen leraktad a hajót',
+ ['garage_noboats'] = '~r~Nincsen hajód',
+ ['garage_blocked'] = '~r~A lehívási pont blokkolva',
+ ['garage_notowner'] = '~r~Nem a tied ez a hajó',
+
+ -- license
+ ['license_menu'] = 'Szeretnél venni hajó engedélyt?',
+ ['license_buy_no'] = 'Nem',
+ ['license_buy_yes'] = 'Vegyél hajó engedélyt $%s-ért',
+ ['license_bought'] = 'Vettél ~y~hajó engedélyt~s~ ~g~$%s~s~-ért',
+ ['license_nomoney'] = '~r~nem engedheted meg~s~ magadnak, hogy vegyél ~y~hajó engedélyt~s~!',
+
+ -- blips
+ ['blip_garage'] = 'Hajógarázs',
+ ['blip_shop'] = 'Hajóbolt',
+}
diff --git a/[esx_addons]/esx_boat/server/main.lua b/[esx_addons]/esx_boat/server/main.lua
index 1b8479ff..410d1414 100644
--- a/[esx_addons]/esx_boat/server/main.lua
+++ b/[esx_addons]/esx_boat/server/main.lua
@@ -3,7 +3,7 @@ MySQL.ready(function()
end)
function ParkBoats()
- MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = true WHERE `stored` = false AND type = @type', {
+ MySQL.update('UPDATE owned_vehicles SET `stored` = true WHERE `stored` = false AND type = @type', {
['@type'] = 'boat'
}, function (rowsChanged)
if rowsChanged > 0 then
@@ -24,7 +24,7 @@ ESX.RegisterServerCallback('esx_boat:buyBoat', function(source, cb, vehicleProps
if xPlayer.getMoney() >= price then
xPlayer.removeMoney(price)
- MySQL.Async.execute('INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`) VALUES (@owner, @plate, @vehicle, @type, @stored)', {
+ MySQL.update('INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`) VALUES (@owner, @plate, @vehicle, @type, @stored)', {
['@owner'] = xPlayer.identifier,
['@plate'] = vehicleProps.plate,
['@vehicle'] = json.encode(vehicleProps),
@@ -43,7 +43,7 @@ RegisterServerEvent('esx_boat:takeOutVehicle')
AddEventHandler('esx_boat:takeOutVehicle', function(plate)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = @stored WHERE owner = @owner AND plate = @plate', {
+ MySQL.update('UPDATE owned_vehicles SET `stored` = @stored WHERE owner = @owner AND plate = @plate', {
['@stored'] = false,
['@owner'] = xPlayer.identifier,
['@plate'] = plate
@@ -57,7 +57,7 @@ end)
ESX.RegisterServerCallback('esx_boat:storeVehicle', function (source, cb, plate)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.execute('UPDATE owned_vehicles SET `stored` = @stored WHERE owner = @owner AND plate = @plate', {
+ MySQL.update('UPDATE owned_vehicles SET `stored` = @stored WHERE owner = @owner AND plate = @plate', {
['@stored'] = true,
['@owner'] = xPlayer.identifier,
['@plate'] = plate
@@ -73,7 +73,7 @@ end)
ESX.RegisterServerCallback('esx_boat:getGarage', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT vehicle FROM owned_vehicles WHERE owner = @owner AND type = @type AND `stored` = @stored', {
+ MySQL.query('SELECT vehicle FROM owned_vehicles WHERE owner = @owner AND type = @type AND `stored` = @stored', {
['@owner'] = xPlayer.identifier,
['@type'] = 'boat',
['@stored'] = true
diff --git a/[esx_addons]/esx_clotheshop/LICENSE b/[esx_addons]/esx_clotheshop/LICENSE
index c2a404cf..fce3a988 100644
--- a/[esx_addons]/esx_clotheshop/LICENSE
+++ b/[esx_addons]/esx_clotheshop/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_clotheshop
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_clotheshop Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_clotheshop Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_clotheshop/README.md b/[esx_addons]/esx_clotheshop/README.md
index d3ce745e..18a9e4fd 100644
--- a/[esx_addons]/esx_clotheshop/README.md
+++ b/[esx_addons]/esx_clotheshop/README.md
@@ -31,7 +31,7 @@ start esx_clotheshop
### License
esx_clotheshop - clothing store
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_clotheshop/fxmanifest.lua b/[esx_addons]/esx_clotheshop/fxmanifest.lua
index ee13d31a..a018dbce 100644
--- a/[esx_addons]/esx_clotheshop/fxmanifest.lua
+++ b/[esx_addons]/esx_clotheshop/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/br.lua',
'locales/de.lua',
diff --git a/[esx_addons]/esx_cruisecontrol/LICENSE b/[esx_addons]/esx_cruisecontrol/LICENSE
index 3ca99747..4c37e893 100644
--- a/[esx_addons]/esx_cruisecontrol/LICENSE
+++ b/[esx_addons]/esx_cruisecontrol/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
async
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- async Copyright (C) 2015-2021 Jérémie N'gadi
+ async Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_datastore/LICENSE b/[esx_addons]/esx_datastore/LICENSE
index 9edb31d6..52fcac84 100644
--- a/[esx_addons]/esx_datastore/LICENSE
+++ b/[esx_addons]/esx_datastore/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_datastore
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_datastore Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_datastore Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_datastore/README.md b/[esx_addons]/esx_datastore/README.md
index 1415a48f..21b66e58 100644
--- a/[esx_addons]/esx_datastore/README.md
+++ b/[esx_addons]/esx_datastore/README.md
@@ -55,7 +55,7 @@ end)
### License
esx_datastore - datastore inventory for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_datastore/fxmanifest.lua b/[esx_addons]/esx_datastore/fxmanifest.lua
index 2aa55938..0318b754 100644
--- a/[esx_addons]/esx_datastore/fxmanifest.lua
+++ b/[esx_addons]/esx_datastore/fxmanifest.lua
@@ -8,7 +8,7 @@ version 'legacy'
server_scripts {
'@es_extended/imports.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'server/classes/datastore.lua',
'server/main.lua'
}
diff --git a/[esx_addons]/esx_datastore/server/classes/datastore.lua b/[esx_addons]/esx_datastore/server/classes/datastore.lua
index 382689d8..73611443 100644
--- a/[esx_addons]/esx_datastore/server/classes/datastore.lua
+++ b/[esx_addons]/esx_datastore/server/classes/datastore.lua
@@ -68,16 +68,9 @@ function CreateDataStore(name, owner, data)
local timeoutCallback = ESX.SetTimeout(10000, function()
if self.owner == nil then
- MySQL.Async.execute('UPDATE datastore_data SET data = @data WHERE name = @name', {
- ['@data'] = json.encode(self.data),
- ['@name'] = self.name,
- })
+ MySQL.update('UPDATE datastore_data SET data = ? WHERE name = ?', {json.encode(self.data), self.name})
else
- MySQL.Async.execute('UPDATE datastore_data SET data = @data WHERE name = @name and owner = @owner', {
- ['@data'] = json.encode(self.data),
- ['@name'] = self.name,
- ['@owner'] = self.owner,
- })
+ MySQL.update('UPDATE datastore_data SET data = ? WHERE name = ? and owner = ?', {json.encode(self.data), self.name, self.owner})
end
end)
diff --git a/[esx_addons]/esx_datastore/server/main.lua b/[esx_addons]/esx_datastore/server/main.lua
index 606d12b3..d1eafd78 100644
--- a/[esx_addons]/esx_datastore/server/main.lua
+++ b/[esx_addons]/esx_datastore/server/main.lua
@@ -1,41 +1,33 @@
local DataStores, DataStoresIndex, SharedDataStores = {}, {}, {}
-MySQL.ready(function()
- local result = MySQL.Sync.fetchAll('SELECT * FROM datastore')
+AddEventHandler('onResourceStart', function(resourceName)
+ if resourceName == GetCurrentResourceName() then
+ local dataStore = MySQL.query.await('SELECT * FROM datastore_data LEFT JOIN datastore ON datastore_data.name = datastore.name UNION SELECT * FROM datastore_data RIGHT JOIN datastore ON datastore_data.name = datastore.name')
- for i=1, #result, 1 do
- local name, label, shared = result[i].name, result[i].label, result[i].shared
- local result2 = MySQL.Sync.fetchAll('SELECT * FROM datastore_data WHERE name = @name', {
- ['@name'] = name
- })
-
- if shared == 0 then
- table.insert(DataStoresIndex, name)
- DataStores[name] = {}
-
- for j=1, #result2, 1 do
- local storeName = result2[j].name
- local storeOwner = result2[j].owner
- local storeData = (result2[j].data == nil and {} or json.decode(result2[j].data))
- local dataStore = CreateDataStore(storeName, storeOwner, storeData)
-
- table.insert(DataStores[name], dataStore)
- end
- else
- local data
-
- if #result2 == 0 then
- MySQL.Sync.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, NULL, \'{}\')', {
- ['@name'] = name
- })
-
- data = {}
+ local newData = {}
+ for i = 1, #dataStore do
+ local data = dataStore[i]
+ if data.shared == 0 then
+ if not DataStores[data.name] then
+ DataStoresIndex[#DataStoresIndex + 1] = data.name
+ DataStores[data.name] = {}
+ end
+ DataStores[data.name][#DataStores[data.name] + 1] = CreateDataStore(data.name, data.owner, data.data)
else
- data = json.decode(result2[1].data)
+ if data.data then
+ SharedDataStores[data.name] = CreateDataStore(data.name, nil, data.data)
+ else
+ newData[#newData + 1] = {data.name, '\'{}\''}
+ end
end
+ end
- local dataStore = CreateDataStore(name, nil, data)
- SharedDataStores[name] = dataStore
+ if next(newData) then
+ MySQL.prepare('INSERT INTO datastore_data (name, data) VALUES (?, ?)', newData)
+ for i = 1, #newData do
+ local new = newData[i]
+ SharedDataStores[new[1]] = CreateDataStore(new[1], nil, new[2])
+ end
end
end
end)
@@ -80,14 +72,9 @@ AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
local dataStore = GetDataStore(name, xPlayer.identifier)
if not dataStore then
- MySQL.Async.execute('INSERT INTO datastore_data (name, owner, data) VALUES (@name, @owner, @data)', {
- ['@name'] = name,
- ['@owner'] = xPlayer.identifier,
- ['@data'] = '{}'
- })
+ MySQL.insert('INSERT INTO datastore_data (name, owner, data) VALUES (?, ?, ?)', {name, xPlayer.identifier, '{}'})
- dataStore = CreateDataStore(name, xPlayer.identifier, {})
- table.insert(DataStores[name], dataStore)
+ DataStores[name][#DataStores[name] + 1] = CreateDataStore(name, xPlayer.identifier, {})
end
end
end)
diff --git a/[esx_addons]/esx_dmvschool/LICENSE b/[esx_addons]/esx_dmvschool/LICENSE
index 73aca2a6..943cff70 100644
--- a/[esx_addons]/esx_dmvschool/LICENSE
+++ b/[esx_addons]/esx_dmvschool/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_dmvschool
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_dmvschool Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_dmvschool Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_dmvschool/README.md b/[esx_addons]/esx_dmvschool/README.md
index 30969bc6..43af3acc 100644
--- a/[esx_addons]/esx_dmvschool/README.md
+++ b/[esx_addons]/esx_dmvschool/README.md
@@ -33,7 +33,7 @@ start esx_dmvschool
### License
esx_dmvschool - realistic DMV school for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_dmvschool/client/main.lua b/[esx_addons]/esx_dmvschool/client/main.lua
index 89761a6f..7eb6e56a 100644
--- a/[esx_addons]/esx_dmvschool/client/main.lua
+++ b/[esx_addons]/esx_dmvschool/client/main.lua
@@ -334,9 +334,9 @@ Citizen.CreateThread(function()
LastCheckPoint = CurrentCheckPoint
end
-
+
local distance = #(coords - Config.CheckPoints[nextCheckPoint].Pos)
-
+
if distance <= 100.0 then
DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false)
end
diff --git a/[esx_addons]/esx_drugs/LICENSE b/[esx_addons]/esx_drugs/LICENSE
index 207472b6..394fc45a 100644
--- a/[esx_addons]/esx_drugs/LICENSE
+++ b/[esx_addons]/esx_drugs/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_drugs
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_drugs Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_drugs Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_drugs/README.md b/[esx_addons]/esx_drugs/README.md
index 37160e6d..dce4a715 100644
--- a/[esx_addons]/esx_drugs/README.md
+++ b/[esx_addons]/esx_drugs/README.md
@@ -35,7 +35,7 @@ start esx_drugs
### License
esx_drugs - drugs job
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_drugs/client/main.lua b/[esx_addons]/esx_drugs/client/main.lua
index 66f3e9d0..ec2a81ee 100644
--- a/[esx_addons]/esx_drugs/client/main.lua
+++ b/[esx_addons]/esx_drugs/client/main.lua
@@ -3,7 +3,7 @@ local wasOpen = false
Citizen.CreateThread(function()
while true do
- Citizen.Wait(0)
+ local time = 800
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
@@ -24,7 +24,7 @@ Citizen.CreateThread(function()
ESX.UI.Menu.CloseAll()
end
- Citizen.Wait(500)
+ Citizen.Wait(time)
end
end
end)
diff --git a/[esx_addons]/esx_drugs/fxmanifest.lua b/[esx_addons]/esx_drugs/fxmanifest.lua
index d3e3cbf6..3fc802cc 100644
--- a/[esx_addons]/esx_drugs/fxmanifest.lua
+++ b/[esx_addons]/esx_drugs/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/en.lua',
'locales/es.lua',
diff --git a/[esx_addons]/esx_drugs/server/main.lua b/[esx_addons]/esx_drugs/server/main.lua
index b9c6a058..929b1653 100644
--- a/[esx_addons]/esx_drugs/server/main.lua
+++ b/[esx_addons]/esx_drugs/server/main.lua
@@ -72,11 +72,6 @@ AddEventHandler('esx_drugs:outofbound', function()
outofbound = true
end)
-RegisterServerEvent('esx_drugs:quitprocess')
-AddEventHandler('esx_drugs:quitprocess', function()
- can = false
-end)
-
ESX.RegisterServerCallback('esx_drugs:cannabis_count', function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)
local xCannabis = xPlayer.getInventoryItem('cannabis').count
diff --git a/[esx_addons]/esx_garage/LICENSE b/[esx_addons]/esx_garage/LICENSE
index e2b48602..6b4e8c03 100644
--- a/[esx_addons]/esx_garage/LICENSE
+++ b/[esx_addons]/esx_garage/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_garage
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_garage Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_garage Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_garage/fxmanifest.lua b/[esx_addons]/esx_garage/fxmanifest.lua
index 85e5e453..c3701124 100644
--- a/[esx_addons]/esx_garage/fxmanifest.lua
+++ b/[esx_addons]/esx_garage/fxmanifest.lua
@@ -17,7 +17,7 @@ server_scripts {
'locales/fr.lua',
'locales/sv.lua',
'locales/pl.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'config.lua',
'server/main.lua'
}
diff --git a/[esx_addons]/esx_garage/server/main.lua b/[esx_addons]/esx_garage/server/main.lua
index 0cd7bff1..b7517e82 100644
--- a/[esx_addons]/esx_garage/server/main.lua
+++ b/[esx_addons]/esx_garage/server/main.lua
@@ -5,7 +5,7 @@ AddEventHandler('esx_garage:setParking', function(garage, zone, vehicleProps)
if vehicleProps == false then
- MySQL.Async.execute('DELETE FROM `user_parkings` WHERE `identifier` = @identifier AND `garage` = @garage AND zone = @zone',
+ MySQL.update('DELETE FROM `user_parkings` WHERE `identifier` = @identifier AND `garage` = @garage AND zone = @zone',
{
['@identifier'] = xPlayer.identifier,
['@garage'] = garage;
@@ -14,7 +14,7 @@ AddEventHandler('esx_garage:setParking', function(garage, zone, vehicleProps)
xPlayer.showNotification(_U('veh_released'))
end)
else
- MySQL.Async.execute('INSERT INTO `user_parkings` (`identifier`, `garage`, `zone`, `vehicle`) VALUES (@identifier, @garage, @zone, @vehicle)',
+ MySQL.update('INSERT INTO `user_parkings` (`identifier`, `garage`, `zone`, `vehicle`) VALUES (@identifier, @garage, @zone, @vehicle)',
{
['@identifier'] = xPlayer.identifier,
['@garage'] = garage;
@@ -28,7 +28,7 @@ end)
RegisterServerEvent('esx_garage:updateOwnedVehicle')
AddEventHandler('esx_garage:updateOwnedVehicle', function(vehicleProps)
- MySQL.Async.execute('UPDATE owned_vehicles SET vehicle = @vehicle WHERE plate = @plate', {
+ MySQL.update('UPDATE owned_vehicles SET vehicle = @vehicle WHERE plate = @plate', {
['@plate'] = vehicleProps.plate,
['@vehicle'] = json.encode(vehicleProps)
})
@@ -37,7 +37,7 @@ end)
ESX.RegisterServerCallback('esx_vehicleshop:getVehiclesInGarage', function(source, cb, garage)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT * FROM `user_parkings` WHERE `identifier` = @identifier AND garage = @garage',
+ MySQL.query('SELECT * FROM `user_parkings` WHERE `identifier` = @identifier AND garage = @garage',
{
['@identifier'] = xPlayer.identifier,
['@garage'] = garage
diff --git a/[esx_addons]/esx_holdup/LICENSE b/[esx_addons]/esx_holdup/LICENSE
index a8965660..288b1eee 100644
--- a/[esx_addons]/esx_holdup/LICENSE
+++ b/[esx_addons]/esx_holdup/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_holdup
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_holdup Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_holdup Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_holdup/README.md b/[esx_addons]/esx_holdup/README.md
index ec25ea35..ecb99ac1 100644
--- a/[esx_addons]/esx_holdup/README.md
+++ b/[esx_addons]/esx_holdup/README.md
@@ -32,7 +32,7 @@ start esx_holdup
### License
esx_holdup - rob stores
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_joblisting/LICENSE b/[esx_addons]/esx_joblisting/LICENSE
index 6fb0ee12..428c413b 100644
--- a/[esx_addons]/esx_joblisting/LICENSE
+++ b/[esx_addons]/esx_joblisting/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_joblisting
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_joblisting Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_joblisting Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_joblisting/README.md b/[esx_addons]/esx_joblisting/README.md
index 5dc97b29..3af12895 100644
--- a/[esx_addons]/esx_joblisting/README.md
+++ b/[esx_addons]/esx_joblisting/README.md
@@ -31,7 +31,7 @@ start esx_joblisting
### License
esx_joblisting - job listing script
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua
index 3351ec2a..8465c8c3 100644
--- a/[esx_addons]/esx_joblisting/fxmanifest.lua
+++ b/[esx_addons]/esx_joblisting/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'config.lua',
'locales/de.lua',
diff --git a/[esx_addons]/esx_joblisting/server/main.lua b/[esx_addons]/esx_joblisting/server/main.lua
index 1f1a3753..732010e5 100644
--- a/[esx_addons]/esx_joblisting/server/main.lua
+++ b/[esx_addons]/esx_joblisting/server/main.lua
@@ -1,7 +1,7 @@
local availableJobs = {}
MySQL.ready(function()
- MySQL.Async.fetchAll('SELECT name, label FROM jobs WHERE whitelisted = @whitelisted', {
+ MySQL.query('SELECT name, label FROM jobs WHERE whitelisted = @whitelisted', {
['@whitelisted'] = false
}, function(result)
for i=1, #result, 1 do
diff --git a/[esx_addons]/esx_jobs/LICENSE b/[esx_addons]/esx_jobs/LICENSE
index 62ae7eb7..2f5a7768 100644
--- a/[esx_addons]/esx_jobs/LICENSE
+++ b/[esx_addons]/esx_jobs/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_jobs
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_jobs Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_jobs Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_jobs/README.md b/[esx_addons]/esx_jobs/README.md
index 145edf29..d2274108 100644
--- a/[esx_addons]/esx_jobs/README.md
+++ b/[esx_addons]/esx_jobs/README.md
@@ -56,7 +56,7 @@ CloakRoom = {
### License
esx_jobs - jobs
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_jobs/jobs/fisherman.lua b/[esx_addons]/esx_jobs/jobs/fisherman.lua
index cbad08c0..26186520 100644
--- a/[esx_addons]/esx_jobs/jobs/fisherman.lua
+++ b/[esx_addons]/esx_jobs/jobs/fisherman.lua
@@ -149,7 +149,6 @@ Config.Jobs.fisherman = {
Pos = {x = -1012.64, y = -1354.62, z = 5.54},
Color = {r = 204, g = 204, b = 0},
Size = {x = 5.0, y = 5.0, z = 3.0},
- Color = {r = 204, g = 204, b = 0},
Marker= 1,
Blip = true,
Name = _U('delivery_point'),
diff --git a/[esx_addons]/esx_jobs/jobs/miner.lua b/[esx_addons]/esx_jobs/jobs/miner.lua
index edbffb6d..58c45cf3 100644
--- a/[esx_addons]/esx_jobs/jobs/miner.lua
+++ b/[esx_addons]/esx_jobs/jobs/miner.lua
@@ -196,7 +196,6 @@ Config.Jobs.miner = {
Pos = {x = -148.78, y = -1040.38, z = 26.27},
Color = {r = 204, g = 204, b = 0},
Size = {x = 5.0, y = 5.0, z = 3.0},
- Color = {r = 204, g = 204, b = 0},
Marker = 1,
Blip = true,
Name = _U('m_sell_iron'),
@@ -222,7 +221,6 @@ Config.Jobs.miner = {
Pos = {x = 261.48, y = 207.35, z = 109.28},
Color = {r = 204, g = 204, b = 0},
Size = {x = 5.0, y = 5.0, z = 3.0},
- Color = {r = 204, g = 204, b = 0},
Marker = 1,
Blip = true,
Name = _U('m_sell_gold'),
@@ -248,7 +246,6 @@ Config.Jobs.miner = {
Pos = {x = -621.04, y = -228.53, z = 37.05},
Color = {r = 204, g = 204, b = 0},
Size = {x = 5.0, y = 5.0, z = 3.0},
- Color = {r = 204, g = 204, b = 0},
Marker = 1,
Blip = true,
Name = _U('m_sell_diamond'),
diff --git a/[esx_addons]/esx_license/LICENSE b/[esx_addons]/esx_license/LICENSE
index 1352746c..12aff000 100644
--- a/[esx_addons]/esx_license/LICENSE
+++ b/[esx_addons]/esx_license/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_license
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_license Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_license Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_license/fxmanifest.lua b/[esx_addons]/esx_license/fxmanifest.lua
index 14d5e7ba..610dd13c 100644
--- a/[esx_addons]/esx_license/fxmanifest.lua
+++ b/[esx_addons]/esx_license/fxmanifest.lua
@@ -9,6 +9,6 @@ version 'legacy'
server_scripts {
'@async/async.lua',
'@es_extended/imports.lua',
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'server/main.lua'
}
diff --git a/[esx_addons]/esx_license/server/main.lua b/[esx_addons]/esx_license/server/main.lua
index 65a75831..d92e485f 100644
--- a/[esx_addons]/esx_license/server/main.lua
+++ b/[esx_addons]/esx_license/server/main.lua
@@ -2,10 +2,8 @@ function AddLicense(target, type, cb)
local xPlayer = ESX.GetPlayerFromId(target)
if xPlayer then
- MySQL.Async.execute('INSERT INTO user_licenses (type, owner) VALUES (@type, @owner)', {
- ['@type'] = type,
- ['@owner'] = xPlayer.identifier
- }, function(rowsChanged)
+ MySQL.insert('INSERT INTO user_licenses (type, owner) VALUES (?, ?)', {type, xPlayer.identifier},
+ function(rowsChanged)
if cb then
cb()
end
@@ -21,10 +19,8 @@ function RemoveLicense(target, type, cb)
local xPlayer = ESX.GetPlayerFromId(target)
if xPlayer then
- MySQL.Async.execute('DELETE FROM user_licenses WHERE type = @type AND owner = @owner', {
- ['@type'] = type,
- ['@owner'] = xPlayer.identifier
- }, function(rowsChanged)
+ MySQL.update('DELETE FROM user_licenses WHERE type = ? AND owner = ?', {type, xPlayer.identifier},
+ function(rowsChanged)
if cb then
cb()
end
@@ -37,48 +33,18 @@ function RemoveLicense(target, type, cb)
end
function GetLicense(type, cb)
- MySQL.Async.fetchAll('SELECT label FROM licenses WHERE type = @type', {
- ['@type'] = type
- }, function(result)
- local data = {
- type = type,
- label = result[1].label
- }
-
- cb(data)
+ MySQL.scalar('SELECT label FROM licenses WHERE type = ?', {type},
+ function(result)
+ cb({type = type, label = result})
end)
end
function GetLicenses(target, cb)
local xPlayer = ESX.GetPlayerFromId(target)
- MySQL.Async.fetchAll('SELECT type FROM user_licenses WHERE owner = @owner', {
- ['@owner'] = xPlayer.identifier
- }, function(result)
- local licenses, asyncTasks = {}, {}
-
- for i=1, #result, 1 do
- local scope = function(type)
- table.insert(asyncTasks, function(cb)
- MySQL.Async.fetchAll('SELECT label FROM licenses WHERE type = @type', {
- ['@type'] = type
- }, function(result2)
- table.insert(licenses, {
- type = type,
- label = result2[1].label
- })
-
- cb()
- end)
- end)
- end
-
- scope(result[i].type)
- end
-
- Async.parallel(asyncTasks, function(results)
- cb(licenses)
- end)
+ MySQL.query('SELECT user_licenses.type, licenses.label FROM user_licenses LEFT JOIN licenses ON user_licenses.type = licenses.type WHERE owner = ?', {xPlayer.identifier},
+ function(result)
+ cb(result)
end)
end
@@ -86,11 +52,9 @@ function CheckLicense(target, type, cb)
local xPlayer = ESX.GetPlayerFromId(target)
if xPlayer then
- MySQL.Async.fetchAll('SELECT COUNT(*) as count FROM user_licenses WHERE type = @type AND owner = @owner', {
- ['@type'] = type,
- ['@owner'] = xPlayer.identifier
- }, function(result)
- if tonumber(result[1].count) > 0 then
+ MySQL.scalar('SELECT type FROM user_licenses WHERE type = ? AND owner = ?', {type, xPlayer.identifier},
+ function(result)
+ if result then
cb(true)
else
cb(false)
@@ -102,19 +66,9 @@ function CheckLicense(target, type, cb)
end
function GetLicensesList(cb)
- MySQL.Async.fetchAll('SELECT type, label FROM licenses', {
- ['@type'] = type
- }, function(result)
- local licenses = {}
-
- for i=1, #result, 1 do
- table.insert(licenses, {
- type = result[i].type,
- label = result[i].label
- })
- end
-
- cb(licenses)
+ MySQL.query('SELECT type, label FROM licenses',
+ function(result)
+ cb(result)
end)
end
diff --git a/[esx_addons]/esx_lscustom/LICENSE b/[esx_addons]/esx_lscustom/LICENSE
index a5e7adf7..3d886edd 100644
--- a/[esx_addons]/esx_lscustom/LICENSE
+++ b/[esx_addons]/esx_lscustom/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_lscustom
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_lscustom Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_lscustom Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_lscustom/README.md b/[esx_addons]/esx_lscustom/README.md
index 98a9a4ee..b569359f 100644
--- a/[esx_addons]/esx_lscustom/README.md
+++ b/[esx_addons]/esx_lscustom/README.md
@@ -31,7 +31,7 @@ start esx_lscustom
### License
esx_lscustoms - The best LS Custom out there for FX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_lscustom/fxmanifest.lua b/[esx_addons]/esx_lscustom/fxmanifest.lua
index acef71d4..29f33fa1 100644
--- a/[esx_addons]/esx_lscustom/fxmanifest.lua
+++ b/[esx_addons]/esx_lscustom/fxmanifest.lua
@@ -9,7 +9,7 @@ version 'legacy'
shared_script '@es_extended/imports.lua'
server_scripts {
- '@mysql-async/lib/MySQL.lua',
+ '@oxmysql/lib/MySQL.lua',
'@es_extended/locale.lua',
'locales/en.lua',
'locales/fr.lua',
diff --git a/[esx_addons]/esx_lscustom/server/main.lua b/[esx_addons]/esx_lscustom/server/main.lua
index f17279e3..766d8d13 100644
--- a/[esx_addons]/esx_lscustom/server/main.lua
+++ b/[esx_addons]/esx_lscustom/server/main.lua
@@ -37,17 +37,13 @@ RegisterServerEvent('esx_lscustom:refreshOwnedVehicle')
AddEventHandler('esx_lscustom:refreshOwnedVehicle', function(vehicleProps)
local xPlayer = ESX.GetPlayerFromId(source)
- MySQL.Async.fetchAll('SELECT vehicle FROM owned_vehicles WHERE plate = @plate', {
- ['@plate'] = vehicleProps.plate
- }, function(result)
- if result[1] then
- local vehicle = json.decode(result[1].vehicle)
+ MySQL.single('SELECT vehicle FROM owned_vehicles WHERE plate = ?', {vehicleProps.plate},
+ function(result)
+ if result then
+ local vehicle = json.decode(result.vehicle)
if vehicleProps.model == vehicle.model then
- MySQL.Async.execute('UPDATE owned_vehicles SET vehicle = @vehicle WHERE plate = @plate', {
- ['@plate'] = vehicleProps.plate,
- ['@vehicle'] = json.encode(vehicleProps)
- })
+ MySQL.update('UPDATE owned_vehicles SET vehicle = ? WHERE plate = ?', {json.encode(vehicleProps), vehicleProps.plate})
else
print(('esx_lscustom: %s attempted to upgrade vehicle with mismatching vehicle model!'):format(xPlayer.identifier))
end
@@ -57,20 +53,7 @@ end)
ESX.RegisterServerCallback('esx_lscustom:getVehiclesPrices', function(source, cb)
if not Vehicles then
- MySQL.Async.fetchAll('SELECT * FROM vehicles', {}, function(result)
- local vehicles = {}
-
- for i=1, #result, 1 do
- table.insert(vehicles, {
- model = result[i].model,
- price = result[i].price
- })
- end
-
- Vehicles = vehicles
- cb(Vehicles)
- end)
- else
- cb(Vehicles)
+ Vehicles = MySQL.query.await('SELECT model, price FROM vehicles')
end
+ cb(Vehicles)
end)
\ No newline at end of file
diff --git a/[esx_addons]/esx_mechanicjob/LICENSE b/[esx_addons]/esx_mechanicjob/LICENSE
index 62bb246b..e345d8e8 100644
--- a/[esx_addons]/esx_mechanicjob/LICENSE
+++ b/[esx_addons]/esx_mechanicjob/LICENSE
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
esx_mechanicjob
- Copyright (C) 2015-2021 Jérémie N'gadi
+ Copyright (C) 2015-2022 Jérémie N'gadi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
- esx_mechanicjob Copyright (C) 2015-2021 Jérémie N'gadi
+ esx_mechanicjob Copyright (C) 2015-2022 Jérémie N'gadi
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
diff --git a/[esx_addons]/esx_mechanicjob/README.md b/[esx_addons]/esx_mechanicjob/README.md
index c1f39e35..9e3cbbbc 100644
--- a/[esx_addons]/esx_mechanicjob/README.md
+++ b/[esx_addons]/esx_mechanicjob/README.md
@@ -39,7 +39,7 @@ start esx_mechanicjob
### License
esx_mechanicjob - mechanic job for ESX
-Copyright (C) 2015-2021 Jérémie N'gadi
+Copyright (C) 2015-2022 Jérémie N'gadi
This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version.
diff --git a/[esx_addons]/esx_mechanicjob/locales/fr.lua b/[esx_addons]/esx_mechanicjob/locales/fr.lua
index 8ef7b414..692b71f7 100644
--- a/[esx_addons]/esx_mechanicjob/locales/fr.lua
+++ b/[esx_addons]/esx_mechanicjob/locales/fr.lua
@@ -73,7 +73,7 @@ Locales['fr'] = {
['not_enough_gas_can'] = 'Vous n\'avez ~r~pas assez~s~ de bouteille de gaz',
['assembling_blowtorch'] = 'Assemblage de ~b~chalumeaux~s~...',
['not_enough_repair_tools'] = 'Vous n\'avez ~r~pas assez~s~ d\'outils réparation',
- ['assembling_blowtorch'] = 'Assemblage de ~b~kit réparation~s~...',
+ ['assembling_repair_kit'] = 'Assemblage de ~b~kit réparation~s~...',
['not_enough_body_tools'] = 'Vous n\'avez ~r~pas assez~s~ d\'outils carosserie',
['assembling_body_kit'] = 'Assemblage de ~b~kit carosserie~s~...',
['your_comp_earned'] = 'Votre société a ~g~gagné~s~ ~g~$',
diff --git a/[esx_addons]/esx_multicharacter b/[esx_addons]/esx_multicharacter
new file mode 160000
index 00000000..02352a8e
--- /dev/null
+++ b/[esx_addons]/esx_multicharacter
@@ -0,0 +1 @@
+Subproject commit 02352a8e18176cb9f369ba608aab66ccf0311fe0
diff --git a/[esx_addons]/esx_multicharacter/LICENSE.md b/[esx_addons]/esx_multicharacter/LICENSE.md
deleted file mode 100644
index f288702d..00000000
--- a/[esx_addons]/esx_multicharacter/LICENSE.md
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. ' + `${translate.name} ` + '
' + data.firstname +' '+ data.lastname +'' + `${translate.job} ` + '
'+ data.job +' '+ data.job_grade +'' + `${translate.money} ` + '
'+ money.format(data.money) +'' + `${translate.bank} ` + '
'+ money.format(data.bank) +' ' + `${translate.dob} ` + '
'+ data.dateofbirth +' ' + `${translate.gender} ` + '
'+ data.sex +'