diff --git a/.editorconfig b/_resources/esx_identity/.editorconfig
similarity index 100%
rename from .editorconfig
rename to _resources/esx_identity/.editorconfig
diff --git a/LICENSE b/_resources/esx_identity/LICENSE
similarity index 100%
rename from LICENSE
rename to _resources/esx_identity/LICENSE
diff --git a/README.md b/_resources/esx_identity/README.md
similarity index 100%
rename from README.md
rename to _resources/esx_identity/README.md
diff --git a/client/main.lua b/_resources/esx_identity/client/main.lua
similarity index 100%
rename from client/main.lua
rename to _resources/esx_identity/client/main.lua
diff --git a/config.lua b/_resources/esx_identity/config.lua
similarity index 100%
rename from config.lua
rename to _resources/esx_identity/config.lua
diff --git a/esx_identity.sql b/_resources/esx_identity/esx_identity.sql
similarity index 100%
rename from esx_identity.sql
rename to _resources/esx_identity/esx_identity.sql
diff --git a/fxmanifest.lua b/_resources/esx_identity/fxmanifest.lua
similarity index 100%
rename from fxmanifest.lua
rename to _resources/esx_identity/fxmanifest.lua
diff --git a/html/css/style.css b/_resources/esx_identity/html/css/style.css
similarity index 100%
rename from html/css/style.css
rename to _resources/esx_identity/html/css/style.css
diff --git a/html/img/esx_identity.png b/_resources/esx_identity/html/img/esx_identity.png
similarity index 100%
rename from html/img/esx_identity.png
rename to _resources/esx_identity/html/img/esx_identity.png
diff --git a/html/index.html b/_resources/esx_identity/html/index.html
similarity index 100%
rename from html/index.html
rename to _resources/esx_identity/html/index.html
diff --git a/html/index_heightslider.html b/_resources/esx_identity/html/index_heightslider.html
similarity index 100%
rename from html/index_heightslider.html
rename to _resources/esx_identity/html/index_heightslider.html
diff --git a/html/index_heighttext.html b/_resources/esx_identity/html/index_heighttext.html
similarity index 100%
rename from html/index_heighttext.html
rename to _resources/esx_identity/html/index_heighttext.html
diff --git a/html/index_options/index_heightslider.html b/_resources/esx_identity/html/index_options/index_heightslider.html
similarity index 100%
rename from html/index_options/index_heightslider.html
rename to _resources/esx_identity/html/index_options/index_heightslider.html
diff --git a/html/index_options/index_heighttext.html b/_resources/esx_identity/html/index_options/index_heighttext.html
similarity index 100%
rename from html/index_options/index_heighttext.html
rename to _resources/esx_identity/html/index_options/index_heighttext.html
diff --git a/html/js/script.js b/_resources/esx_identity/html/js/script.js
similarity index 100%
rename from html/js/script.js
rename to _resources/esx_identity/html/js/script.js
diff --git a/html/localization/cs_index(outofdate).html b/_resources/esx_identity/html/localization/cs_index(outofdate).html
similarity index 100%
rename from html/localization/cs_index(outofdate).html
rename to _resources/esx_identity/html/localization/cs_index(outofdate).html
diff --git a/html/localization/fi_index(outofdate).html b/_resources/esx_identity/html/localization/fi_index(outofdate).html
similarity index 100%
rename from html/localization/fi_index(outofdate).html
rename to _resources/esx_identity/html/localization/fi_index(outofdate).html
diff --git a/html/localization/ko_index(outofdate).html b/_resources/esx_identity/html/localization/ko_index(outofdate).html
similarity index 100%
rename from html/localization/ko_index(outofdate).html
rename to _resources/esx_identity/html/localization/ko_index(outofdate).html
diff --git a/html/localization/sv_index(outofdate).html b/_resources/esx_identity/html/localization/sv_index(outofdate).html
similarity index 100%
rename from html/localization/sv_index(outofdate).html
rename to _resources/esx_identity/html/localization/sv_index(outofdate).html
diff --git a/locales/cs.lua b/_resources/esx_identity/locales/cs.lua
similarity index 100%
rename from locales/cs.lua
rename to _resources/esx_identity/locales/cs.lua
diff --git a/locales/en.lua b/_resources/esx_identity/locales/en.lua
similarity index 100%
rename from locales/en.lua
rename to _resources/esx_identity/locales/en.lua
diff --git a/locales/es.lua b/_resources/esx_identity/locales/es.lua
similarity index 100%
rename from locales/es.lua
rename to _resources/esx_identity/locales/es.lua
diff --git a/locales/fi.lua b/_resources/esx_identity/locales/fi.lua
similarity index 100%
rename from locales/fi.lua
rename to _resources/esx_identity/locales/fi.lua
diff --git a/locales/pl.lua b/_resources/esx_identity/locales/pl.lua
similarity index 100%
rename from locales/pl.lua
rename to _resources/esx_identity/locales/pl.lua
diff --git a/server/main.lua b/_resources/esx_identity/server/main.lua
similarity index 100%
rename from server/main.lua
rename to _resources/esx_identity/server/main.lua
diff --git a/_resources/esx_lscustom/LICENSE b/_resources/esx_lscustom/LICENSE
new file mode 100644
index 00000000..60322959
--- /dev/null
+++ b/_resources/esx_lscustom/LICENSE
@@ -0,0 +1,678 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+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.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ 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 .
+
+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:
+
+ {project} Copyright (C) {year} {fullname}
+ 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.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<<<<<<< HEAD
+.
+=======
+.
+>>>>>>> esx_lscustom/master
diff --git a/_resources/esx_lscustom/README.md b/_resources/esx_lscustom/README.md
new file mode 100644
index 00000000..f6e92b25
--- /dev/null
+++ b/_resources/esx_lscustom/README.md
@@ -0,0 +1,87 @@
+<<<<<<< HEAD
+# esx_identity
+
+## Requirements
+* Dependencies For Full Functionality
+ * [esx_skin](https://github.com/ESX-Org/esx_skin)
+ * [esx_policejob](https://github.com/ESX-Org/esx_policejob)
+ * [esx_society](https://github.com/ESX-Org/esx_society)
+=======
+# esx_lscustom
+
+## Requirements
+- [esx_vehicleshop](https://github.com/ESX-Org/esx_vehicleshop)
+>>>>>>> esx_lscustom/master
+
+## Download & Installation
+
+### Using [fvm](https://github.com/qlaffont/fvm-installer)
+```
+<<<<<<< HEAD
+fvm install --save --folder=esx esx-org/esx_identity
+=======
+fvm install --save --folder=esx esx-org/esx_lscustom
+>>>>>>> esx_lscustom/master
+```
+
+### Using Git
+```
+cd resources
+<<<<<<< HEAD
+git clone https://github.com/ESX-Org/esx_identity [esx]/esx_identity
+```
+
+### Manually
+- Download https://github.com/ESX-Org/esx_identity/archive/master.zip
+- Put it in the `[esx]` directory
+
+## Installation
+- Import `esx_identity.sql` in your database
+- Add this to your `server.cfg`:
+
+```
+start esx_identity
+```
+
+- If you are using esx_policejob or esx_society, you need to enable the following in the scripts' `config.lua`:
+```Config.EnableESXIdentity = true```
+
+### Commands
+```
+/char
+/chardel
+=======
+git clone https://github.com/ESX-Org/esx_lscustom [esx]/esx_lscustom
+```
+
+### Manually
+- Download https://github.com/ESX-Org/esx_lscustom/archive/master.zip
+- Put it in the `[esx]` directory
+
+## Installation
+- Add this to your `server.cfg`:
+
+```
+start esx_lscustom
+>>>>>>> esx_lscustom/master
+```
+
+# Legal
+### License
+<<<<<<< HEAD
+esx_identity - rp characters
+=======
+esx_lscustoms - The best LS Custom out there for FX
+>>>>>>> esx_lscustom/master
+
+Copyright (C) 2015-2020 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.
+
+<<<<<<< HEAD
+You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/.
+=======
+You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/.
+>>>>>>> esx_lscustom/master
diff --git a/_resources/esx_lscustom/client/main.lua b/_resources/esx_lscustom/client/main.lua
new file mode 100644
index 00000000..e24fd6b2
--- /dev/null
+++ b/_resources/esx_lscustom/client/main.lua
@@ -0,0 +1,549 @@
+ESX = nil
+<<<<<<< HEAD
+local loadingScreenFinished = false
+=======
+local Vehicles = {}
+local PlayerData = {}
+local lsMenuIsShowed = false
+local isInLSMarker = false
+local myCar = {}
+>>>>>>> esx_lscustom/master
+
+Citizen.CreateThread(function()
+ while ESX == nil do
+ TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
+ Citizen.Wait(0)
+ end
+<<<<<<< HEAD
+end)
+
+RegisterNetEvent('esx_identity:alreadyRegistered')
+AddEventHandler('esx_identity:alreadyRegistered', function()
+ while not loadingScreenFinished do
+ Citizen.Wait(100)
+ end
+
+ TriggerEvent('esx_skin:playerRegistered')
+end)
+
+AddEventHandler('esx:loadingScreenOff', function()
+ loadingScreenFinished = true
+end)
+
+if not Config.UseDeferrals then
+ local guiEnabled, isDead = false, false
+
+ AddEventHandler('esx:onPlayerDeath', function(data)
+ isDead = true
+ end)
+
+ AddEventHandler('esx:onPlayerSpawn', function(spawn)
+ isDead = false
+ end)
+
+ function EnableGui(state)
+ SetNuiFocus(state, state)
+ guiEnabled = state
+
+ SendNUIMessage({
+ type = "enableui",
+ enable = state
+ })
+ end
+
+ RegisterNetEvent('esx_identity:showRegisterIdentity')
+ AddEventHandler('esx_identity:showRegisterIdentity', function()
+ TriggerEvent('esx_skin:resetFirstSpawn')
+
+ if not isDead then
+ EnableGui(true)
+ end
+ end)
+
+ RegisterNUICallback('register', function(data, cb)
+ ESX.TriggerServerCallback('esx_identity:registerIdentity', function(callback)
+ if callback then
+ ESX.ShowNotification(_U('thank_you_for_registering'))
+ EnableGui(false)
+ if not ESX.GetConfig().Multichar then TriggerEvent('esx_skin:playerRegistered') end
+ else
+ ESX.ShowNotification(_U('registration_error'))
+ end
+ end, data)
+ end)
+
+ Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(5)
+
+ if guiEnabled then
+ DisableControlAction(0, 1, true) -- LookLeftRight
+ DisableControlAction(0, 2, true) -- LookUpDown
+ DisableControlAction(0, 106, true) -- VehicleMouseControlOverride
+ DisableControlAction(0, 142, true) -- MeleeAttackAlternate
+ DisableControlAction(0, 30, true) -- MoveLeftRight
+ DisableControlAction(0, 31, true) -- MoveUpDown
+ DisableControlAction(0, 21, true) -- disable sprint
+ DisableControlAction(0, 24, true) -- disable attack
+ DisableControlAction(0, 25, true) -- disable aim
+ DisableControlAction(0, 47, true) -- disable weapon
+ DisableControlAction(0, 58, true) -- disable weapon
+ DisableControlAction(0, 263, true) -- disable melee
+ DisableControlAction(0, 264, true) -- disable melee
+ DisableControlAction(0, 257, true) -- disable melee
+ DisableControlAction(0, 140, true) -- disable melee
+ DisableControlAction(0, 141, true) -- disable melee
+ DisableControlAction(0, 143, true) -- disable melee
+ DisableControlAction(0, 75, true) -- disable exit vehicle
+ DisableControlAction(27, 75, true) -- disable exit vehicle
+ end
+ end
+ end)
+end
+=======
+
+ while ESX.GetPlayerData().job == nil do
+ Citizen.Wait(10)
+ end
+
+ PlayerData = ESX.GetPlayerData()
+end)
+
+RegisterNetEvent('esx:playerLoaded')
+AddEventHandler('esx:playerLoaded', function(xPlayer)
+ PlayerData = xPlayer
+
+ ESX.TriggerServerCallback('esx_lscustom:getVehiclesPrices', function(vehicles)
+ Vehicles = vehicles
+ end)
+end)
+
+RegisterNetEvent('esx:setJob')
+AddEventHandler('esx:setJob', function(job)
+ PlayerData.job = job
+end)
+
+RegisterNetEvent('esx_lscustom:installMod')
+AddEventHandler('esx_lscustom:installMod', function()
+ local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
+ myCar = ESX.Game.GetVehicleProperties(vehicle)
+ TriggerServerEvent('esx_lscustom:refreshOwnedVehicle', myCar)
+end)
+
+RegisterNetEvent('esx_lscustom:cancelInstallMod')
+AddEventHandler('esx_lscustom:cancelInstallMod', function()
+ local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
+ if (GetPedInVehicleSeat(vehicle, -1) ~= PlayerPedId()) then
+ vehicle = GetPlayersLastVehicle(PlayerPedId())
+ end
+ ESX.Game.SetVehicleProperties(vehicle, myCar)
+ if not (myCar.modTurbo) then
+ ToggleVehicleMod(vehicle, 18, false)
+ end
+ if not (myCar.modXenon) then
+ ToggleVehicleMod(vehicle, 22, false)
+ end
+ if not (myCar.windowTint) then
+ SetVehicleWindowTint(vehicle, 0)
+ end
+end)
+
+function OpenLSMenu(elems, menuName, menuTitle, parent)
+ ESX.UI.Menu.Open('default', GetCurrentResourceName(), menuName,
+ {
+ title = menuTitle,
+ align = 'top-left',
+ elements = elems
+ }, function(data, menu)
+ local isRimMod, found = false, false
+ local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
+
+ if data.current.modType == "modFrontWheels" then
+ isRimMod = true
+ end
+
+ for k,v in pairs(Config.Menus) do
+
+ if k == data.current.modType or isRimMod then
+
+ if data.current.label == _U('by_default') or string.match(data.current.label, _U('installed')) then
+ ESX.ShowNotification(_U('already_own', data.current.label))
+ TriggerEvent('esx_lscustom:installMod')
+ else
+ local vehiclePrice = 50000
+
+ for i=1, #Vehicles, 1 do
+ if GetEntityModel(vehicle) == GetHashKey(Vehicles[i].model) then
+ vehiclePrice = Vehicles[i].price
+ break
+ end
+ end
+
+ if isRimMod then
+ price = math.floor(vehiclePrice * data.current.price / 100)
+ TriggerServerEvent('esx_lscustom:buyMod', price)
+ elseif v.modType == 11 or v.modType == 12 or v.modType == 13 or v.modType == 15 or v.modType == 16 then
+ price = math.floor(vehiclePrice * v.price[data.current.modNum + 1] / 100)
+ TriggerServerEvent('esx_lscustom:buyMod', price)
+ elseif v.modType == 17 then
+ price = math.floor(vehiclePrice * v.price[1] / 100)
+ TriggerServerEvent('esx_lscustom:buyMod', price)
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ TriggerServerEvent('esx_lscustom:buyMod', price)
+ end
+ end
+
+ menu.close()
+ found = true
+ break
+ end
+
+ end
+
+ if not found then
+ GetAction(data.current)
+ end
+ end, function(data, menu) -- on cancel
+ menu.close()
+ TriggerEvent('esx_lscustom:cancelInstallMod')
+
+ local playerPed = PlayerPedId()
+ local vehicle = GetVehiclePedIsIn(playerPed, false)
+ SetVehicleDoorsShut(vehicle, false)
+
+ if parent == nil then
+ lsMenuIsShowed = false
+ local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
+ FreezeEntityPosition(vehicle, false)
+ myCar = {}
+ end
+ end, function(data, menu) -- on change
+ UpdateMods(data.current)
+ end)
+end
+
+function UpdateMods(data)
+ local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
+
+ if data.modType then
+ local props = {}
+
+ if data.wheelType then
+ props['wheels'] = data.wheelType
+ ESX.Game.SetVehicleProperties(vehicle, props)
+ props = {}
+ elseif data.modType == 'neonColor' then
+ if data.modNum[1] == 0 and data.modNum[2] == 0 and data.modNum[3] == 0 then
+ props['neonEnabled'] = { false, false, false, false }
+ else
+ props['neonEnabled'] = { true, true, true, true }
+ end
+ ESX.Game.SetVehicleProperties(vehicle, props)
+ props = {}
+ elseif data.modType == 'tyreSmokeColor' then
+ props['modSmokeEnabled'] = true
+ ESX.Game.SetVehicleProperties(vehicle, props)
+ props = {}
+ end
+
+ props[data.modType] = data.modNum
+ ESX.Game.SetVehicleProperties(vehicle, props)
+ end
+end
+
+function GetAction(data)
+ local elements = {}
+ local menuName = ''
+ local menuTitle = ''
+ local parent = nil
+
+ local playerPed = PlayerPedId()
+ local vehicle = GetVehiclePedIsIn(playerPed, false)
+ local currentMods = ESX.Game.GetVehicleProperties(vehicle)
+
+ if data.value == 'modSpeakers' or
+ data.value == 'modTrunk' or
+ data.value == 'modHydrolic' or
+ data.value == 'modEngineBlock' or
+ data.value == 'modAirFilter' or
+ data.value == 'modStruts' or
+ data.value == 'modTank' then
+ SetVehicleDoorOpen(vehicle, 4, false)
+ SetVehicleDoorOpen(vehicle, 5, false)
+ elseif data.value == 'modDoorSpeaker' then
+ SetVehicleDoorOpen(vehicle, 0, false)
+ SetVehicleDoorOpen(vehicle, 1, false)
+ SetVehicleDoorOpen(vehicle, 2, false)
+ SetVehicleDoorOpen(vehicle, 3, false)
+ else
+ SetVehicleDoorsShut(vehicle, false)
+ end
+
+ local vehiclePrice = 50000
+
+ for i=1, #Vehicles, 1 do
+ if GetEntityModel(vehicle) == GetHashKey(Vehicles[i].model) then
+ vehiclePrice = Vehicles[i].price
+ break
+ end
+ end
+
+ for k,v in pairs(Config.Menus) do
+
+ if data.value == k then
+
+ menuName = k
+ menuTitle = v.label
+ parent = v.parent
+
+ if v.modType then
+
+ if v.modType == 22 then
+ table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = false})
+ elseif v.modType == 'neonColor' or v.modType == 'tyreSmokeColor' then -- disable neon
+ table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = {0, 0, 0}})
+ elseif v.modType == 'color1' or v.modType == 'color2' or v.modType == 'pearlescentColor' or v.modType == 'wheelColor' then
+ local num = myCar[v.modType]
+ table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = num})
+ elseif v.modType == 17 then
+ table.insert(elements, {label = " " .. _U('no_turbo'), modType = k, modNum = false})
+ else
+ table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = -1})
+ end
+
+ if v.modType == 14 then -- HORNS
+ for j = 0, 51, 1 do
+ local _label = ''
+ if j == currentMods.modHorns then
+ _label = GetHornName(j) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = GetHornName(j) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = j})
+ end
+ elseif v.modType == 'plateIndex' then -- PLATES
+ for j = 0, 4, 1 do
+ local _label = ''
+ if j == currentMods.plateIndex then
+ _label = GetPlatesName(j) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = GetPlatesName(j) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = j})
+ end
+ elseif v.modType == 22 then -- NEON
+ local _label = ''
+ if currentMods.modXenon then
+ _label = _U('neon') .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = _U('neon') .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = true})
+ elseif v.modType == 'neonColor' or v.modType == 'tyreSmokeColor' then -- NEON & SMOKE COLOR
+ local neons = GetNeons()
+ price = math.floor(vehiclePrice * v.price / 100)
+ for i=1, #neons, 1 do
+ table.insert(elements, {
+ label = '' .. neons[i].label .. ' - $' .. price .. '',
+ modType = k,
+ modNum = { neons[i].r, neons[i].g, neons[i].b }
+ })
+ end
+ elseif v.modType == 'color1' or v.modType == 'color2' or v.modType == 'pearlescentColor' or v.modType == 'wheelColor' then -- RESPRAYS
+ local colors = GetColors(data.color)
+ for j = 1, #colors, 1 do
+ local _label = ''
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = colors[j].label .. ' - $' .. price .. ' '
+ table.insert(elements, {label = _label, modType = k, modNum = colors[j].index})
+ end
+ elseif v.modType == 'windowTint' then -- WINDOWS TINT
+ for j = 1, 5, 1 do
+ local _label = ''
+ if j == currentMods.modHorns then
+ _label = GetWindowName(j) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = GetWindowName(j) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = j})
+ end
+ elseif v.modType == 23 then -- WHEELS RIM & TYPE
+ local props = {}
+
+ props['wheels'] = v.wheelType
+ ESX.Game.SetVehicleProperties(vehicle, props)
+
+ local modCount = GetNumVehicleMods(vehicle, v.modType)
+ for j = 0, modCount, 1 do
+ local modName = GetModTextLabel(vehicle, v.modType, j)
+ if modName then
+ local _label = ''
+ if j == currentMods.modFrontWheels then
+ _label = GetLabelText(modName) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = GetLabelText(modName) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = 'modFrontWheels', modNum = j, wheelType = v.wheelType, price = v.price})
+ end
+ end
+ elseif v.modType == 11 or v.modType == 12 or v.modType == 13 or v.modType == 15 or v.modType == 16 then
+ SetVehicleModKit(vehicle, 0)
+ local modCount = GetNumVehicleMods(vehicle, v.modType) -- UPGRADES
+ for j = 0, modCount, 1 do
+ local _label = ''
+ if j == currentMods[k] then
+ _label = _U('level', j+1) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price[j+1] / 100)
+ _label = _U('level', j+1) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = j})
+ if j == modCount-1 then
+ break
+ end
+ end
+ elseif v.modType == 17 then -- TURBO
+ local _label = ''
+ if currentMods[k] then
+ _label = 'Turbo - '.. _U('installed') ..''
+ else
+ _label = 'Turbo - $' .. math.floor(vehiclePrice * v.price[1] / 100) .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = true})
+ else
+ local modCount = GetNumVehicleMods(vehicle, v.modType) -- BODYPARTS
+ for j = 0, modCount, 1 do
+ local modName = GetModTextLabel(vehicle, v.modType, j)
+ if modName then
+ local _label = ''
+ if j == currentMods[k] then
+ _label = GetLabelText(modName) .. ' - '.. _U('installed') ..''
+ else
+ price = math.floor(vehiclePrice * v.price / 100)
+ _label = GetLabelText(modName) .. ' - $' .. price .. ' '
+ end
+ table.insert(elements, {label = _label, modType = k, modNum = j})
+ end
+ end
+ end
+ else
+ if data.value == 'primaryRespray' or data.value == 'secondaryRespray' or data.value == 'pearlescentRespray' or data.value == 'modFrontWheelsColor' then
+ for i=1, #Config.Colors, 1 do
+ if data.value == 'primaryRespray' then
+ table.insert(elements, {label = Config.Colors[i].label, value = 'color1', color = Config.Colors[i].value})
+ elseif data.value == 'secondaryRespray' then
+ table.insert(elements, {label = Config.Colors[i].label, value = 'color2', color = Config.Colors[i].value})
+ elseif data.value == 'pearlescentRespray' then
+ table.insert(elements, {label = Config.Colors[i].label, value = 'pearlescentColor', color = Config.Colors[i].value})
+ elseif data.value == 'modFrontWheelsColor' then
+ table.insert(elements, {label = Config.Colors[i].label, value = 'wheelColor', color = Config.Colors[i].value})
+ end
+ end
+ else
+ for l,w in pairs(v) do
+ if l ~= 'label' and l ~= 'parent' then
+ table.insert(elements, {label = w, value = l})
+ end
+ end
+ end
+ end
+ break
+ end
+ end
+
+ table.sort(elements, function(a, b)
+ return a.label < b.label
+ end)
+
+ OpenLSMenu(elements, menuName, menuTitle, parent)
+end
+
+-- Blips
+Citizen.CreateThread(function()
+ for k,v in pairs(Config.Zones) do
+ local blip = AddBlipForCoord(v.Pos.x, v.Pos.y, v.Pos.z)
+
+ SetBlipSprite(blip, 72)
+ SetBlipScale(blip, 0.8)
+ SetBlipAsShortRange(blip, true)
+
+ BeginTextCommandSetBlipName('STRING')
+ AddTextComponentSubstringPlayerName(v.Name)
+ EndTextCommandSetBlipName(blip)
+ end
+end)
+
+-- Activate menu when player is inside marker
+Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(0)
+ local playerPed = PlayerPedId()
+
+ if IsPedInAnyVehicle(playerPed, false) then
+ local coords = GetEntityCoords(PlayerPedId())
+ local currentZone, zone, lastZone
+
+ if (PlayerData.job and PlayerData.job.name == 'mechanic') or not Config.IsMechanicJobOnly then
+ for k,v in pairs(Config.Zones) do
+ if GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x and not lsMenuIsShowed then
+ isInLSMarker = true
+ ESX.ShowHelpNotification(v.Hint)
+ break
+ else
+ isInLSMarker = false
+ end
+ end
+ end
+
+ if IsControlJustReleased(0, 38) and not lsMenuIsShowed and isInLSMarker then
+ if (PlayerData.job and PlayerData.job.name == 'mechanic') or not Config.IsMechanicJobOnly then
+ lsMenuIsShowed = true
+
+ local vehicle = GetVehiclePedIsIn(playerPed, false)
+ FreezeEntityPosition(vehicle, true)
+
+ myCar = ESX.Game.GetVehicleProperties(vehicle)
+
+ ESX.UI.Menu.CloseAll()
+ GetAction({value = 'main'})
+ end
+ end
+
+ if isInLSMarker and not hasAlreadyEnteredMarker then
+ hasAlreadyEnteredMarker = true
+ end
+
+ if not isInLSMarker and hasAlreadyEnteredMarker then
+ hasAlreadyEnteredMarker = false
+ end
+
+ end
+ end
+end)
+
+-- Prevent Free Tunning Bug
+Citizen.CreateThread(function()
+ while true do
+ Citizen.Wait(0)
+
+ if lsMenuIsShowed then
+ DisableControlAction(2, 288, true)
+ DisableControlAction(2, 289, true)
+ DisableControlAction(2, 170, true)
+ DisableControlAction(2, 167, true)
+ DisableControlAction(2, 168, true)
+ DisableControlAction(2, 23, true)
+ DisableControlAction(0, 75, true) -- Disable exit vehicle
+ DisableControlAction(27, 75, true) -- Disable exit vehicle
+ else
+ Citizen.Wait(500)
+ end
+ end
+end)
+>>>>>>> esx_lscustom/master
diff --git a/_resources/esx_lscustom/config.lua b/_resources/esx_lscustom/config.lua
new file mode 100644
index 00000000..58bdd847
--- /dev/null
+++ b/_resources/esx_lscustom/config.lua
@@ -0,0 +1,942 @@
+<<<<<<< HEAD
+Config = {}
+Config.Locale = 'en'
+
+-- [Config.EnableCommands]
+-- Enables Commands Such As /char and /chardel
+Config.EnableCommands = true
+
+-- [Config.UseSteamID]
+-- Changes the identifiers from Rockstar License To Steam. In order to use this, you will have to have
+-- made edits to your ESX in order to use Steam identifiers all around, because new ESX uses Rockstar
+-- license. I just made it easier for people that convert to steam identifiers.
+
+-- [Config.UseDeferrals]
+-- EXPERIMENTAL Character Registration Method. This will allow players to create identities in deferrals
+-- before they ever join the server. This still needs time of testing to see what issues that we have
+-- in linux servers and windows servers, and which artifacts it will work on, and which artifacts it
+-- will not work on. If you don't know a lot about this, I would suggest to set it false for now.
+Config.UseDeferrals = false -- EXPERIMENTAL Character Registration Method.
+
+
+-- These values are for the second input validation in server/main.lua
+Config.MaxNameLength = 20
+Config.MinHeight = 45
+Config.MaxHeight = 96
+Config.LowestYear = 1900
+Config.HighestYear = 2021
+
+Config.FullCharDelete = false
+Config.EnableDebugging = false
+=======
+Config = {}
+Config.DrawDistance = 100.0
+Config.Locale = 'en'
+Config.IsMechanicJobOnly = false
+
+Config.Zones = {
+
+ ls1 = {
+ Pos = { x = -337.38, y = -136.92, z = 38.57},
+ Size = {x = 3.0, y = 3.0, z = 0.2},
+ Color = {r = 204, g = 204, b = 0},
+ Marker= 1,
+ Name = _U('blip_name'),
+ Hint = _U('press_custom')
+ },
+
+ ls2 = {
+ Pos = { x = -1155.53, y = -2007.18, z = 12.74},
+ Size = {x = 3.0, y = 3.0, z = 0.2},
+ Color = {r = 204, g = 204, b = 0},
+ Marker= 1,
+ Name = _U('blip_name'),
+ Hint = _U('press_custom')
+ },
+
+ ls3 = {
+ Pos = { x = 731.81, y = -1088.82, z = 21.73},
+ Size = {x = 3.0, y = 3.0, z = 0.2},
+ Color = {r = 204, g = 204, b = 0},
+ Marker= 1,
+ Name = _U('blip_name'),
+ Hint = _U('press_custom')
+ },
+
+ ls4 = {
+ Pos = { x = 1175.04, y = 2640.21, z = 37.32},
+ Size = {x = 3.0, y = 3.0, z = 0.2},
+ Color = {r = 204, g = 204, b = 0},
+ Marker= 1,
+ Name = _U('blip_name'),
+ Hint = _U('press_custom')
+ },
+
+ ls5 = {
+ Pos = { x = 110.99, y = 6626.39, z = 30.89},
+ Size = {x = 3.0, y = 3.0, z = 0.2},
+ Color = {r = 204, g = 204, b = 0},
+ Marker= 1,
+ Name = _U('blip_name'),
+ Hint = _U('press_custom')
+ }
+
+}
+
+Config.Colors = {
+ {label = _U('black'), value = 'black'},
+ {label = _U('white'), value = 'white'},
+ {label = _U('grey'), value = 'grey'},
+ {label = _U('red'), value = 'red'},
+ {label = _U('pink'), value = 'pink'},
+ {label = _U('blue'), value = 'blue'},
+ {label = _U('yellow'), value = 'yellow'},
+ {label = _U('green'), value = 'green'},
+ {label = _U('orange'), value = 'orange'},
+ {label = _U('brown'), value = 'brown'},
+ {label = _U('purple'), value = 'purple'},
+ {label = _U('chrome'), value = 'chrome'},
+ {label = _U('gold'), value = 'gold'}
+}
+
+function GetColors(color)
+ local colors = {}
+ if color == 'black' then
+ colors = {
+ { index = 0, label = _U('black')},
+ { index = 1, label = _U('graphite')},
+ { index = 2, label = _U('black_metallic')},
+ { index = 3, label = _U('caststeel')},
+ { index = 11, label = _U('black_anth')},
+ { index = 12, label = _U('matteblack')},
+ { index = 15, label = _U('darknight')},
+ { index = 16, label = _U('deepblack')},
+ { index = 21, label = _U('oil')},
+ { index = 147, label = _U('carbon')}
+ }
+ elseif color == 'white' then
+ colors = {
+ { index = 106, label = _U('vanilla')},
+ { index = 107, label = _U('creme')},
+ { index = 111, label = _U('white')},
+ { index = 112, label = _U('polarwhite')},
+ { index = 113, label = _U('beige')},
+ { index = 121, label = _U('mattewhite')},
+ { index = 122, label = _U('snow')},
+ { index = 131, label = _U('cotton')},
+ { index = 132, label = _U('alabaster')},
+ { index = 134, label = _U('purewhite')}
+ }
+ elseif color == 'grey' then
+ colors = {
+ { index = 4, label = _U('silver')},
+ { index = 5, label = _U('metallicgrey')},
+ { index = 6, label = _U('laminatedsteel')},
+ { index = 7, label = _U('darkgray')},
+ { index = 8, label = _U('rockygray')},
+ { index = 9, label = _U('graynight')},
+ { index = 10, label = _U('aluminum')},
+ { index = 13, label = _U('graymat')},
+ { index = 14, label = _U('lightgrey')},
+ { index = 17, label = _U('asphaltgray')},
+ { index = 18, label = _U('grayconcrete')},
+ { index = 19, label = _U('darksilver')},
+ { index = 20, label = _U('magnesite')},
+ { index = 22, label = _U('nickel')},
+ { index = 23, label = _U('zinc')},
+ { index = 24, label = _U('dolomite')},
+ { index = 25, label = _U('bluesilver')},
+ { index = 26, label = _U('titanium')},
+ { index = 66, label = _U('steelblue')},
+ { index = 93, label = _U('champagne')},
+ { index = 144, label = _U('grayhunter')},
+ { index = 156, label = _U('grey')}
+ }
+ elseif color == 'red' then
+ colors = {
+ { index = 27, label = _U('red')},
+ { index = 28, label = _U('torino_red')},
+ { index = 29, label = _U('poppy')},
+ { index = 30, label = _U('copper_red')},
+ { index = 31, label = _U('cardinal')},
+ { index = 32, label = _U('brick')},
+ { index = 33, label = _U('garnet')},
+ { index = 34, label = _U('cabernet')},
+ { index = 35, label = _U('candy')},
+ { index = 39, label = _U('matte_red')},
+ { index = 40, label = _U('dark_red')},
+ { index = 43, label = _U('red_pulp')},
+ { index = 44, label = _U('bril_red')},
+ { index = 46, label = _U('pale_red')},
+ { index = 143, label = _U('wine_red')},
+ { index = 150, label = _U('volcano')}
+ }
+ elseif color == 'pink' then
+ colors = {
+ { index = 135, label = _U('electricpink')},
+ { index = 136, label = _U('salmon')},
+ { index = 137, label = _U('sugarplum')}
+ }
+ elseif color == 'blue' then
+ colors = {
+ { index = 54, label = _U('topaz')},
+ { index = 60, label = _U('light_blue')},
+ { index = 61, label = _U('galaxy_blue')},
+ { index = 62, label = _U('dark_blue')},
+ { index = 63, label = _U('azure')},
+ { index = 64, label = _U('navy_blue')},
+ { index = 65, label = _U('lapis')},
+ { index = 67, label = _U('blue_diamond')},
+ { index = 68, label = _U('surfer')},
+ { index = 69, label = _U('pastel_blue')},
+ { index = 70, label = _U('celeste_blue')},
+ { index = 73, label = _U('rally_blue')},
+ { index = 74, label = _U('blue_paradise')},
+ { index = 75, label = _U('blue_night')},
+ { index = 77, label = _U('cyan_blue')},
+ { index = 78, label = _U('cobalt')},
+ { index = 79, label = _U('electric_blue')},
+ { index = 80, label = _U('horizon_blue')},
+ { index = 82, label = _U('metallic_blue')},
+ { index = 83, label = _U('aquamarine')},
+ { index = 84, label = _U('blue_agathe')},
+ { index = 85, label = _U('zirconium')},
+ { index = 86, label = _U('spinel')},
+ { index = 87, label = _U('tourmaline')},
+ { index = 127, label = _U('paradise')},
+ { index = 140, label = _U('bubble_gum')},
+ { index = 141, label = _U('midnight_blue')},
+ { index = 146, label = _U('forbidden_blue')},
+ { index = 157, label = _U('glacier_blue')}
+ }
+ elseif color == 'yellow' then
+ colors = {
+ { index = 42, label = _U('yellow')},
+ { index = 88, label = _U('wheat')},
+ { index = 89, label = _U('raceyellow')},
+ { index = 91, label = _U('paleyellow')},
+ { index = 126, label = _U('lightyellow')}
+ }
+ elseif color == 'green' then
+ colors = {
+ { index = 49, label = _U('met_dark_green')},
+ { index = 50, label = _U('rally_green')},
+ { index = 51, label = _U('pine_green')},
+ { index = 52, label = _U('olive_green')},
+ { index = 53, label = _U('light_green')},
+ { index = 55, label = _U('lime_green')},
+ { index = 56, label = _U('forest_green')},
+ { index = 57, label = _U('lawn_green')},
+ { index = 58, label = _U('imperial_green')},
+ { index = 59, label = _U('green_bottle')},
+ { index = 92, label = _U('citrus_green')},
+ { index = 125, label = _U('green_anis')},
+ { index = 128, label = _U('khaki')},
+ { index = 133, label = _U('army_green')},
+ { index = 151, label = _U('dark_green')},
+ { index = 152, label = _U('hunter_green')},
+ { index = 155, label = _U('matte_foilage_green')}
+ }
+ elseif color == 'orange' then
+ colors = {
+ { index = 36, label = _U('tangerine')},
+ { index = 38, label = _U('orange')},
+ { index = 41, label = _U('matteorange')},
+ { index = 123, label = _U('lightorange')},
+ { index = 124, label = _U('peach')},
+ { index = 130, label = _U('pumpkin')},
+ { index = 138, label = _U('orangelambo')}
+ }
+ elseif color == 'brown' then
+ colors = {
+ { index = 45, label = _U('copper')},
+ { index = 47, label = _U('lightbrown')},
+ { index = 48, label = _U('darkbrown')},
+ { index = 90, label = _U('bronze')},
+ { index = 94, label = _U('brownmetallic')},
+ { index = 95, label = _U('Expresso')},
+ { index = 96, label = _U('chocolate')},
+ { index = 97, label = _U('terracotta')},
+ { index = 98, label = _U('marble')},
+ { index = 99, label = _U('sand')},
+ { index = 100, label = _U('sepia')},
+ { index = 101, label = _U('bison')},
+ { index = 102, label = _U('palm')},
+ { index = 103, label = _U('caramel')},
+ { index = 104, label = _U('rust')},
+ { index = 105, label = _U('chestnut')},
+ { index = 108, label = _U('brown')},
+ { index = 109, label = _U('hazelnut')},
+ { index = 110, label = _U('shell')},
+ { index = 114, label = _U('mahogany')},
+ { index = 115, label = _U('cauldron')},
+ { index = 116, label = _U('blond')},
+ { index = 129, label = _U('gravel')},
+ { index = 153, label = _U('darkearth')},
+ { index = 154, label = _U('desert')}
+ }
+ elseif color == 'purple' then
+ colors = {
+ { index = 71, label = _U('indigo')},
+ { index = 72, label = _U('deeppurple')},
+ { index = 76, label = _U('darkviolet')},
+ { index = 81, label = _U('amethyst')},
+ { index = 142, label = _U('mysticalviolet')},
+ { index = 145, label = _U('purplemetallic')},
+ { index = 148, label = _U('matteviolet')},
+ { index = 149, label = _U('mattedeeppurple')}
+ }
+ elseif color == 'chrome' then
+ colors = {
+ { index = 117, label = _U('brushedchrome')},
+ { index = 118, label = _U('blackchrome')},
+ { index = 119, label = _U('brushedaluminum')},
+ { index = 120, label = _U('chrome')}
+ }
+ elseif color == 'gold' then
+ colors = {
+ { index = 37, label = _U('gold')},
+ { index = 158, label = _U('puregold')},
+ { index = 159, label = _U('brushedgold')},
+ { index = 160, label = _U('lightgold')}
+ }
+ end
+ return colors
+end
+
+function GetWindowName(index)
+ if (index == 1) then
+ return "Pure Black"
+ elseif (index == 2) then
+ return "Darksmoke"
+ elseif (index == 3) then
+ return "Lightsmoke"
+ elseif (index == 4) then
+ return "Limo"
+ elseif (index == 5) then
+ return "Green"
+ else
+ return "Unknown"
+ end
+end
+
+function GetHornName(index)
+ if (index == 0) then
+ return "Truck Horn"
+ elseif (index == 1) then
+ return "Cop Horn"
+ elseif (index == 2) then
+ return "Clown Horn"
+ elseif (index == 3) then
+ return "Musical Horn 1"
+ elseif (index == 4) then
+ return "Musical Horn 2"
+ elseif (index == 5) then
+ return "Musical Horn 3"
+ elseif (index == 6) then
+ return "Musical Horn 4"
+ elseif (index == 7) then
+ return "Musical Horn 5"
+ elseif (index == 8) then
+ return "Sad Trombone"
+ elseif (index == 9) then
+ return "Classical Horn 1"
+ elseif (index == 10) then
+ return "Classical Horn 2"
+ elseif (index == 11) then
+ return "Classical Horn 3"
+ elseif (index == 12) then
+ return "Classical Horn 4"
+ elseif (index == 13) then
+ return "Classical Horn 5"
+ elseif (index == 14) then
+ return "Classical Horn 6"
+ elseif (index == 15) then
+ return "Classical Horn 7"
+ elseif (index == 16) then
+ return "Scale - Do"
+ elseif (index == 17) then
+ return "Scale - Re"
+ elseif (index == 18) then
+ return "Scale - Mi"
+ elseif (index == 19) then
+ return "Scale - Fa"
+ elseif (index == 20) then
+ return "Scale - Sol"
+ elseif (index == 21) then
+ return "Scale - La"
+ elseif (index == 22) then
+ return "Scale - Ti"
+ elseif (index == 23) then
+ return "Scale - Do"
+ elseif (index == 24) then
+ return "Jazz Horn 1"
+ elseif (index == 25) then
+ return "Jazz Horn 2"
+ elseif (index == 26) then
+ return "Jazz Horn 3"
+ elseif (index == 27) then
+ return "Jazz Horn Loop"
+ elseif (index == 28) then
+ return "Star Spangled Banner 1"
+ elseif (index == 29) then
+ return "Star Spangled Banner 2"
+ elseif (index == 30) then
+ return "Star Spangled Banner 3"
+ elseif (index == 31) then
+ return "Star Spangled Banner 4"
+ elseif (index == 32) then
+ return "Classical Horn 8 Loop"
+ elseif (index == 33) then
+ return "Classical Horn 9 Loop"
+ elseif (index == 34) then
+ return "Classical Horn 10 Loop"
+ elseif (index == 35) then
+ return "Classical Horn 8"
+ elseif (index == 36) then
+ return "Classical Horn 9"
+ elseif (index == 37) then
+ return "Classical Horn 10"
+ elseif (index == 38) then
+ return "Funeral Loop"
+ elseif (index == 39) then
+ return "Funeral"
+ elseif (index == 40) then
+ return "Spooky Loop"
+ elseif (index == 41) then
+ return "Spooky"
+ elseif (index == 42) then
+ return "San Andreas Loop"
+ elseif (index == 43) then
+ return "San Andreas"
+ elseif (index == 44) then
+ return "Liberty City Loop"
+ elseif (index == 45) then
+ return "Liberty City"
+ elseif (index == 46) then
+ return "Festive 1 Loop"
+ elseif (index == 47) then
+ return "Festive 1"
+ elseif (index == 48) then
+ return "Festive 2 Loop"
+ elseif (index == 49) then
+ return "Festive 2"
+ elseif (index == 50) then
+ return "Festive 3 Loop"
+ elseif (index == 51) then
+ return "Festive 3"
+ else
+ return "Unknown Horn"
+ end
+end
+
+function GetNeons()
+ local neons = {
+ {label = _U('white'), r = 255, g = 255, b = 255},
+ {label = "Slate Gray", r = 112, g = 128, b = 144},
+ {label = "Blue", r = 0, g = 0, b = 255},
+ {label = "Light Blue", r = 0, g = 150, b = 255},
+ {label = "Navy Blue", r = 0, g = 0, b = 128},
+ {label = "Sky Blue", r = 135, g = 206, b = 235},
+ {label = "Turquoise", r = 0, g = 245, b = 255},
+ {label = "Mint Green", r = 50, g = 255, b = 155},
+ {label = "Lime Green", r = 0, g = 255, b = 0},
+ {label = "Olive", r = 128, g = 128, b = 0},
+ {label = _U('yellow'), r = 255, g = 255, b = 0},
+ {label = _U('gold'), r = 255, g = 215, b = 0},
+ {label = _U('orange'), r = 255, g = 165, b = 0},
+ {label = _U('wheat'), r = 245, g = 222, b = 179},
+ {label = _U('red'), r = 255, g = 0, b = 0},
+ {label = _U('pink'), r = 255, g = 161, b = 211},
+ {label = _U('brightpink'), r = 255, g = 0, b = 255},
+ {label = _U('purple'), r = 153, g = 0, b = 153},
+ {label = "Ivory", r = 41, g = 36, b = 33}
+ }
+
+ return neons
+end
+
+function GetPlatesName(index)
+ if (index == 0) then
+ return _U('blue_on_white_1')
+ elseif (index == 1) then
+ return _U('yellow_on_black')
+ elseif (index == 2) then
+ return _U('yellow_blue')
+ elseif (index == 3) then
+ return _U('blue_on_white_2')
+ elseif (index == 4) then
+ return _U('blue_on_white_3')
+ end
+end
+
+Config.Menus = {
+ main = {
+ label = 'LS CUSTOMS',
+ parent = nil,
+ upgrades = _U('upgrades'),
+ cosmetics = _U('cosmetics')
+ },
+ upgrades = {
+ label = _U('upgrades'),
+ parent = 'main',
+ modEngine = _U('engine'),
+ modBrakes = _U('brakes'),
+ modTransmission = _U('transmission'),
+ modSuspension = _U('suspension'),
+ modArmor = _U('armor'),
+ modTurbo = _U('turbo')
+ },
+ modEngine = {
+ label = _U('engine'),
+ parent = 'upgrades',
+ modType = 11,
+ price = {13.95, 32.56, 65.12, 139.53}
+ },
+ modBrakes = {
+ label = _U('brakes'),
+ parent = 'upgrades',
+ modType = 12,
+ price = {4.65, 9.3, 18.6, 13.95}
+ },
+ modTransmission = {
+ label = _U('transmission'),
+ parent = 'upgrades',
+ modType = 13,
+ price = {13.95, 20.93, 46.51}
+ },
+ modSuspension = {
+ label = _U('suspension'),
+ parent = 'upgrades',
+ modType = 15,
+ price = {3.72, 7.44, 14.88, 29.77, 40.2}
+ },
+ modArmor = {
+ label = _U('armor'),
+ parent = 'upgrades',
+ modType = 16,
+ price = {69.77, 116.28, 130.00, 150.00, 180.00, 190.00}
+ },
+ modTurbo = {
+ label = _U('turbo'),
+ parent = 'upgrades',
+ modType = 17,
+ price = {55.81}
+ },
+ cosmetics = {
+ label = _U('cosmetics'),
+ parent = 'main',
+ bodyparts = _U('bodyparts'),
+ windowTint = _U('windowtint'),
+ modHorns = _U('horns'),
+ neonColor = _U('neons'),
+ resprays = _U('respray'),
+ modXenon = _U('headlights'),
+ plateIndex = _U('licenseplates'),
+ wheels = _U('wheels'),
+ modPlateHolder = _U('modplateholder'),
+ modVanityPlate = _U('modvanityplate'),
+ modTrimA = _U('interior'),
+ modOrnaments = _U('trim'),
+ modDashboard = _U('dashboard'),
+ modDial = _U('speedometer'),
+ modDoorSpeaker = _U('door_speakers'),
+ modSeats = _U('seats'),
+ modSteeringWheel = _U('steering_wheel'),
+ modShifterLeavers = _U('gear_lever'),
+ modAPlate = _U('quarter_deck'),
+ modSpeakers = _U('speakers'),
+ modTrunk = _U('trunk'),
+ modHydrolic = _U('hydraulic'),
+ modEngineBlock = _U('engine_block'),
+ modAirFilter = _U('air_filter'),
+ modStruts = _U('struts'),
+ modArchCover = _U('arch_cover'),
+ modAerials = _U('aerials'),
+ modTrimB = _U('wings'),
+ modTank = _U('fuel_tank'),
+ modWindows = _U('windows'),
+ modLivery = _U('stickers')
+ },
+
+ modPlateHolder = {
+ label = _U('modplateholder'),
+ parent = 'cosmetics',
+ modType = 25,
+ price = 3.49
+ },
+ modVanityPlate = {
+ label = _U('modvanityplate'),
+ parent = 'cosmetics',
+ modType = 26,
+ price = 1.1
+ },
+ modTrimA = {
+ label = _U('interior'),
+ parent = 'cosmetics',
+ modType = 27,
+ price = 6.98
+ },
+ modOrnaments = {
+ label = _U('trim'),
+ parent = 'cosmetics',
+ modType = 28,
+ price = 0.9
+ },
+ modDashboard = {
+ label = _U('dashboard'),
+ parent = 'cosmetics',
+ modType = 29,
+ price = 4.65
+ },
+ modDial = {
+ label = _U('speedometer'),
+ parent = 'cosmetics',
+ modType = 30,
+ price = 4.19
+ },
+ modDoorSpeaker = {
+ label = _U('door_speakers'),
+ parent = 'cosmetics',
+ modType = 31,
+ price = 5.58
+ },
+ modSeats = {
+ label = _U('seats'),
+ parent = 'cosmetics',
+ modType = 32,
+ price = 4.65
+ },
+ modSteeringWheel = {
+ label = _U('steering_wheel'),
+ parent = 'cosmetics',
+ modType = 33,
+ price = 4.19
+ },
+ modShifterLeavers = {
+ label = _U('gear_lever'),
+ parent = 'cosmetics',
+ modType = 34,
+ price = 3.26
+ },
+ modAPlate = {
+ label = _U('quarter_deck'),
+ parent = 'cosmetics',
+ modType = 35,
+ price = 4.19
+ },
+ modSpeakers = {
+ label = _U('speakers'),
+ parent = 'cosmetics',
+ modType = 36,
+ price = 6.98
+ },
+ modTrunk = {
+ label = _U('trunk'),
+ parent = 'cosmetics',
+ modType = 37,
+ price = 5.58
+ },
+ modHydrolic = {
+ label = _U('hydraulic'),
+ parent = 'cosmetics',
+ modType = 38,
+ price = 5.12
+ },
+ modEngineBlock = {
+ label = _U('engine_block'),
+ parent = 'cosmetics',
+ modType = 39,
+ price = 5.12
+ },
+ modAirFilter = {
+ label = _U('air_filter'),
+ parent = 'cosmetics',
+ modType = 40,
+ price = 3.72
+ },
+ modStruts = {
+ label = _U('struts'),
+ parent = 'cosmetics',
+ modType = 41,
+ price = 6.51
+ },
+ modArchCover = {
+ label = _U('arch_cover'),
+ parent = 'cosmetics',
+ modType = 42,
+ price = 4.19
+ },
+ modAerials = {
+ label = _U('aerials'),
+ parent = 'cosmetics',
+ modType = 43,
+ price = 1.12
+ },
+ modTrimB = {
+ label = _U('wings'),
+ parent = 'cosmetics',
+ modType = 44,
+ price = 6.05
+ },
+ modTank = {
+ label = _U('fuel_tank'),
+ parent = 'cosmetics',
+ modType = 45,
+ price = 4.19
+ },
+ modWindows = {
+ label = _U('windows'),
+ parent = 'cosmetics',
+ modType = 46,
+ price = 4.19
+ },
+ modLivery = {
+ label = _U('stickers'),
+ parent = 'cosmetics',
+ modType = 48,
+ price = 9.3
+ },
+
+ wheels = {
+ label = _U('wheels'),
+ parent = 'cosmetics',
+ modFrontWheelsTypes = _U('wheel_type'),
+ modFrontWheelsColor = _U('wheel_color'),
+ tyreSmokeColor = _U('tiresmoke')
+ },
+ modFrontWheelsTypes = {
+ label = _U('wheel_type'),
+ parent = 'wheels',
+ modFrontWheelsType0 = _U('sport'),
+ modFrontWheelsType1 = _U('muscle'),
+ modFrontWheelsType2 = _U('lowrider'),
+ modFrontWheelsType3 = _U('suv'),
+ modFrontWheelsType4 = _U('allterrain'),
+ modFrontWheelsType5 = _U('tuning'),
+ modFrontWheelsType6 = _U('motorcycle'),
+ modFrontWheelsType7 = _U('highend')
+ },
+ modFrontWheelsType0 = {
+ label = _U('sport'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 0,
+ price = 4.65
+ },
+ modFrontWheelsType1 = {
+ label = _U('muscle'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 1,
+ price = 4.19
+ },
+ modFrontWheelsType2 = {
+ label = _U('lowrider'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 2,
+ price = 4.65
+ },
+ modFrontWheelsType3 = {
+ label = _U('suv'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 3,
+ price = 4.19
+ },
+ modFrontWheelsType4 = {
+ label = _U('allterrain'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 4,
+ price = 4.19
+ },
+ modFrontWheelsType5 = {
+ label = _U('tuning'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 5,
+ price = 5.12
+ },
+ modFrontWheelsType6 = {
+ label = _U('motorcycle'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 6,
+ price = 3.26
+ },
+ modFrontWheelsType7 = {
+ label = _U('highend'),
+ parent = 'modFrontWheelsTypes',
+ modType = 23,
+ wheelType = 7,
+ price = 5.12
+ },
+ modFrontWheelsColor = {
+ label = _U('wheel_color'),
+ parent = 'wheels'
+ },
+ wheelColor = {
+ label = _U('wheel_color'),
+ parent = 'modFrontWheelsColor',
+ modType = 'wheelColor',
+ price = 0.66
+ },
+ plateIndex = {
+ label = _U('licenseplates'),
+ parent = 'cosmetics',
+ modType = 'plateIndex',
+ price = 1.1
+ },
+ resprays = {
+ label = _U('respray'),
+ parent = 'cosmetics',
+ primaryRespray = _U('primary'),
+ secondaryRespray = _U('secondary'),
+ pearlescentRespray = _U('pearlescent'),
+ },
+ primaryRespray = {
+ label = _U('primary'),
+ parent = 'resprays',
+ },
+ secondaryRespray = {
+ label = _U('secondary'),
+ parent = 'resprays',
+ },
+ pearlescentRespray = {
+ label = _U('pearlescent'),
+ parent = 'resprays',
+ },
+ color1 = {
+ label = _U('primary'),
+ parent = 'primaryRespray',
+ modType = 'color1',
+ price = 1.12
+ },
+ color2 = {
+ label = _U('secondary'),
+ parent = 'secondaryRespray',
+ modType = 'color2',
+ price = 0.66
+ },
+ pearlescentColor = {
+ label = _U('pearlescent'),
+ parent = 'pearlescentRespray',
+ modType = 'pearlescentColor',
+ price = 0.88
+ },
+ modXenon = {
+ label = _U('headlights'),
+ parent = 'cosmetics',
+ modType = 22,
+ price = 3.72
+ },
+ bodyparts = {
+ label = _U('bodyparts'),
+ parent = 'cosmetics',
+ modFender = _U('leftfender'),
+ modRightFender = _U('rightfender'),
+ modSpoilers = _U('spoilers'),
+ modSideSkirt = _U('sideskirt'),
+ modFrame = _U('cage'),
+ modHood = _U('hood'),
+ modGrille = _U('grille'),
+ modRearBumper = _U('rearbumper'),
+ modFrontBumper = _U('frontbumper'),
+ modExhaust = _U('exhaust'),
+ modRoof = _U('roof')
+ },
+ modSpoilers = {
+ label = _U('spoilers'),
+ parent = 'bodyparts',
+ modType = 0,
+ price = 4.65
+ },
+ modFrontBumper = {
+ label = _U('frontbumper'),
+ parent = 'bodyparts',
+ modType = 1,
+ price = 5.12
+ },
+ modRearBumper = {
+ label = _U('rearbumper'),
+ parent = 'bodyparts',
+ modType = 2,
+ price = 5.12
+ },
+ modSideSkirt = {
+ label = _U('sideskirt'),
+ parent = 'bodyparts',
+ modType = 3,
+ price = 4.65
+ },
+ modExhaust = {
+ label = _U('exhaust'),
+ parent = 'bodyparts',
+ modType = 4,
+ price = 5.12
+ },
+ modFrame = {
+ label = _U('cage'),
+ parent = 'bodyparts',
+ modType = 5,
+ price = 5.12
+ },
+ modGrille = {
+ label = _U('grille'),
+ parent = 'bodyparts',
+ modType = 6,
+ price = 3.72
+ },
+ modHood = {
+ label = _U('hood'),
+ parent = 'bodyparts',
+ modType = 7,
+ price = 4.88
+ },
+ modFender = {
+ label = _U('leftfender'),
+ parent = 'bodyparts',
+ modType = 8,
+ price = 5.12
+ },
+ modRightFender = {
+ label = _U('rightfender'),
+ parent = 'bodyparts',
+ modType = 9,
+ price = 5.12
+ },
+ modRoof = {
+ label = _U('roof'),
+ parent = 'bodyparts',
+ modType = 10,
+ price = 5.58
+ },
+ windowTint = {
+ label = _U('windowtint'),
+ parent = 'cosmetics',
+ modType = 'windowTint',
+ price = 1.12
+ },
+ modHorns = {
+ label = _U('horns'),
+ parent = 'cosmetics',
+ modType = 14,
+ price = 1.12
+ },
+ neonColor = {
+ label = _U('neons'),
+ parent = 'cosmetics',
+ modType = 'neonColor',
+ price = 1.12
+ },
+ tyreSmokeColor = {
+ label = _U('tiresmoke'),
+ parent = 'wheels',
+ modType = 'tyreSmokeColor',
+ price = 1.12
+ }
+
+}
+>>>>>>> esx_lscustom/master
diff --git a/_resources/esx_lscustom/fxmanifest.lua b/_resources/esx_lscustom/fxmanifest.lua
new file mode 100644
index 00000000..4eece947
--- /dev/null
+++ b/_resources/esx_lscustom/fxmanifest.lua
@@ -0,0 +1,66 @@
+fx_version 'adamant'
+
+game 'gta5'
+
+<<<<<<< HEAD
+description 'ESX Identity'
+
+version '1.4.0'
+
+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',
+=======
+description 'ESX LS Customs'
+
+version '2.1.0'
+
+server_scripts {
+ '@mysql-async/lib/MySQL.lua',
+ '@es_extended/locale.lua',
+ 'locales/en.lua',
+ 'locales/fr.lua',
+ 'locales/pl.lua',
+ 'locales/br.lua',
+ 'locales/de.lua',
+>>>>>>> esx_lscustom/master
+ 'config.lua',
+ 'server/main.lua'
+}
+
+client_scripts {
+ '@es_extended/locale.lua',
+ 'locales/en.lua',
+<<<<<<< HEAD
+ 'locales/es.lua',
+ 'locales/cs.lua',
+ 'locales/pl.lua',
+ 'locales/fi.lua',
+ 'config.lua',
+ 'client/main.lua'
+}
+
+ui_page 'html/index.html'
+
+files {
+ 'html/index.html',
+ 'html/js/script.js',
+ 'html/css/style.css',
+ 'html/img/esx_identity.png'
+}
+
+dependency 'es_extended'
+=======
+ 'locales/fr.lua',
+ 'locales/pl.lua',
+ 'locales/br.lua',
+ 'locales/de.lua',
+ 'config.lua',
+ 'client/main.lua'
+}
+>>>>>>> esx_lscustom/master
diff --git a/_resources/esx_lscustom/locales/br.lua b/_resources/esx_lscustom/locales/br.lua
new file mode 100644
index 00000000..84c286ba
--- /dev/null
+++ b/_resources/esx_lscustom/locales/br.lua
@@ -0,0 +1,269 @@
+Locales['br'] = {
+ ['by_default'] = 'default',
+ ['installed'] = 'instalado',
+ ['already_own'] = 'já possuis: ~b~%s~s~',
+ ['not_enough_money'] = 'sem dinheiro!',
+ ['purchased'] = 'tu compraste esta peça!',
+ ['press_custom'] = 'pressiona ~INPUT_PICKUP~ para personalizar o veiculo.',
+ ['level'] = 'level %s',
+ ['neon'] = 'neon',
+ ['blip_name'] = 'los Santos Customs',
+-- Paint Colors
+ -- Black
+ ['black'] = 'preto',
+ ['graphite'] = 'preto grafit',
+ ['black_metallic'] = 'preto metalico',
+ ['caststeel'] = 'aço fundido',
+ ['black_anth'] = 'antracite Preto',
+ ['matteblack'] = 'preto fosco',
+ ['darknight'] = 'noite escura',
+ ['deepblack'] = 'preto profundo',
+ ['oil'] = 'preto oleo',
+ ['carbon'] = 'preto carbono',
+ -- White
+ ['white'] = 'branco',
+ ['vanilla'] = 'baunilha',
+ ['creme'] = 'creme',
+ ['polarwhite'] = 'branco polar',
+ ['beige'] = 'bege',
+ ['mattewhite'] = 'branco fosco',
+ ['snow'] = 'branco neve',
+ ['cotton'] = 'branco algodao',
+ ['alabaster'] = 'branco alabastro',
+ ['purewhite'] = 'branco puro',
+ -- Grey
+ ['grey'] = 'cinzento',
+ ['silver'] = 'prata',
+ ['metallicgrey'] = 'cinza metalizado',
+ ['laminatedsteel'] = 'aço laminado',
+ ['darkgray'] = 'cinza escuro',
+ ['rockygray'] = 'cinza rochoso',
+ ['graynight'] = 'noite cinzenta',
+ ['aluminum'] = 'alumínio',
+ ['graymat'] = 'cinza fosco',
+ ['lightgrey'] = 'cinza claro',
+ ['asphaltgray'] = 'asfalto Cinza',
+ ['grayconcrete'] = 'cinza concreto',
+ ['darksilver'] = 'prata escura',
+ ['magnesite'] = 'magnesita',
+ ['nickel'] = 'níquel',
+ ['zinc'] = 'zinco',
+ ['dolomite'] = 'dolomite',
+ ['bluesilver'] = 'prata azul',
+ ['titanium'] = 'titânio',
+ ['steelblue'] = 'aço azul',
+ ['champagne'] = 'champanhe',
+ ['grayhunter'] = 'caçador cinzento',
+ -- Red
+ ['red'] = 'vermelho',
+ ['torino_red'] = 'vermelho torino',
+ ['poppy'] = 'vermelho papoila',
+ ['copper_red'] = 'vermelho cobre',
+ ['cardinal'] = 'vermelho cardeal',
+ ['brick'] = 'vermelho tijolo',
+ ['garnet'] = 'vermelho granada',
+ ['cabernet'] = 'vermelho cabernet',
+ ['candy'] = 'vermelho doce',
+ ['matte_red'] = 'vermelho fosco',
+ ['dark_red'] = 'vermelho escuro',
+ ['red_pulp'] = 'polpa vermelha',
+ ['bril_red'] = 'vermelho brilhante',
+ ['pale_red'] = 'vermelho pálido',
+ ['wine_red'] = 'vermelho vinho',
+ ['volcano'] = 'vermelho vulcão',
+ -- Pink
+ ['pink'] = 'rosa',
+ ['electricpink'] = 'rosa elétrica',
+ ['brightpink'] = 'rosa brilhante',
+ ['salmon'] = 'rosa salmão',
+ ['sugarplum'] = 'ameixa doce',
+ -- Blue
+ ['blue'] = 'azul',
+ ['topaz'] = 'azul topázio',
+ ['light_blue'] = 'azul claro',
+ ['galaxy_blue'] = 'azul galáxia',
+ ['dark_blue'] = 'azul escuro',
+ ['azure'] = 'azure',
+ ['navy_blue'] = 'azul marinho',
+ ['lapis'] = 'lápis lazúli',
+ ['blue_diamond'] = 'azul diamante',
+ ['surfer'] = 'azul surfista',
+ ['pastel_blue'] = 'azul pastel',
+ ['celeste_blue'] = 'azul celeste',
+ ['rally_blue'] = 'azul rally',
+ ['blue_paradise'] = 'azul paraíso',
+ ['blue_night'] = 'azul noite',
+ ['cyan_blue'] = 'azul ciano',
+ ['cobalt'] = 'azul cobalto',
+ ['electric_blue'] = 'azul elétrico',
+ ['horizon_blue'] = 'azul horizonte',
+ ['metallic_blue'] = 'azul metálico',
+ ['aquamarine'] = 'azul aquamarino',
+ ['blue_agathe'] = 'azul ágata',
+ ['zirconium'] = 'azul zircônio',
+ ['spinel'] = 'azul espinel',
+ ['tourmaline'] = 'azul turmalina',
+ ['paradise'] = 'azul paraíso',
+ ['bubble_gum'] = 'azul pastilha',
+ ['midnight_blue'] = 'azul meia-noite',
+ ['forbidden_blue'] = 'azul proibido',
+ ['glacier_blue'] = 'azul glaciar',
+ -- Yellow
+ ['yellow'] = 'amarelo',
+ ['wheat'] = 'amarelo trigo',
+ ['raceyellow'] = 'amarelo corrida',
+ ['paleyellow'] = 'amarelo pálido',
+ ['lightyellow'] = 'amarelo claro',
+ -- Green
+ ['green'] = 'verde',
+ ['met_dark_green'] = 'verde escuro metálico',
+ ['rally_green'] = 'verde rally',
+ ['pine_green'] = 'verde pinho',
+ ['olive_green'] = 'verde oliva',
+ ['light_green'] = 'verde claro',
+ ['lime_green'] = 'verde lima',
+ ['forest_green'] = 'verde floresta',
+ ['lawn_green'] = 'verde relva',
+ ['imperial_green'] = 'verde imperial',
+ ['green_bottle'] = 'verde garrafa',
+ ['citrus_green'] = 'verde cítrico',
+ ['green_anis'] = 'verde anis',
+ ['khaki'] = 'verde Khaki',
+ ['army_green'] = 'verde tropa',
+ ['dark_green'] = 'verde escuro',
+ ['hunter_green'] = 'verde caça',
+ ['matte_foilage_green'] = 'verde fosco',
+ -- Orange
+ ['orange'] = 'laranja',
+ ['tangerine'] = 'laranja tangerina',
+ ['matteorange'] = 'laranja fosco',
+ ['lightorange'] = 'laranja claro',
+ ['peach'] = 'laranja pessego',
+ ['pumpkin'] = 'laranja abóbora',
+ ['orangelambo'] = 'laranja lambo',
+ -- Brown
+ ['brown'] = 'castanho',
+ ['copper'] = 'castanho cobre',
+ ['lightbrown'] = 'castanho claro',
+ ['darkbrown'] = 'castanho escuro',
+ ['Bronze'] = 'bronze',
+ ['brownmetallic'] = 'castanho metálico',
+ ['expresso'] = 'castanho expresso',
+ ['chocolate'] = 'castanho chocolate',
+ ['terracotta'] = 'castanho Terracota',
+ ['marble'] = 'castanho mármore',
+ ['sand'] = 'castanho areia',
+ ['sepia'] = 'castanho sepia',
+ ['bison'] = 'castanho Bisonte',
+ ['palm'] = 'castanho palma',
+ ['caramel'] = 'castanho caramelo',
+ ['rust'] = 'castanho ferrugem',
+ ['chestnut'] = 'castanho fruto-seco',
+ ['hazelnut'] = 'castanho avelã',
+ ['shell'] = 'castanho concha',
+ ['mahogany'] = 'castanho mogno',
+ ['cauldron'] = 'castanho caldeirão',
+ ['blond'] = 'castanho loiro',
+ ['gravel'] = 'castanho gravilha',
+ ['darkearth'] = 'castanho escuro',
+ ['desert'] = 'castanho deserto',
+ -- Purple
+ ['purple'] = 'roxo',
+ ['indigo'] = 'roxo indigo',
+ ['deeppurple'] = 'roxo profundo',
+ ['darkviolet'] = 'violeta negro',
+ ['amethyst'] = 'roxo ametista',
+ ['mysticalviolet'] = 'violeta mística',
+ ['purplemetallic'] = 'roxo metálico',
+ ['matteviolet'] = 'violeta fosco',
+ ['mattedeeppurple'] = 'roxo fosco',
+ -- Chrome
+ ['chrome'] = 'cromado',
+ ['brushedchrome'] = 'cromado escovado',
+ ['blackchrome'] = 'cromado Preto',
+ ['brushedaluminum'] = 'alumínio escovado',
+ -- Metal
+ ['gold'] = 'ouro',
+ ['puregold'] = 'ouro puro',
+ ['brushedgold'] = 'ouro escovado',
+ ['lightgold'] = 'ouro brilhante',
+-- License Plates
+ ['blue_on_white_1'] = 'azul e cinza 1',
+ ['yellow_on_black'] = 'amarelo e Preto',
+ ['yellow_blue'] = 'amarelo e azul',
+ ['blue_on_white_2'] = 'azul e cinza 2',
+ ['blue_on_white_3'] = 'azul no cinza 3',
+-- Upgrades
+ ['upgrades'] = 'upgrades',
+ ['engine'] = 'motor',
+ ['brakes'] = 'travões',
+ ['transmission'] = 'transmissão',
+ ['suspension'] = 'suspensão',
+ ['armor'] = 'armadura',
+ ['turbo'] = 'turbo',
+ ['no_turbo'] = 'sem turbo',
+-- Cosmetics
+ ['cosmetics'] = 'cosméticos',
+ -- Body Parts
+ ['bodyparts'] = 'chaparia',
+ ['leftfender'] = 'para-choque esquerdo',
+ ['rightfender'] = 'para-choque direito',
+ ['spoilers'] = 'alarão',
+ ['sideskirt'] = 'saias laterais',
+ ['cage'] = 'santantônio',
+ ['hood'] = 'capô',
+ ['grille'] = 'grade',
+ ['rearbumper'] = 'para-choque traseiro',
+ ['frontbumper'] = 'para-choque dianteiro',
+ ['exhaust'] = 'escape',
+ ['roof'] = 'teto',
+ -- Paint
+ ['respray'] = 'pintura',
+ ['primary'] = 'primário',
+ ['secondary'] = 'secundário',
+ ['pearlescent'] = 'perolado',
+ -- Misc
+ ['headlights'] = 'faróis dianteiros',
+ ['licenseplates'] = 'matricula',
+ ['windowtint'] = 'pelicula de vidro',
+ ['horns'] = 'buzinas',
+ -- Neon
+ ['neons'] = 'neons',
+ -- Wheels
+ ['wheels'] = 'rodas',
+ ['tiresmoke'] = 'fumaça de pneu',
+ ['wheel_type'] = 'tipo de roda',
+ ['wheel_color'] = 'cor de roda',
+ ['sport'] = 'desportivo',
+ ['muscle'] = 'muscle',
+ ['lowrider'] = 'lowrider',
+ ['suv'] = 'suv',
+ ['allterrain'] = 'todo terreno',
+ ['tuning'] = 'tuning',
+ ['motorcycle'] = 'motociclo',
+ ['highend'] = 'high end',
+
+ ['modplateholder'] = 'placa - atrás',
+ ['modvanityplate'] = 'placa - frente',
+ ['interior'] = 'interior',
+ ['trim'] = 'trim',
+ ['dashboard'] = 'painel',
+ ['speedometer'] = 'velocímetro',
+ ['door_speakers'] = 'colunas da porta',
+ ['seats'] = 'bancos',
+ ['steering_wheel'] = 'volante',
+ ['gear_lever'] = 'manete de veloçidades',
+ ['quarter_deck'] = 'quarter-deck',
+ ['speakers'] = 'colunas',
+ ['trunk'] = 'bagagem',
+ ['hydraulic'] = 'hidráulico',
+ ['engine_block'] = 'bloco do motor',
+ ['air_filter'] = 'filtro de ar',
+ ['struts'] = 'suportes do motor',
+ ['arch_cover'] = 'cobertura de arco',
+ ['aerials'] = 'antenas',
+ ['wings'] = 'wings',
+ ['fuel_tank'] = 'tanque de combustível',
+ ['windows'] = 'janelas',
+ ['stickers'] = 'autocolantes',
+}
diff --git a/_resources/esx_lscustom/locales/de.lua b/_resources/esx_lscustom/locales/de.lua
new file mode 100644
index 00000000..889a98f9
--- /dev/null
+++ b/_resources/esx_lscustom/locales/de.lua
@@ -0,0 +1,269 @@
+Locales['de'] = {
+ ['by_default'] = 'Standard',
+ ['installed'] = 'installed',
+ ['already_own'] = 'Sie besitzen bereits: %s',
+ ['not_enough_money'] = 'du kannst dir diese mod nicht leisten',
+ ['purchased'] = 'Du hast diese Mod gekauft!',
+ ['press_custom'] = 'Drücke ~INPUT_PICKUP~ um dein Fahrzeug auf zu Tunen',
+ ['level'] = 'level %s',
+ ['neon'] = 'Neon',
+ ['blip_name'] = 'Tuning',
+-- Paint Colors
+ -- Black
+ ['black'] = 'black',
+ ['graphite'] = 'graphite',
+ ['black_metallic'] = 'black Metallic',
+ ['caststeel'] = 'cast Steel',
+ ['black_anth'] = 'black Anthracite',
+ ['matteblack'] = 'matte Black',
+ ['darknight'] = 'dark Night',
+ ['deepblack'] = 'deep Black',
+ ['oil'] = 'oil',
+ ['carbon'] = 'carbon',
+ -- White
+ ['white'] = 'white',
+ ['vanilla'] = 'vanilla',
+ ['creme'] = 'creme',
+ ['polarwhite'] = 'polar White',
+ ['beige'] = 'beige',
+ ['mattewhite'] = 'matte White',
+ ['snow'] = 'snow',
+ ['cotton'] = 'cotton',
+ ['alabaster'] = 'alabaster',
+ ['purewhite'] = 'pure White',
+ -- Grey
+ ['grey'] = 'grey',
+ ['silver'] = 'silver',
+ ['metallicgrey'] = 'metallic Grey',
+ ['laminatedsteel'] = 'laminated Steel',
+ ['darkgray'] = 'dark Grey',
+ ['rockygray'] = 'rocky Grey',
+ ['graynight'] = 'gray Night',
+ ['aluminum'] = 'aluminum',
+ ['graymat'] = 'matte Grey',
+ ['lightgrey'] = 'light Grey',
+ ['asphaltgray'] = 'asphalt Grey',
+ ['grayconcrete'] = 'concrete Grey',
+ ['darksilver'] = 'dark Silver',
+ ['magnesite'] = 'magnesite',
+ ['nickel'] = 'nickel',
+ ['zinc'] = 'zinc',
+ ['dolomite'] = 'dolomite',
+ ['bluesilver'] = 'blue Silver',
+ ['titanium'] = 'titanium',
+ ['steelblue'] = 'steel Blue',
+ ['champagne'] = 'champagne',
+ ['grayhunter'] = 'grey Hunter',
+ -- Red
+ ['red'] = 'red',
+ ['torino_red'] = 'torino Red',
+ ['poppy'] = 'poppy',
+ ['copper_red'] = 'copper Red',
+ ['cardinal'] = 'cardinal Red',
+ ['brick'] = 'brick Red',
+ ['garnet'] = 'Garnet',
+ ['cabernet'] = 'cabernet Red',
+ ['candy'] = 'candy Red',
+ ['matte_red'] = 'matte Red',
+ ['dark_red'] = 'dark Red',
+ ['red_pulp'] = 'red Pulp',
+ ['bril_red'] = 'brilliant Red',
+ ['pale_red'] = 'pale Red',
+ ['wine_red'] = 'wine Red',
+ ['volcano'] = 'Volcano',
+ -- Pink
+ ['pink'] = 'pink',
+ ['electricpink'] = 'electric Pink',
+ ['brightpink'] = 'bright Pink',
+ ['salmon'] = 'salmon',
+ ['sugarplum'] = 'sugar Plum',
+ -- Blue
+ ['blue'] = 'blue',
+ ['topaz'] = 'topaz',
+ ['light_blue'] = 'light Blue',
+ ['galaxy_blue'] = 'galaxy Blue',
+ ['dark_blue'] = 'dark Blue',
+ ['azure'] = 'azure',
+ ['navy_blue'] = 'navy Blue',
+ ['lapis'] = 'lapis Lazuli',
+ ['blue_diamond'] = 'blue Diamond',
+ ['surfer'] = 'surfer',
+ ['pastel_blue'] = 'pastel Blue',
+ ['celeste_blue'] = 'celeste Blue',
+ ['rally_blue'] = 'rally Blue',
+ ['blue_paradise'] = 'blue Paradise',
+ ['blue_night'] = 'blue Night',
+ ['cyan_blue'] = 'cyan Blue',
+ ['cobalt'] = 'cobalt',
+ ['electric_blue'] = 'electric Blue',
+ ['horizon_blue'] = 'horizon Blue',
+ ['metallic_blue'] = 'metallic Blue',
+ ['aquamarine'] = 'aquamarine',
+ ['blue_agathe'] = 'blue Agathe',
+ ['zirconium'] = 'zirconium',
+ ['spinel'] = 'spinel',
+ ['tourmaline'] = 'tourmaline',
+ ['paradise'] = 'paradise',
+ ['bubble_gum'] = 'bubble Gum',
+ ['midnight_blue'] = 'midnight Blue',
+ ['forbidden_blue'] = 'forbidden Blue',
+ ['glacier_blue'] = 'glacier Blue',
+ -- Yellow
+ ['yellow'] = 'yellow',
+ ['wheat'] = 'wheat',
+ ['raceyellow'] = 'race Yellow',
+ ['paleyellow'] = 'pale Yellow',
+ ['lightyellow'] = 'light Yellow',
+ -- Green
+ ['green'] = 'green',
+ ['met_dark_green'] = 'metallic Dark Green',
+ ['rally_green'] = 'Rally Green',
+ ['pine_green'] = 'pine Green',
+ ['olive_green'] = 'olive Green',
+ ['light_green'] = 'Light Green',
+ ['lime_green'] = 'lime green',
+ ['forest_green'] = 'forest Green',
+ ['lawn_green'] = 'lawn Green',
+ ['imperial_green'] = 'imperial Green',
+ ['green_bottle'] = 'breen Bottle',
+ ['citrus_green'] = 'citrus Green',
+ ['green_anis'] = 'green Anis',
+ ['khaki'] = 'Khaki',
+ ['army_green'] = 'army Green',
+ ['dark_green'] = 'dark Green',
+ ['hunter_green'] = 'hunter Green',
+ ['matte_foilage_green'] = 'matte Foilage Green',
+ -- Orange
+ ['orange'] = 'orange',
+ ['tangerine'] = 'Tangerine',
+ ['matteorange'] = 'Matte Orange',
+ ['lightorange'] = 'Light Orange',
+ ['peach'] = 'Peach',
+ ['pumpkin'] = 'Pumpkin',
+ ['orangelambo'] = 'Orange Lambo',
+ -- Brown
+ ['brown'] = 'brown',
+ ['copper'] = 'Copper',
+ ['lightbrown'] = 'Light Brown',
+ ['darkbrown'] = 'Dark Brown',
+ ['bronze'] = 'Bronze',
+ ['brownmetallic'] = 'Brown Metallic',
+ ['expresso'] = 'Expresso',
+ ['chocolate'] = 'Chocolate',
+ ['terracotta'] = 'Terracotta',
+ ['marble'] = 'Marble',
+ ['sand'] = 'Sand',
+ ['sepia'] = 'Sepia',
+ ['bison'] = 'Bison',
+ ['palm'] = 'Palm',
+ ['caramel'] = 'Caramel',
+ ['rust'] = 'Rust',
+ ['chestnut'] = 'Chestnut',
+ ['hazelnut'] = 'Hazelnut',
+ ['shell'] = 'Shell',
+ ['mahogany'] = 'Mahogany',
+ ['cauldron'] = 'Cauldron',
+ ['blond'] = 'Blond',
+ ['gravel'] = 'Gravel',
+ ['darkearth'] = 'Dark Earth',
+ ['desert'] = 'Desert',
+ -- Purple
+ ['purple'] = 'purple',
+ ['indigo'] = 'Indigo',
+ ['deeppurple'] = 'Deep Purple',
+ ['darkviolet'] = 'Dark Violet',
+ ['amethyst'] = 'Amethyst',
+ ['mysticalviolet'] = 'Mystic Violet',
+ ['purplemetallic'] = 'Purple Metallic',
+ ['matteviolet'] = 'Matte Violet',
+ ['mattedeeppurple'] = 'Matte Deep Purple',
+ -- Chrome
+ ['chrome'] = 'chrome',
+ ['brushedchrome'] = 'brushed Chrome',
+ ['blackchrome'] = 'black Chrome',
+ ['brushedaluminum'] = 'brushed Aluminum',
+ -- Metal
+ ['gold'] = 'gold',
+ ['puregold'] = 'pure Gold',
+ ['brushedgold'] = 'brushed Gold',
+ ['lightgold'] = 'light Gold',
+-- License Plates
+ ['blue_on_white_1'] = 'blau auf weiß 1',
+ ['yellow_on_black'] = 'gelb auf schwarz',
+ ['yellow_blue'] = 'gelb auf blau',
+ ['blue_on_white_2'] = 'blau auf weiß 2',
+ ['blue_on_white_3'] = 'blau auf weiß 3',
+-- Upgrades
+ ['upgrades'] = 'Upgrades',
+ ['engine'] = 'Motor',
+ ['brakes'] = 'bremsen',
+ ['transmission'] = 'Getriebe',
+ ['suspension'] = 'Suspension',
+ ['armor'] = 'Panzerung',
+ ['turbo'] = 'Turbo',
+ ['no_turbo'] = 'kein Turbo',
+-- Cosmetics
+ ['cosmetics'] = 'Zubehör',
+ -- Body Parts
+ ['bodyparts'] = 'Karroserie Teile',
+ ['leftfender'] = 'linker Kotflügel',
+ ['rightfender'] = 'rechter Kotflügel',
+ ['spoilers'] = 'Spoiler',
+ ['sideskirt'] = 'Seitenschweller',
+ ['cage'] = 'Käfig',
+ ['hood'] = 'Motorhaube',
+ ['grille'] = 'Gitter',
+ ['rearbumper'] = 'hintere Stoßstange',
+ ['frontbumper'] = 'Frontstoßstange',
+ ['exhaust'] = 'Auspuff',
+ ['roof'] = 'Dach',
+ -- Paint
+ ['respray'] = 'Lackierung',
+ ['primary'] = 'Primär',
+ ['secondary'] = 'Sekundär',
+ ['pearlescent'] = 'Perlglanz',
+ -- Misc
+ ['headlights'] = 'Scheinwerfer',
+ ['licenseplates'] = 'Nummernschild',
+ ['windowtint'] = 'Fenstertönung',
+ ['horns'] = 'Hörner',
+ -- Neon
+ ['neons'] = 'neons',
+ -- Wheels
+ ['wheels'] = 'Räder',
+ ['tiresmoke'] = 'Reifenrauch',
+ ['wheel_type'] = 'Rad-Typ',
+ ['wheel_color'] = 'Radfarbe',
+ ['sport'] = 'Sport',
+ ['muscle'] = 'Muskel',
+ ['lowrider'] = 'Lowrider',
+ ['suv'] = 'SUV',
+ ['allterrain'] = 'alles Gelände',
+ ['tuning'] = 'tuning',
+ ['motorcycle'] = 'Motorrad',
+ ['highend'] = 'High End',
+
+ ['modplateholder'] = 'Platte - Zurück',
+ ['modvanityplate'] = 'Platte - Vorne',
+ ['interior'] = 'interior',
+ ['trim'] = 'trim',
+ ['dashboard'] = 'dashboard',
+ ['speedometer'] = 'Tachometer',
+ ['door_speakers'] = 'Türlautsprecher',
+ ['seats'] = 'Sitze',
+ ['steering_wheel'] = 'Lenkrad',
+ ['gear_lever'] = 'Schalthebel',
+ ['quarter_deck'] = 'Achterdeck',
+ ['speakers'] = 'Lautsprecher',
+ ['trunk'] = 'Kofferraum',
+ ['hydraulic'] = 'hydraulisch',
+ ['engine_block'] = 'Motorblock',
+ ['air_filter'] = 'air filter',
+ ['struts'] = 'Streben',
+ ['arch_cover'] = 'Bogenabdeckung',
+ ['aerials'] = 'Antennen',
+ ['wings'] = 'Flügel',
+ ['fuel_tank'] = 'Treibstofftank',
+ ['windows'] = 'Fenster',
+ ['stickers'] = 'Designs',
+}
diff --git a/_resources/esx_lscustom/locales/en.lua b/_resources/esx_lscustom/locales/en.lua
new file mode 100644
index 00000000..5e7c3ddd
--- /dev/null
+++ b/_resources/esx_lscustom/locales/en.lua
@@ -0,0 +1,303 @@
+Locales['en'] = {
+<<<<<<< HEAD
+ ['show_active_character'] = 'Show Active Character',
+ ['active_character'] = 'Active Character: ~b~%s~s~',
+ ['error_active_character'] = "There was an error retrieving your name. Please contact an admin.",
+ ['delete_character'] = 'Delete Your Character And Create A New One',
+ ['deleted_character'] = 'Your character has been deleted.',
+ ['error_delete_character'] = "There was an error deleting your character. Please contact an admin.",
+ ['thank_you_for_registering'] = "Thank you for registering. Have fun.",
+ ['registration_error'] = "There was an error during registration. Please contact an admin.",
+ ['debug_xPlayer_get_first_name'] = "Return Your First Name",
+ ['debug_xPlayer_get_last_name'] = "Return Your Last Name",
+ ['debug_xPlayer_get_full_name'] = "Return Your Full Name",
+ ['debug_xPlayer_get_sex'] = "Return Your Sex",
+ ['debug_xPlayer_get_dob'] = "Return Your DOB",
+ ['debug_xPlayer_get_height'] = "Return Your Height",
+ ['error_debug_xPlayer_get_first_name'] = "There was an error retrieving your first name.",
+ ['error_debug_xPlayer_get_last_name'] = "There was an error retrieving your last name.",
+ ['error_debug_xPlayer_get_full_name'] = "There was an error retrieving your full name.",
+ ['error_debug_xPlayer_get_sex'] = "There was an error retrieving your sex.",
+ ['error_debug_xPlayer_get_dob'] = "There was an error retrieving your date of birth.",
+ ['error_debug_xPlayer_get_height'] = "There was an error retrieving your height.",
+ ['return_debug_xPlayer_get_first_name'] = "First Name: ~b~%s",
+ ['return_debug_xPlayer_get_last_name'] = "Last Name: ~b~%s",
+ ['return_debug_xPlayer_get_full_name'] = "Full Name: ~b~%s",
+ ['return_debug_xPlayer_get_sex'] = "Sex: ~b~%s",
+ ['return_debug_xPlayer_get_dob'] = "DOB: ~b~%s",
+ ['return_debug_xPlayer_get_height'] = "Height: ~b~%s Inches",
+ ['data_incorrect'] = 'Data entered incorrectly. Please try again.',
+ ['invalid_format'] = 'Data formatted incorrectly. Please try again.',
+ ['no_identifier'] = '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.',
+ ['missing_identity'] = 'There was an error loading your character!\nError code: identity-missing\n\nIt seems like your identity is missing, try connecting again.',
+ ['deleted_identity'] = 'Your character has been deleted. Please login again in order to create a new character.'
+=======
+ ['by_default'] = 'default',
+ ['installed'] = 'installed',
+ ['already_own'] = 'you already own: ~b~%s~s~',
+ ['not_enough_money'] = 'you cannot afford this mod!',
+ ['purchased'] = 'you have purchased the mod!',
+ ['press_custom'] = 'press ~INPUT_PICKUP~ to ~y~personalize~s~ your vehicle.',
+ ['level'] = 'level %s',
+ ['neon'] = 'neon',
+ ['blip_name'] = 'los Santos Customs',
+-- Paint Colors
+ -- Black
+ ['black'] = 'black',
+ ['graphite'] = 'graphite',
+ ['black_metallic'] = 'black Metallic',
+ ['caststeel'] = 'cast Steel',
+ ['black_anth'] = 'black Anthracite',
+ ['matteblack'] = 'matte Black',
+ ['darknight'] = 'dark Night',
+ ['deepblack'] = 'deep Black',
+ ['oil'] = 'oil',
+ ['carbon'] = 'carbon',
+ -- White
+ ['white'] = 'white',
+ ['vanilla'] = 'vanilla',
+ ['creme'] = 'creme',
+ ['polarwhite'] = 'polar White',
+ ['beige'] = 'beige',
+ ['mattewhite'] = 'matte White',
+ ['snow'] = 'snow',
+ ['cotton'] = 'cotton',
+ ['alabaster'] = 'alabaster',
+ ['purewhite'] = 'pure White',
+ -- Grey
+ ['grey'] = 'grey',
+ ['silver'] = 'silver',
+ ['metallicgrey'] = 'metallic Grey',
+ ['laminatedsteel'] = 'laminated Steel',
+ ['darkgray'] = 'dark Grey',
+ ['rockygray'] = 'rocky Grey',
+ ['graynight'] = 'gray Night',
+ ['aluminum'] = 'aluminum',
+ ['graymat'] = 'matte Grey',
+ ['lightgrey'] = 'light Grey',
+ ['asphaltgray'] = 'asphalt Grey',
+ ['grayconcrete'] = 'concrete Grey',
+ ['darksilver'] = 'dark Silver',
+ ['magnesite'] = 'magnesite',
+ ['nickel'] = 'nickel',
+ ['zinc'] = 'zinc',
+ ['dolomite'] = 'dolomite',
+ ['bluesilver'] = 'blue Silver',
+ ['titanium'] = 'titanium',
+ ['steelblue'] = 'steel Blue',
+ ['champagne'] = 'champagne',
+ ['grayhunter'] = 'grey Hunter',
+ -- Red
+ ['red'] = 'red',
+ ['torino_red'] = 'torino Red',
+ ['poppy'] = 'poppy',
+ ['copper_red'] = 'copper Red',
+ ['cardinal'] = 'cardinal Red',
+ ['brick'] = 'brick Red',
+ ['garnet'] = 'Garnet',
+ ['cabernet'] = 'cabernet Red',
+ ['candy'] = 'candy Red',
+ ['matte_red'] = 'matte Red',
+ ['dark_red'] = 'dark Red',
+ ['red_pulp'] = 'red Pulp',
+ ['bril_red'] = 'brilliant Red',
+ ['pale_red'] = 'pale Red',
+ ['wine_red'] = 'wine Red',
+ ['volcano'] = 'Volcano',
+ -- Pink
+ ['pink'] = 'pink',
+ ['electricpink'] = 'electric Pink',
+ ['brightpink'] = 'bright Pink',
+ ['salmon'] = 'salmon',
+ ['sugarplum'] = 'sugar Plum',
+ -- Blue
+ ['blue'] = 'blue',
+ ['topaz'] = 'topaz',
+ ['light_blue'] = 'light Blue',
+ ['galaxy_blue'] = 'galaxy Blue',
+ ['dark_blue'] = 'dark Blue',
+ ['azure'] = 'azure',
+ ['navy_blue'] = 'navy Blue',
+ ['lapis'] = 'lapis Lazuli',
+ ['blue_diamond'] = 'blue Diamond',
+ ['surfer'] = 'surfer',
+ ['pastel_blue'] = 'pastel Blue',
+ ['celeste_blue'] = 'celeste Blue',
+ ['rally_blue'] = 'rally Blue',
+ ['blue_paradise'] = 'blue Paradise',
+ ['blue_night'] = 'blue Night',
+ ['cyan_blue'] = 'cyan Blue',
+ ['cobalt'] = 'cobalt',
+ ['electric_blue'] = 'electric Blue',
+ ['horizon_blue'] = 'horizon Blue',
+ ['metallic_blue'] = 'metallic Blue',
+ ['aquamarine'] = 'aquamarine',
+ ['blue_agathe'] = 'blue Agathe',
+ ['zirconium'] = 'zirconium',
+ ['spinel'] = 'spinel',
+ ['tourmaline'] = 'tourmaline',
+ ['paradise'] = 'paradise',
+ ['bubble_gum'] = 'bubble Gum',
+ ['midnight_blue'] = 'midnight Blue',
+ ['forbidden_blue'] = 'forbidden Blue',
+ ['glacier_blue'] = 'glacier Blue',
+ -- Yellow
+ ['yellow'] = 'yellow',
+ ['wheat'] = 'wheat',
+ ['raceyellow'] = 'race Yellow',
+ ['paleyellow'] = 'pale Yellow',
+ ['lightyellow'] = 'light Yellow',
+ -- Green
+ ['green'] = 'green',
+ ['met_dark_green'] = 'metallic Dark Green',
+ ['rally_green'] = 'Rally Green',
+ ['pine_green'] = 'pine Green',
+ ['olive_green'] = 'olive Green',
+ ['light_green'] = 'Light Green',
+ ['lime_green'] = 'lime green',
+ ['forest_green'] = 'forest Green',
+ ['lawn_green'] = 'lawn Green',
+ ['imperial_green'] = 'imperial Green',
+ ['green_bottle'] = 'breen Bottle',
+ ['citrus_green'] = 'citrus Green',
+ ['green_anis'] = 'green Anis',
+ ['khaki'] = 'Khaki',
+ ['army_green'] = 'army Green',
+ ['dark_green'] = 'dark Green',
+ ['hunter_green'] = 'hunter Green',
+ ['matte_foilage_green'] = 'matte Foilage Green',
+ -- Orange
+ ['orange'] = 'orange',
+ ['tangerine'] = 'Tangerine',
+ ['matteorange'] = 'Matte Orange',
+ ['lightorange'] = 'Light Orange',
+ ['peach'] = 'Peach',
+ ['pumpkin'] = 'Pumpkin',
+ ['orangelambo'] = 'Orange Lambo',
+ -- Brown
+ ['brown'] = 'brown',
+ ['copper'] = 'Copper',
+ ['lightbrown'] = 'Light Brown',
+ ['darkbrown'] = 'Dark Brown',
+ ['bronze'] = 'Bronze',
+ ['brownmetallic'] = 'Brown Metallic',
+ ['expresso'] = 'Expresso',
+ ['chocolate'] = 'Chocolate',
+ ['terracotta'] = 'Terracotta',
+ ['marble'] = 'Marble',
+ ['sand'] = 'Sand',
+ ['sepia'] = 'Sepia',
+ ['bison'] = 'Bison',
+ ['palm'] = 'Palm',
+ ['caramel'] = 'Caramel',
+ ['rust'] = 'Rust',
+ ['chestnut'] = 'Chestnut',
+ ['hazelnut'] = 'Hazelnut',
+ ['shell'] = 'Shell',
+ ['mahogany'] = 'Mahogany',
+ ['cauldron'] = 'Cauldron',
+ ['blond'] = 'Blond',
+ ['gravel'] = 'Gravel',
+ ['darkearth'] = 'Dark Earth',
+ ['desert'] = 'Desert',
+ -- Purple
+ ['purple'] = 'purple',
+ ['indigo'] = 'Indigo',
+ ['deeppurple'] = 'Deep Purple',
+ ['darkviolet'] = 'Dark Violet',
+ ['amethyst'] = 'Amethyst',
+ ['mysticalviolet'] = 'Mystic Violet',
+ ['purplemetallic'] = 'Purple Metallic',
+ ['matteviolet'] = 'Matte Violet',
+ ['mattedeeppurple'] = 'Matte Deep Purple',
+ -- Chrome
+ ['chrome'] = 'chrome',
+ ['brushedchrome'] = 'brushed Chrome',
+ ['blackchrome'] = 'black Chrome',
+ ['brushedaluminum'] = 'brushed Aluminum',
+ -- Metal
+ ['gold'] = 'gold',
+ ['puregold'] = 'pure Gold',
+ ['brushedgold'] = 'brushed Gold',
+ ['lightgold'] = 'light Gold',
+-- License Plates
+ ['blue_on_white_1'] = 'blue on white 1',
+ ['yellow_on_black'] = 'yellow on black',
+ ['yellow_blue'] = 'yellow on blue',
+ ['blue_on_white_2'] = 'blue on white 2',
+ ['blue_on_white_3'] = 'blue on white 3',
+-- Upgrades
+ ['upgrades'] = 'upgrades',
+ ['engine'] = 'engine',
+ ['brakes'] = 'brakes',
+ ['transmission'] = 'transmission',
+ ['suspension'] = 'suspension',
+ ['armor'] = 'armor',
+ ['turbo'] = 'turbo',
+ ['no_turbo'] = 'no turbo',
+-- Cosmetics
+ ['cosmetics'] = 'cosmetics',
+ -- Body Parts
+ ['bodyparts'] = 'body Parts',
+ ['leftfender'] = 'left fender',
+ ['rightfender'] = 'right fender',
+ ['spoilers'] = 'spoilers',
+ ['sideskirt'] = 'side skirts',
+ ['cage'] = 'cage',
+ ['hood'] = 'hood',
+ ['grille'] = 'grille',
+ ['rearbumper'] = 'rear bumper',
+ ['frontbumper'] = 'front bumper',
+ ['exhaust'] = 'exhaust',
+ ['roof'] = 'roof',
+ -- Paint
+ ['respray'] = 'respray',
+ ['primary'] = 'primary',
+ ['secondary'] = 'secondary',
+ ['pearlescent'] = 'pearlescent',
+ -- Misc
+ ['headlights'] = 'headlights',
+ ['licenseplates'] = 'license Plate',
+ ['windowtint'] = 'window Tint',
+ ['horns'] = 'horns',
+ -- Neon
+ ['neons'] = 'neons',
+ -- Wheels
+ ['wheels'] = 'wheels',
+ ['tiresmoke'] = 'tire smoke',
+ ['wheel_type'] = 'wheel type',
+ ['wheel_color'] = 'wheel color',
+ ['sport'] = 'sport',
+ ['muscle'] = 'muscle',
+ ['lowrider'] = 'lowrider',
+ ['suv'] = 'SUV',
+ ['allterrain'] = 'all terrain',
+ ['tuning'] = 'tuning',
+ ['motorcycle'] = 'motorcycle',
+ ['highend'] = 'high end',
+
+ ['modplateholder'] = 'plate - Back',
+ ['modvanityplate'] = 'plate - Front',
+ ['interior'] = 'interior',
+ ['trim'] = 'trim',
+ ['dashboard'] = 'dashboard',
+ ['speedometer'] = 'speedometer',
+ ['door_speakers'] = 'door speakers',
+ ['seats'] = 'seats',
+ ['steering_wheel'] = 'steering wheel',
+ ['gear_lever'] = 'gear lever',
+ ['quarter_deck'] = 'quarter-deck',
+ ['speakers'] = 'speakers',
+ ['trunk'] = 'trunk',
+ ['hydraulic'] = 'hydraulic',
+ ['engine_block'] = 'engine block',
+ ['air_filter'] = 'air filter',
+ ['struts'] = 'struts',
+ ['arch_cover'] = 'arch cover',
+ ['aerials'] = 'aerials',
+ ['wings'] = 'wings',
+ ['fuel_tank'] = 'fuel tank',
+ ['windows'] = 'windows',
+ ['stickers'] = 'stickers',
+>>>>>>> esx_lscustom/master
+}
diff --git a/_resources/esx_lscustom/locales/fr.lua b/_resources/esx_lscustom/locales/fr.lua
new file mode 100644
index 00000000..e97d789a
--- /dev/null
+++ b/_resources/esx_lscustom/locales/fr.lua
@@ -0,0 +1,269 @@
+Locales['fr'] = {
+ ['by_default'] = 'par défaut',
+ ['installed'] = 'installé',
+ ['already_own'] = 'vous possédez déjà: ~b~%s~s~',
+ ['not_enough_money'] = 'vous n\'avez pas assez d\'argent!',
+ ['purchased'] = 'achat effectué!',
+ ['press_custom'] = 'appuyez sur ~INPUT_PICKUP~ pour personnaliser le véhicule.',
+ ['level'] = 'niveau %s',
+ ['neon'] = 'neon',
+ ['blip_name'] = 'los Santos Customs',
+-- Paint Colors
+ -- Black
+ ['black'] = 'noir',
+ ['graphite'] = 'graphite',
+ ['black_metallic'] = 'noir Méttallisé',
+ ['caststeel'] = 'acier Fondu',
+ ['black_anth'] = 'noir Anthracite',
+ ['matteblack'] = 'noir Mat',
+ ['darknight'] = 'nuit Sombre',
+ ['deepblack'] = 'noir Profond',
+ ['oil'] = 'pétrol',
+ ['carbon'] = 'carbon',
+ -- White
+ ['white'] = 'blanc',
+ ['vanilla'] = 'vanille',
+ ['creme'] = 'crème',
+ ['polarwhite'] = 'blanc Polair',
+ ['beige'] = 'beige',
+ ['mattewhite'] = 'blanc Mat',
+ ['snow'] = 'neige',
+ ['cotton'] = 'coton',
+ ['alabaster'] = 'albâtre',
+ ['purewhite'] = 'blanc Pure',
+ -- Grey
+ ['grey'] = 'gris',
+ ['silver'] = 'Argenté',
+ ['metallicgrey'] = 'Gris Métallisé',
+ ['laminatedsteel'] = 'Acier Laminé',
+ ['darkgray'] = 'Gris Foncé',
+ ['rockygray'] = 'Gris Rocheux',
+ ['graynight'] = 'Gris Nuit',
+ ['aluminum'] = 'Aluminium',
+ ['graymat'] = 'Gris Mat',
+ ['lightgrey'] = 'Gris Clair',
+ ['asphaltgray'] = 'Gris Bitume',
+ ['grayconcrete'] = 'Gris Béton',
+ ['darksilver'] = 'Argent Sombre',
+ ['magnesite'] = 'Magnésite',
+ ['nickel'] = 'nickel',
+ ['zinc'] = 'zinc',
+ ['dolomite'] = 'dolomite',
+ ['bluesilver'] = 'Argent Bleuté',
+ ['titanium'] = 'Titane',
+ ['steelblue'] = 'Acier Bleui',
+ ['champagne'] = 'Champagne',
+ ['grayhunter'] = 'Gris Chasseur',
+ -- Red
+ ['red'] = 'rouge',
+ ['torino_red'] = 'Rouge Turin',
+ ['poppy'] = 'Coquelicot',
+ ['copper_red'] = 'Rouge Cuivré',
+ ['cardinal'] = 'Rouge Cardinal',
+ ['brick'] = 'Rouge Brique',
+ ['garnet'] = 'Grenat',
+ ['cabernet'] = 'Pourpre',
+ ['candy'] = 'Framboise',
+ ['matte_red'] = 'Rouge Mat',
+ ['dark_red'] = 'Rouge Foncé',
+ ['red_pulp'] = 'Rouge Pulpeux',
+ ['bril_red'] = 'Rouge Brillant',
+ ['pale_red'] = 'Rouge Pale',
+ ['wine_red'] = 'Rouge Vin',
+ ['volcano'] = 'Volcano',
+ -- Pink
+ ['pink'] = 'rose',
+ ['electricpink'] = 'rose Electrique',
+ ['brightpink'] = 'rose pétant',
+ ['salmon'] = 'rose Saumon',
+ ['sugarplum'] = 'rose Dragée',
+ -- Blue
+ ['blue'] = 'bleu',
+ ['topaz'] = 'topaze',
+ ['light_blue'] = 'bleu clair',
+ ['galaxy_blue'] = 'bleu galaxy',
+ ['dark_blue'] = 'bleu foncé',
+ ['azure'] = 'bleu azur',
+ ['navy_blue'] = 'bleu marine',
+ ['lapis'] = 'lapis lazuli',
+ ['blue_diamond'] = 'bleu diamant',
+ ['surfer'] = 'surfer',
+ ['pastel_blue'] = 'pastel',
+ ['celeste_blue'] = 'bleu celeste',
+ ['rally_blue'] = 'bleu rally',
+ ['blue_paradise'] = 'bleu paradis',
+ ['blue_night'] = 'bleu nuit',
+ ['cyan_blue'] = 'bleu cyan',
+ ['cobalt'] = 'cobalt',
+ ['electric_blue'] = 'bleu electrique',
+ ['horizon_blue'] = 'bleu horizon',
+ ['metallic_blue'] = 'bleu métallisé',
+ ['aquamarine'] = 'aigue marine',
+ ['blue_agathe'] = 'bleu agathe',
+ ['zirconium'] = 'zirconium',
+ ['spinel'] = 'spinelle',
+ ['tourmaline'] = 'tourmaline',
+ ['paradise'] = 'paradis',
+ ['bubble_gum'] = 'bubble gum',
+ ['midnight_blue'] = 'bleu minuit',
+ ['forbidden_blue'] = 'bleu interdit',
+ ['glacier_blue'] = 'bleu glacier',
+ -- Yellow
+ ['yellow'] = 'jaune',
+ ['wheat'] = 'Jaune Blé',
+ ['raceyellow'] = 'Jaune Rally',
+ ['paleyellow'] = 'Jaune Clair',
+ ['lightyellow'] = 'Jaune Pâle',
+ -- Green
+ ['green'] = 'vert',
+ ['met_dark_green'] = 'Vert Foncé',
+ ['rally_green'] = 'Vert Rally',
+ ['pine_green'] = 'Vert Sapin',
+ ['olive_green'] = 'Vert Olive',
+ ['light_green'] = 'Vert Clair',
+ ['lime_green'] = 'Vert Lime',
+ ['forest_green'] = 'Vert Forêt',
+ ['lawn_green'] = 'Vert Pelouse',
+ ['imperial_green'] = 'Vert Impérial',
+ ['green_bottle'] = 'Vert Bouteille',
+ ['citrus_green'] = 'Vert Citrus',
+ ['green_anis'] = 'Vert Anis',
+ ['khaki'] = 'Kaki',
+ ['army_green'] = 'Vert Army',
+ ['dark_green'] = 'Vert Sombre',
+ ['hunter_green'] = 'Vert Chasseur',
+ ['matte_foilage_green'] = 'Amarylisse',
+ -- Orange
+ ['orange'] = 'orange',
+ ['tangerine'] = 'Tangerine',
+ ['matteorange'] = 'Orange Mat',
+ ['lightorange'] = 'Orange Clair',
+ ['peach'] = 'Pèche',
+ ['pumpkin'] = 'Citrouille',
+ ['orangelambo'] = 'Orange Lambo',
+ -- Brown
+ ['brown'] = 'marron',
+ ['copper'] = 'Cuivre',
+ ['lightbrown'] = 'Marronclair',
+ ['darkbrown'] = 'Marron Foncé',
+ ['bronze'] = 'Bronze',
+ ['brownmetallic'] = 'Marron Métallisé',
+ ['expresso'] = 'Expresso',
+ ['chocolate'] = 'Chocolat',
+ ['terracotta'] = 'Terre Cuite',
+ ['marble'] = 'Marbre',
+ ['sand'] = 'Sable',
+ ['sepia'] = 'Sépia',
+ ['bison'] = 'Bison',
+ ['palm'] = 'Palmier',
+ ['caramel'] = 'Caramel',
+ ['rust'] = 'Rouille',
+ ['chestnut'] = 'Chataigne',
+ ['hazelnut'] = 'Noisette',
+ ['shell'] = 'Coquillage',
+ ['mahogany'] = 'Acajou',
+ ['cauldron'] = 'Chaudron',
+ ['blond'] = 'Blond',
+ ['gravel'] = 'Gravillon',
+ ['darkearth'] = 'Terre Foncé',
+ ['desert'] = 'Désert',
+ -- Purple
+ ['purple'] = 'violet',
+ ['indigo'] = 'Indigo',
+ ['deeppurple'] = 'Violet Profond',
+ ['darkviolet'] = 'Violet Foncé',
+ ['amethyst'] = 'Améthyste',
+ ['mysticalviolet'] = 'Violet Mystique',
+ ['purplemetallic'] = 'Violet Métallisé',
+ ['matteviolet'] = 'Violet Mat',
+ ['mattedeeppurple'] = 'Violet Profond Mat',
+ -- Chrome
+ ['chrome'] = 'chrome',
+ ['brushedchrome'] = 'chrome Brossé',
+ ['blackchrome'] = 'chrome Noir',
+ ['brushedaluminum'] = 'aluminum Brossé',
+ -- Metal
+ ['gold'] = 'or',
+ ['puregold'] = 'Or Pure',
+ ['brushedgold'] = 'Or Brossé',
+ ['lightgold'] = 'Or Clair',
+-- License Plates
+ ['blue_on_white_1'] = 'bleu sur fond Blanc 1',
+ ['yellow_on_black'] = 'jaune sur fond Noir',
+ ['yellow_blue'] = 'jaune sur fond Bleu',
+ ['blue_on_white_2'] = 'bleu sur fond Blanc 2',
+ ['blue_on_white_3'] = 'bleu sur fond Blanc 3',
+-- Upgrades
+ ['upgrades'] = 'upgrades',
+ ['engine'] = 'moteur',
+ ['brakes'] = 'freins',
+ ['transmission'] = 'transmission',
+ ['suspension'] = 'suspension',
+ ['armor'] = 'armure',
+ ['turbo'] = 'turbo',
+ ['no_turbo'] = 'pas de turbo',
+-- Cosmetics
+ ['cosmetics'] = 'cosmétiques',
+ -- Body Parts
+ ['bodyparts'] = 'carosserie',
+ ['leftfender'] = 'aile gauche',
+ ['rightfender'] = 'aile droite',
+ ['spoilers'] = 'aileron',
+ ['sideskirt'] = 'bas de caisse',
+ ['cage'] = 'cage',
+ ['hood'] = 'capot',
+ ['grille'] = 'grille',
+ ['rearbumper'] = 'pare-choc arrière',
+ ['frontbumper'] = 'pare-choc avant',
+ ['exhaust'] = 'pot d\'échappement',
+ ['roof'] = 'toit',
+ -- Paint
+ ['respray'] = 'peinture',
+ ['primary'] = 'primaire',
+ ['secondary'] = 'secondaire',
+ ['pearlescent'] = 'nacré',
+ -- Misc
+ ['headlights'] = 'phares',
+ ['licenseplates'] = 'plaque',
+ ['windowtint'] = 'fenêtres',
+ ['horns'] = 'klaxon',
+ -- Neon
+ ['neons'] = 'néons',
+ -- Wheels
+ ['wheels'] = 'roues',
+ ['tiresmoke'] = 'fumée des pneus',
+ ['wheel_type'] = 'types de Jantes',
+ ['wheel_color'] = 'couleurs jantes',
+ ['sport'] = 'Jantes Sport',
+ ['muscle'] = 'Jantes Muscle',
+ ['lowrider'] = 'Jantes Lowrider',
+ ['suv'] = 'Jantes SUV',
+ ['allterrain'] = 'Jantes Tout-terrain',
+ ['tuning'] = 'Jantes Tuning',
+ ['motorcycle'] = 'Jantes Moto',
+ ['highend'] = 'Jantes Haut de gamme',
+
+ ['modplateholder'] = 'plaque - Arrière',
+ ['modvanityplate'] = 'plate - Avant',
+ ['interior'] = 'intérieur',
+ ['trim'] = 'accessoires',
+ ['dashboard'] = 'tableau de bord',
+ ['speedometer'] = 'compteur de vitesse',
+ ['door_speakers'] = 'haut-parleurs - portières',
+ ['seats'] = 'sièges',
+ ['steering_wheel'] = 'volant',
+ ['gear_lever'] = 'levier de vitesse',
+ ['quarter_deck'] = 'plage arrière',
+ ['speakers'] = 'haut-parleurs',
+ ['trunk'] = 'coffre',
+ ['hydraulic'] = 'suspension hydraulique',
+ ['engine_block'] = 'bloc moteur',
+ ['air_filter'] = 'filtre à air',
+ ['struts'] = 'entretoises',
+ ['arch_cover'] = 'pare-boue des ailes',
+ ['aerials'] = 'antennes',
+ ['wings'] = 'ailes',
+ ['fuel_tank'] = 'bouchon du réservoir',
+ ['windows'] = 'fenêtres',
+ ['stickers'] = 'autocollants',
+}
diff --git a/_resources/esx_lscustom/locales/pl.lua b/_resources/esx_lscustom/locales/pl.lua
new file mode 100644
index 00000000..d24330dd
--- /dev/null
+++ b/_resources/esx_lscustom/locales/pl.lua
@@ -0,0 +1,303 @@
+Locales['pl'] = {
+<<<<<<< HEAD
+ ['show_active_character'] = 'Pokaż aktywną postać',
+ ['active_character'] = 'Aktywna postać: ~b~%s~s~',
+ ['error_active_character'] = "Podczas pobierania Twojego imienia wystąpił błąd. Proszę skontaktować się z administratorem.",
+ ['delete_character'] = 'Usuń swoją postać i stwórz nową',
+ ['deleted_character'] = 'Twoja postać została usunięta.',
+ ['error_delete_character'] = "Wystąpił błąd podczas usuwania twojej postaci. Proszę skontaktować się z administratorem.",
+ ['thank_you_for_registering'] = "Dziękujemy za rejestrację. Baw się dobrze.",
+ ['registration_error'] = "Wystąpił błąd podczas rejestracji. Proszę skontaktować się z administratorem.",
+ ['debug_xPlayer_get_first_name'] = "Podaj swoje imię",
+ ['debug_xPlayer_get_last_name'] = "Podaj swoje nazwisko",
+ ['debug_xPlayer_get_full_name'] = "Podaj swoją pełną nazwę",
+ ['debug_xPlayer_get_sex'] = "Podaj swoją płeć",
+ ['debug_xPlayer_get_dob'] = "Podaj swoją datę urodzenia",
+ ['debug_xPlayer_get_height'] = "Podaj swój wzrost",
+ ['error_debug_xPlayer_get_first_name'] = "Podczas pobierania twojego imienia wystąpił błąd.",
+ ['error_debug_xPlayer_get_last_name'] = "Podczas pobierania twojego nazwiska wystąpił błąd.",
+ ['error_debug_xPlayer_get_full_name'] = "Podczas pobierania twojego pełnego imienia wystąpił błąd.",
+ ['error_debug_xPlayer_get_sex'] = "Podczas pobierania twojej płci wystąpił błąd.",
+ ['error_debug_xPlayer_get_dob'] = "Podczas pobierania daty urodzenia wystąpił błąd.",
+ ['error_debug_xPlayer_get_height'] = "Podczas pobierania wzrostu wystąpił błąd.",
+ ['return_debug_xPlayer_get_first_name'] = "Imię: ~b~%s",
+ ['return_debug_xPlayer_get_last_name'] = "Nazwisko: ~b~%s",
+ ['return_debug_xPlayer_get_full_name'] = "Pełna nazwa: ~b~%s",
+ ['return_debug_xPlayer_get_sex'] = "Płeć: ~b~%s",
+ ['return_debug_xPlayer_get_dob'] = "Data urodzenia: ~b~%s",
+ ['return_debug_xPlayer_get_height'] = "Wzrost: ~b~%s centymetrów",
+ ['data_incorrect'] = 'Data została wprowadzona niepoprawnie. Proszę spróbuj ponownie.',
+ ['invalid_format'] = 'Data została wprowadzona niepoprawnie. Proszę spróbuj ponownie.',
+ ['no_identifier'] = 'Wystąpił błąd podczas ładowania twojej postaci!\nKod błędu: identifier-missing\n\nPrzyczyna tego błędu nie jest znana, nie można znaleźć Twojego identyfikatora. Wróć później lub zgłoś ten problem zespołowi administracyjnemu serwera.',
+ ['missing_identity'] = 'Wystąpił błąd podczas ładowania twojej postaci!\nKod błędu: identity-missing\n\nWygląda na to, że brakuje Twojej tożsamości, spróbuj połączyć się ponownie.',
+ ['deleted_identity'] = 'Twoja postać została usunięta. Dołącz ponownie, aby utworzyć nową postać.'
+=======
+ ['by_default'] = 'domyślna',
+ ['installed'] = 'zainstalowane',
+ ['already_own'] = 'już posiadasz: ~b~%s~s~',
+ ['not_enough_money'] = 'nie masz wystarczająco pieniędzy!',
+ ['purchased'] = 'zakupiłeś!',
+ ['press_custom'] = 'naciśnij ~INPUT_PICKUP~ aby spersonalizować swój pojazd.',
+ ['level'] = 'level %s',
+ ['neon'] = 'neon',
+ ['blip_name'] = 'los Santos Customs',
+-- Paint Colors
+ -- Black
+ ['black'] = 'czarny',
+ ['graphite'] = 'grafit',
+ ['black_metallic'] = 'metaliczny czarny',
+ ['caststeel'] = 'kuta stal',
+ ['black_anth'] = 'czarny Antracyt',
+ ['matteblack'] = 'matowa czerń',
+ ['darknight'] = 'ciemna noc',
+ ['deepblack'] = 'głęboka czerń',
+ ['oil'] = 'olej',
+ ['carbon'] = 'carbon',
+ -- White
+ ['white'] = 'biały',
+ ['vanilla'] = 'wanilliowy',
+ ['creme'] = 'kremowy',
+ ['polarwhite'] = 'polarny biały',
+ ['beige'] = 'beżowy',
+ ['mattewhite'] = 'matowy biały',
+ ['snow'] = 'snieżny',
+ ['cotton'] = 'bawełna',
+ ['alabaster'] = 'alabastrowy',
+ ['purewhite'] = 'czysty biały',
+ -- Grey
+ ['grey'] = 'szary',
+ ['silver'] = 'srebro',
+ ['metallicgrey'] = 'metaliczny szary',
+ ['laminatedsteel'] = 'laminowana stal',
+ ['darkgray'] = 'ciemny szary',
+ ['rockygray'] = 'skalisty szary',
+ ['graynight'] = 'szara noc',
+ ['aluminum'] = 'aluminium',
+ ['graymat'] = 'matowy szary',
+ ['lightgrey'] = 'jasny szary',
+ ['asphaltgray'] = 'asfaltowy szary',
+ ['grayconcrete'] = 'betonowy szary',
+ ['darksilver'] = 'ciemny szary',
+ ['magnesite'] = 'magnesite',
+ ['nickel'] = 'nikiel',
+ ['zinc'] = 'cynk',
+ ['dolomite'] = 'dolomite',
+ ['bluesilver'] = 'niebieski srebrzysty',
+ ['titanium'] = 'titanium',
+ ['steelblue'] = 'niebieska stal',
+ ['champagne'] = 'szampanowy',
+ ['grayhunter'] = 'grey Hunter',
+ -- Red
+ ['red'] = 'czerwony',
+ ['torino_red'] = 'turyńska czerwień',
+ ['poppy'] = 'makowy czerwień',
+ ['copper_red'] = 'miedziany czerwień',
+ ['cardinal'] = 'kardynałowy czerwień',
+ ['brick'] = 'ceglana czerwień',
+ ['garnet'] = 'granat',
+ ['cabernet'] = 'cabernet Red',
+ ['candy'] = 'cukierkowa czerwień',
+ ['matte_red'] = 'matowa czerwień',
+ ['dark_red'] = 'ciemna czerwień',
+ ['red_pulp'] = 'red Pulp',
+ ['bril_red'] = 'brilliant Red',
+ ['pale_red'] = 'blady czerwony',
+ ['wine_red'] = 'winiana czerwień',
+ ['volcano'] = 'wulkanowy',
+ -- Pink
+ ['pink'] = 'różowy',
+ ['electricpink'] = 'elektryczny różowy',
+ ['brightpink'] = 'jasny Różowy',
+ ['salmon'] = 'łososiowy',
+ ['sugarplum'] = 'sugar Plum',
+ -- Niebieski
+ ['blue'] = 'niebieski',
+ ['topaz'] = 'topaz',
+ ['light_blue'] = 'jasny niebieski',
+ ['galaxy_blue'] = 'galaktyczny niebieski',
+ ['dark_blue'] = 'ciemny niebieski',
+ ['azure'] = 'azure',
+ ['navy_blue'] = 'granatowy',
+ ['lapis'] = 'lapis Lazuli',
+ ['blue_diamond'] = 'niebieski diament',
+ ['surfer'] = 'surfer',
+ ['pastel_blue'] = 'pastelowy niebieski',
+ ['celeste_blue'] = 'celeste Blue',
+ ['rally_blue'] = 'rally Blue',
+ ['blue_paradise'] = 'blue Paradise',
+ ['blue_night'] = 'niebieska noc',
+ ['cyan_blue'] = 'cyankowy',
+ ['cobalt'] = 'kobaltowy',
+ ['electric_blue'] = 'elektryczny miebieski',
+ ['horizon_blue'] = 'horizon Blue',
+ ['metallic_blue'] = 'metaliczny niebieski',
+ ['aquamarine'] = 'akwamaryn',
+ ['blue_agathe'] = 'blue Agathe',
+ ['zirconium'] = 'zirconium',
+ ['spinel'] = 'spinel',
+ ['tourmaline'] = 'tourmaline',
+ ['paradise'] = 'paradise',
+ ['bubble_gum'] = 'guma balonowa',
+ ['midnight_blue'] = 'midnight Blue',
+ ['forbidden_blue'] = 'forbidden Blue',
+ ['glacier_blue'] = 'glacier Blue',
+ -- Yellow
+ ['yellow'] = 'żółty',
+ ['wheat'] = 'pszenica',
+ ['raceyellow'] = 'wyścigowy żółty',
+ ['paleyellow'] = 'jasnożółty',
+ ['lightyellow'] = 'jasny żółty',
+ -- Green
+ ['green'] = 'zielony',
+ ['met_dark_green'] = 'metaliczny ciemny zielony',
+ ['rally_green'] = 'rally Green',
+ ['pine_green'] = 'pine Green',
+ ['olive_green'] = 'zielona oliwka',
+ ['light_green'] = 'jasny zielony',
+ ['lime_green'] = 'lime green',
+ ['forest_green'] = 'forest Green',
+ ['lawn_green'] = 'lawn Green',
+ ['imperial_green'] = 'imperial Green',
+ ['green_bottle'] = 'breen Bottle',
+ ['citrus_green'] = 'cytrusowy Zielony',
+ ['green_anis'] = 'zielony anyż',
+ ['khaki'] = 'khaki',
+ ['army_green'] = 'zieleń wojskowa',
+ ['dark_green'] = 'ciemny zielony',
+ ['hunter_green'] = 'hunter Green',
+ ['matte_foilage_green'] = 'matte Foilage Green',
+ -- Orange
+ ['orange'] = 'pomarańczowy',
+ ['tangerine'] = 'tangerine',
+ ['matteorange'] = 'matowy Pomarańczowy',
+ ['lightorange'] = 'jasny Pomarańczowy',
+ ['peach'] = 'brzoskwiniowy ',
+ ['pumpkin'] = 'dynia',
+ ['orangelambo'] = 'orange Lambo',
+ -- Brown
+ ['brown'] = 'brązowy',
+ ['copper'] = 'medziany',
+ ['lightbrown'] = 'jasny brązowy',
+ ['darkbrown'] = 'ciemny brąz',
+ ['bronze'] = 'brąz',
+ ['brownmetallic'] = 'metaliczny brązowy',
+ ['expresso'] = 'expresso',
+ ['chocolate'] = 'czekoladowy',
+ ['terracotta'] = 'terakota',
+ ['marble'] = 'marmur',
+ ['sand'] = 'piasek',
+ ['sepia'] = 'sepia',
+ ['bison'] = 'bison',
+ ['palm'] = 'palma',
+ ['caramel'] = 'karmel',
+ ['rust'] = 'rdza ',
+ ['chestnut'] = 'orzechowy',
+ ['hazelnut'] = 'orzech laskowy',
+ ['shell'] = 'shell',
+ ['mahogany'] = 'mahogany',
+ ['cauldron'] = 'cauldron',
+ ['blond'] = 'blond',
+ ['gravel'] = 'żwir',
+ ['darkearth'] = 'ciemna ziemia',
+ ['desert'] = 'pustynia',
+ -- Purple
+ ['purple'] = 'fioletowy',
+ ['indigo'] = 'indygo',
+ ['deeppurple'] = 'głęboki fiolet',
+ ['darkviolet'] = 'ciemny fiolet',
+ ['amethyst'] = 'ametyst',
+ ['mysticalviolet'] = 'mystic Violet',
+ ['purplemetallic'] = 'metaliczny fiolet',
+ ['matteviolet'] = 'matowy fiolet',
+ ['mattedeeppurple'] = 'matowy głęboki fiolet',
+ -- Chrome
+ ['chrome'] = 'chrom',
+ ['brushedchrome'] = 'oczyszczony chrom',
+ ['blackchrome'] = 'czarny chrom',
+ ['brushedaluminum'] = 'szczotkowane aluminium',
+ -- Metal
+ ['gold'] = 'Złoto',
+ ['puregold'] = 'czyste złoto',
+ ['brushedgold'] = 'szczotkowane złoto',
+ ['lightgold'] = 'jasne złoto',
+-- License Plates
+ ['blue_on_white_1'] = 'niebieskie na białym 1',
+ ['yellow_on_black'] = 'żółte na czarnym',
+ ['yellow_blue'] = 'żółte na niebieskim',
+ ['blue_on_white_2'] = 'niebieskie na białym 2',
+ ['blue_on_white_3'] = 'niebieskie na białym 3',
+-- Upgrades
+ ['upgrades'] = 'ulepszenia',
+ ['engine'] = 'silnik',
+ ['brakes'] = 'hamulce',
+ ['transmission'] = 'skrzynia biegów',
+ ['suspension'] = 'zawieszenie',
+ ['armor'] = 'opancerzenie',
+ ['turbo'] = 'turbo',
+ ['no_turbo'] = 'bez turbo',
+-- Cosmetics
+ ['cosmetics'] = 'kosmetyczne',
+ -- Body parts
+ ['bodyparts'] = 'karoseria',
+ ['leftfender'] = 'lewy błotnik',
+ ['rightfender'] = 'prawy błotnik',
+ ['spoilers'] = 'spojler',
+ ['sideskirt'] = 'progi',
+ ['cage'] = 'bagażnik',
+ ['hood'] = 'maska',
+ ['grille'] = 'gril',
+ ['rearbumper'] = 'tylny zderzak ',
+ ['frontbumper'] = 'przedni zderzak',
+ ['exhaust'] = 'wydech',
+ ['roof'] = 'dach',
+ -- Paint
+ ['respray'] = 'przefarbuj',
+ ['primary'] = 'pierwszy',
+ ['secondary'] = 'drugi',
+ ['pearlescent'] = 'perła',
+ -- Misc
+ ['headlights'] = 'reflektory',
+ ['licenseplates'] = 'tablice rejestracyjne',
+ ['windowtint'] = 'odcień okna',
+ ['horns'] = 'klakson',
+ -- Neon
+ ['neons'] = 'neony',
+ -- Wheels
+ ['wheels'] = 'koła',
+ ['tiresmoke'] = 'dym spod opon',
+ ['wheel_type'] = 'typ koła',
+ ['wheel_color'] = 'kolor koła',
+ ['sport'] = 'sportowe',
+ ['muscle'] = 'muscle',
+ ['lowrider'] = 'lowrider',
+ ['suv'] = 'sUV',
+ ['allterrain'] = 'terenowe',
+ ['tuning'] = 'tuner',
+ ['motorcycle'] = 'motocykle',
+ ['highend'] = 'high end',
+
+ ['modplateholder'] = 'tablica - Tył',
+ ['modvanityplate'] = 'tablica - Przód',
+ ['interior'] = 'wnętrze',
+ ['trim'] = 'wykończenie',
+ ['dashboard'] = 'deska rozdzielcza',
+ ['speedometer'] = 'prędkościomierz',
+ ['door_speakers'] = 'drzwi',
+ ['seats'] = 'siedzenia',
+ ['steering_wheel'] = 'kierownica',
+ ['gear_lever'] = 'dżwignia zmiany biegów',
+ ['quarter_deck'] = 'quarter-deck',
+ ['speakers'] = 'głośniki',
+ ['trunk'] = 'bagażnik',
+ ['hydraulic'] = 'hydraulika',
+ ['engine_block'] = 'blok silnika',
+ ['air_filter'] = 'filtr powietrza',
+ ['struts'] = 'podpórka',
+ ['arch_cover'] = 'arch cover',
+ ['aerials'] = 'anteny',
+ ['wings'] = 'skrzydełka ',
+ ['fuel_tank'] = 'zbiornik paliwa',
+ ['windows'] = 'okna',
+ ['stickers'] = 'naklejki',
+>>>>>>> esx_lscustom/master
+}
diff --git a/_resources/esx_lscustom/server/main.lua b/_resources/esx_lscustom/server/main.lua
new file mode 100644
index 00000000..2c24ceee
--- /dev/null
+++ b/_resources/esx_lscustom/server/main.lua
@@ -0,0 +1,628 @@
+ESX = nil
+<<<<<<< HEAD
+TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
+local playerIdentity = {}
+local alreadyRegistered = {}
+local multichar = ESX.GetConfig().Multichar
+
+if multichar == nil then
+ ESX.GetIdentifier = function(playerId)
+ for k,v in ipairs(GetPlayerIdentifiers(playerId)) do
+ if string.match(v, 'license:') then
+ local identifier = string.gsub(v, 'license:', '')
+ return identifier
+ end
+ end
+ end
+end
+
+if Config.UseDeferrals then
+ AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
+ deferrals.defer()
+ local playerId, identifier = source, ESX.GetIdentifier(source)
+ 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
+ playerIdentity[identifier] = {
+ firstName = result[1].firstname,
+ lastName = result[1].lastname,
+ dateOfBirth = result[1].dateofbirth,
+ sex = result[1].sex,
+ height = result[1].height
+ }
+
+ deferrals.done()
+ else
+ deferrals.presentCard([==[{"type": "AdaptiveCard","body":[{"type":"Container","items":[{"type":"ColumnSet","columns":[{"type":"Column","items":[{"type":"Input.Text","placeholder":"First Name","id":"firstname","maxLength":15},{"type":"Input.Text","placeholder":"Date of Birth (MM/DD/YYYY)","id":"dateofbirth","maxLength":10}],"width":"stretch"},{"type":"Column","width":"stretch","items":[{"type":"Input.Text","placeholder":"Last Name","id":"lastname","maxLength":15},{"type":"Input.Text","placeholder":"Height (48-96 inches)","id":"height","maxLength":2}]}]},{"type":"Input.ChoiceSet","placeholder":"Sex","choices":[{"title":"Male","value":"m"},{"title":"Female","value":"f"}],"style":"expanded","id":"sex"}]},{"type": "ActionSet","actions": [{"type":"Action.Submit","title":"Submit"}]}],"$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==], function(data, rawData)
+ if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == '' or data.height == '' then
+ deferrals.done(_U('data_incorrect'))
+ else
+ if checkNameFormat(data.firstname) and checkNameFormat(data.lastname) and checkDOBFormat(data.dateofbirth) and checkSexFormat(data.sex) and checkHeightFormat(data.height) then
+ playerIdentity[identifier] = {
+ firstName = formatName(data.firstname),
+ lastName = formatName(data.lastname),
+ dateOfBirth = data.dateofbirth,
+ sex = data.sex,
+ height = tonumber(data.height),
+ saveToDatabase = true
+ }
+
+ deferrals.done()
+ else
+ deferrals.done(_U('invalid_format'))
+ end
+ end
+ end)
+ end
+ else
+ deferrals.presentCard([==[{"type": "AdaptiveCard","body":[{"type":"Container","items":[{"type":"ColumnSet","columns":[{"type":"Column","items":[{"type":"Input.Text","placeholder":"First Name","id":"firstname","maxLength":15},{"type":"Input.Text","placeholder":"Date of Birth (MM/DD/YYYY)","id":"dateofbirth","maxLength":10}],"width":"stretch"},{"type":"Column","width":"stretch","items":[{"type":"Input.Text","placeholder":"Last Name","id":"lastname","maxLength":15},{"type":"Input.Text","placeholder":"Height (48-96 inches)","id":"height","maxLength":2}]}]},{"type":"Input.ChoiceSet","placeholder":"Sex","choices":[{"title":"Male","value":"m"},{"title":"Female","value":"f"}],"style":"expanded","id":"sex"}]},{"type": "ActionSet","actions": [{"type":"Action.Submit","title":"Submit"}]}],"$schema": "http://adaptivecards.io/schemas/adaptive-card.json","version":"1.0"}]==], function(data, rawData)
+ if data.firstname == '' or data.lastname == '' or data.dateofbirth == '' or data.sex == '' or data.height == '' then
+ deferrals.done(_U('data_incorrect'))
+ else
+ if checkNameFormat(data.firstname) and checkNameFormat(data.lastname) and checkDOBFormat(data.dateofbirth) and checkSexFormat(data.sex) and checkHeightFormat(data.height) then
+ playerIdentity[identifier] = {
+ firstName = formatName(data.firstname),
+ lastName = formatName(data.lastname),
+ dateOfBirth = data.dateofbirth,
+ sex = data.sex,
+ height = tonumber(data.height),
+ saveToDatabase = true
+ }
+
+ deferrals.done()
+ else
+ deferrals.done(_U('invalid_format'))
+ end
+ end
+ end)
+ end
+ end)
+ else
+ deferrals.done(_U('no_identifier'))
+ end
+ end)
+
+ RegisterNetEvent('esx:playerLoaded')
+ AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
+ if playerIdentity[xPlayer.identifier] then
+ local currentIdentity = playerIdentity[xPlayer.identifier]
+
+ xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
+ xPlayer.set('firstName', currentIdentity.firstName)
+ xPlayer.set('lastName', currentIdentity.lastName)
+ xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
+ xPlayer.set('sex', currentIdentity.sex)
+ xPlayer.set('height', currentIdentity.height)
+
+ if currentIdentity.saveToDatabase then
+ saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
+ end
+
+ Citizen.Wait(5)
+ alreadyRegistered[xPlayer.identifier] = true
+ TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source)
+
+ playerIdentity[xPlayer.identifier] = nil
+ else
+ xPlayer.kick(_('missing_identity'))
+ end
+ end)
+
+elseif not Config.UseDeferrals then
+ if not multichar then
+ AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals)
+ deferrals.defer()
+ local playerId, identifier = source, ESX.GetIdentifier(source)
+ 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
+ playerIdentity[identifier] = {
+ firstName = result[1].firstname,
+ lastName = result[1].lastname,
+ dateOfBirth = result[1].dateofbirth,
+ sex = result[1].sex,
+ height = result[1].height
+ }
+
+ alreadyRegistered[identifier] = true
+
+ deferrals.done()
+ else
+ playerIdentity[identifier] = nil
+ alreadyRegistered[identifier] = false
+ deferrals.done()
+ end
+ else
+ playerIdentity[identifier] = nil
+ alreadyRegistered[identifier] = false
+ deferrals.done()
+ end
+ end)
+ else
+ deferrals.done(_U('no_identifier'))
+ end
+ end)
+
+ AddEventHandler('onResourceStart', function(resource)
+ if resource == GetCurrentResourceName() then
+ Citizen.Wait(300)
+
+ while not ESX do
+ Citizen.Wait(10)
+ end
+
+ local xPlayers = ESX.GetPlayers()
+
+ for i=1, #xPlayers, 1 do
+ local xPlayer = ESX.GetPlayerFromId(xPlayers[i])
+
+ if xPlayer then
+ checkIdentity(xPlayer)
+ end
+ end
+ end
+ end)
+
+ RegisterNetEvent('esx:playerLoaded')
+ AddEventHandler('esx:playerLoaded', function(playerId, xPlayer)
+ local currentIdentity = playerIdentity[xPlayer.identifier]
+ if currentIdentity and alreadyRegistered[xPlayer.identifier] == true then
+
+ xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
+ xPlayer.set('firstName', currentIdentity.firstName)
+ xPlayer.set('lastName', currentIdentity.lastName)
+ xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
+ xPlayer.set('sex', currentIdentity.sex)
+ xPlayer.set('height', currentIdentity.height)
+
+ if currentIdentity.saveToDatabase then
+ saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
+ end
+
+ Citizen.Wait(10)
+ TriggerClientEvent('esx_identity:alreadyRegistered', xPlayer.source)
+
+ playerIdentity[xPlayer.identifier] = nil
+ else
+ TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
+ end
+ end)
+ end
+
+ ESX.RegisterServerCallback('esx_identity:registerIdentity', function(source, cb, data)
+ local xPlayer = ESX.GetPlayerFromId(source)
+
+ if xPlayer then
+ if not alreadyRegistered[xPlayer.identifier] then
+ if checkNameFormat(data.firstname) and checkNameFormat(data.lastname) and checkSexFormat(data.sex) and checkDOBFormat(data.dateofbirth) and checkHeightFormat(data.height) then
+ playerIdentity[xPlayer.identifier] = {
+ firstName = formatName(data.firstname),
+ lastName = formatName(data.lastname),
+ dateOfBirth = data.dateofbirth,
+ sex = data.sex,
+ height = data.height
+ }
+
+ local currentIdentity = playerIdentity[xPlayer.identifier]
+
+ xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
+ xPlayer.set('firstName', currentIdentity.firstName)
+ xPlayer.set('lastName', currentIdentity.lastName)
+ xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
+ xPlayer.set('sex', currentIdentity.sex)
+ xPlayer.set('height', currentIdentity.height)
+
+ saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
+ alreadyRegistered[xPlayer.identifier] = true
+
+ playerIdentity[xPlayer.identifier] = nil
+ cb(true)
+ else
+ cb(false)
+ end
+ else
+ cb(false)
+ end
+ else
+ if multichar and checkNameFormat(data.firstname) and checkNameFormat(data.lastname) and checkSexFormat(data.sex) and checkDOBFormat(data.dateofbirth) and checkHeightFormat(data.height) then
+ TriggerEvent('esx_identity:completedRegistration', source, data)
+ cb(true)
+ end
+ end
+ 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
+ playerIdentity[xPlayer.identifier] = {
+ firstName = result[1].firstname,
+ lastName = result[1].lastname,
+ dateOfBirth = result[1].dateofbirth,
+ sex = result[1].sex,
+ height = result[1].height
+ }
+
+ alreadyRegistered[xPlayer.identifier] = true
+
+ setIdentity(xPlayer)
+ else
+ playerIdentity[xPlayer.identifier] = nil
+ alreadyRegistered[xPlayer.identifier] = false
+ TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
+ end
+ else
+ TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
+ end
+ end)
+ end
+
+ function setIdentity(xPlayer)
+ if alreadyRegistered[xPlayer.identifier] then
+ local currentIdentity = playerIdentity[xPlayer.identifier]
+
+ xPlayer.setName(('%s %s'):format(currentIdentity.firstName, currentIdentity.lastName))
+ xPlayer.set('firstName', currentIdentity.firstName)
+ xPlayer.set('lastName', currentIdentity.lastName)
+ xPlayer.set('dateofbirth', currentIdentity.dateOfBirth)
+ xPlayer.set('sex', currentIdentity.sex)
+ xPlayer.set('height', currentIdentity.height)
+
+ if currentIdentity.saveToDatabase then
+ saveIdentityToDatabase(xPlayer.identifier, currentIdentity)
+ end
+
+ playerIdentity[xPlayer.identifier] = nil
+ end
+ end
+end
+
+if Config.EnableCommands then
+ ESX.RegisterCommand('char', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.getName() then
+ xPlayer.showNotification(_U('active_character', xPlayer.getName()))
+ else
+ xPlayer.showNotification(_U('error_active_character'))
+ end
+ end, false, {help = _U('show_active_character')})
+
+ ESX.RegisterCommand('chardel', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.getName() then
+ if Config.UseDeferrals then
+ xPlayer.kick(_('deleted_identity'))
+ Citizen.Wait(1500)
+ deleteIdentity(xPlayer)
+ xPlayer.showNotification(_U('deleted_character'))
+ playerIdentity[xPlayer.identifier] = nil
+ alreadyRegistered[xPlayer.identifier] = false
+ else
+ deleteIdentity(xPlayer)
+ xPlayer.showNotification(_U('deleted_character'))
+ playerIdentity[xPlayer.identifier] = nil
+ alreadyRegistered[xPlayer.identifier] = false
+ TriggerClientEvent('esx_identity:showRegisterIdentity', xPlayer.source)
+ end
+ else
+ xPlayer.showNotification(_U('error_delete_character'))
+ end
+ end, false, {help = _U('delete_character')})
+end
+
+if Config.EnableDebugging then
+ ESX.RegisterCommand('xPlayerGetFirstName', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.get('firstName') then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_first_name', xPlayer.get('firstName')))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_first_name'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_first_name')})
+
+ ESX.RegisterCommand('xPlayerGetLastName', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.get('lastName') then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_last_name', xPlayer.get('lastName')))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_last_name'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_last_name')})
+
+ ESX.RegisterCommand('xPlayerGetFullName', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.getName() then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_full_name', xPlayer.getName()))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_full_name'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_full_name')})
+
+ ESX.RegisterCommand('xPlayerGetSex', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.get('sex') then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_sex', xPlayer.get('sex')))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_sex'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_sex')})
+
+ ESX.RegisterCommand('xPlayerGetDOB', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.get('dateofbirth') then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_dob', xPlayer.get('dateofbirth')))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_dob'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_dob')})
+
+ ESX.RegisterCommand('xPlayerGetHeight', 'user', function(xPlayer, args, showError)
+ if xPlayer and xPlayer.get('height') then
+ xPlayer.showNotification(_U('return_debug_xPlayer_get_height', xPlayer.get('height')))
+ else
+ xPlayer.showNotification(_U('error_debug_xPlayer_get_height'))
+ end
+ end, false, {help = _U('debug_xPlayer_get_height')})
+end
+
+function deleteIdentity(xPlayer)
+ if alreadyRegistered[xPlayer.identifier] then
+ xPlayer.setName(('%s %s'):format(nil, nil))
+ xPlayer.set('firstName', nil)
+ xPlayer.set('lastName', nil)
+ xPlayer.set('dateofbirth', nil)
+ xPlayer.set('sex', nil)
+ xPlayer.set('height', nil)
+
+ deleteIdentityFromDatabase(xPlayer)
+ end
+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
+ })
+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
+ })
+
+ 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.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
+ })
+ end
+end
+
+function checkNameFormat(name)
+ if not checkAlphanumeric(name) then
+ if not checkForNumbers(name) then
+ local stringLength = string.len(name)
+ if stringLength > 0 and stringLength < Config.MaxNameLength then
+ return true
+ else
+ return false
+ end
+ else
+ return false
+ end
+ else
+ return false
+ end
+end
+
+function checkDOBFormat(dob)
+ local date = tostring(dob)
+ if checkDate(date) then
+ return true
+ else
+ return false
+ end
+end
+
+function checkSexFormat(sex)
+ if sex == "m" or sex == "M" or sex == "f" or sex == "F" then
+ return true
+ else
+ return false
+ end
+end
+
+function checkHeightFormat(height)
+ local numHeight = tonumber(height)
+ if numHeight < Config.MinHeight and numHeight > Config.MaxHeight then
+ return false
+ else
+ return true
+ end
+end
+
+function formatName(name)
+ local loweredName = convertToLowerCase(name)
+ local formattedName = convertFirstLetterToUpper(loweredName)
+ return formattedName
+end
+
+function convertToLowerCase(str)
+ return string.lower(str)
+end
+
+function convertFirstLetterToUpper(str)
+ return str:gsub("^%l", string.upper)
+end
+
+function checkAlphanumeric(str)
+ return (string.match(str, "%W"))
+end
+
+function checkForNumbers(str)
+ return (string.match(str,"%d"))
+end
+
+function checkDate(str)
+ if string.match(str, '(%d%d)/(%d%d)/(%d%d%d%d)') ~= nil then
+ local m, d, y = string.match(str, '(%d+)/(%d+)/(%d+)')
+ m = tonumber(m)
+ d = tonumber(d)
+ y = tonumber(y)
+ if ((d <= 0) or (d > 31)) or ((m <= 0) or (m > 12)) or ((y <= Config.LowestYear) or (y > Config.HighestYear)) then
+ return false
+ elseif m == 4 or m == 6 or m == 9 or m == 11 then
+ if d > 30 then
+ return false
+ else
+ return true
+ end
+ elseif m == 2 then
+ if y%400 == 0 or (y%100 ~= 0 and y%4 == 0) then
+ if d > 29 then
+ return false
+ else
+ return true
+ end
+ else
+ if d > 28 then
+ return false
+ else
+ return true
+ end
+ end
+ else
+ if d > 31 then
+ return false
+ else
+ return true
+ end
+ end
+ else
+ return false
+ end
+end
+=======
+local Vehicles
+
+TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
+
+RegisterServerEvent('esx_lscustom:buyMod')
+AddEventHandler('esx_lscustom:buyMod', function(price)
+ local _source = source
+ local xPlayer = ESX.GetPlayerFromId(_source)
+ price = tonumber(price)
+
+ if Config.IsMechanicJobOnly then
+ local societyAccount
+
+ TriggerEvent('esx_addonaccount:getSharedAccount', 'society_mechanic', function(account)
+ societyAccount = account
+ end)
+
+ if price < societyAccount.money then
+ TriggerClientEvent('esx_lscustom:installMod', _source)
+ TriggerClientEvent('esx:showNotification', _source, _U('purchased'))
+ societyAccount.removeMoney(price)
+ else
+ TriggerClientEvent('esx_lscustom:cancelInstallMod', _source)
+ TriggerClientEvent('esx:showNotification', _source, _U('not_enough_money'))
+ end
+ else
+ if price < xPlayer.getMoney() then
+ TriggerClientEvent('esx_lscustom:installMod', _source)
+ TriggerClientEvent('esx:showNotification', _source, _U('purchased'))
+ xPlayer.removeMoney(price)
+ else
+ TriggerClientEvent('esx_lscustom:cancelInstallMod', _source)
+ TriggerClientEvent('esx:showNotification', _source, _U('not_enough_money'))
+ end
+ end
+end)
+
+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)
+
+ 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)
+ })
+ else
+ print(('esx_lscustom: %s attempted to upgrade vehicle with mismatching vehicle model!'):format(xPlayer.identifier))
+ end
+ end
+ end)
+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)
+ end
+end)
+>>>>>>> esx_lscustom/master