diff --git a/.hgtags b/.hgtags
index 6eeec5b9a..38ed6cd84 100644
--- a/.hgtags
+++ b/.hgtags
@@ -1,28 +1,27 @@
-4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0
-00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0
-79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1
-fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0
-edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0
-e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1
-9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2
-bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3
-9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0
-3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0
-153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1
-9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom-patch-3.0.2
-4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0
-d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom-patch-3.1.0-hotfix
-043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch
-4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom-patch-3.2.0
-18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom-patch-3.2.1
-822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom-patch-3.3.0
-00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0
-0000000000000000000000000000000000000000 3.3.0
-dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1
-fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom-patch-3.4.0
-70eba02e8eab6920586dbabf74e9e8180c729980 ryzom-patch-3.4.0 Steam Fix
-3941482843f9cd130cfc16634efc08d34a98ed35 ryzom-patch-3.4.0 Atysmas
-ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom-patch-3.5.0
-95783afa226f241062134eb62f4323295d29ac84 ryzom-patch-3.5.0.9637
-8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1
-3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0
+4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0
+00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0
+79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1
+fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0
+edaa3624a56420b02ccc64c26059801a389927ee v0.11.0
+e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1
+9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2
+bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3
+9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0
+3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0
+8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1
+3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0
+153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1
+9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2
+4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0
+d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix
+043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch
+4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0
+18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1
+822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0
+00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0
+dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1
+fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0
+70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix
+3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas
+ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0
+95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..0ad25db4b
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 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 Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are 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.
+
+ 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.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ 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 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 work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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 Affero 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 Affero 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 Affero 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.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ 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 AGPL, see
+.
diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt
index 46900daa6..67d516ba5 100644
--- a/code/CMakeLists.txt
+++ b/code/CMakeLists.txt
@@ -63,6 +63,25 @@ SET(RYZOM_VERSION_MAJOR 3)
SET(RYZOM_VERSION_MINOR 5)
SET(RYZOM_VERSION_PATCH 0)
+SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Create Account URL")
+SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL")
+SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL")
+SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL")
+
+SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL")
+SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain")
+
+# urls when compiling ryzom live client
+IF(WITH_RYZOM_LIVE)
+ SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://account.ryzom.com/signup/from_client.php")
+ SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php")
+ SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php")
+ SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live")
+
+ SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/")
+ SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com")
+ENDIF()
+
#-----------------------------------------------------------------------------
# Redirect output files
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@@ -220,6 +239,8 @@ IF(WITH_NEL)
IF(WITH_GUI)
FIND_PACKAGE(Luabind REQUIRED)
+ ENDIF()
+
FIND_PACKAGE(CURL REQUIRED)
IF((WIN32 OR CURL_LIBRARIES MATCHES "\\.a") AND WITH_STATIC_CURL)
@@ -269,7 +290,6 @@ IF(WITH_NEL)
ENDIF()
ENDIF()
ENDIF()
- ENDIF()
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include)
ADD_SUBDIRECTORY(nel)
diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake
index bd70dd2ff..bac079fb6 100644
--- a/code/CMakeModules/nel.cmake
+++ b/code/CMakeModules/nel.cmake
@@ -281,6 +281,8 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS)
OPTION(WITH_RYZOM "Build Ryzom Core." ON )
OPTION(WITH_SNOWBALLS "Build Snowballs." OFF)
OPTION(WITH_TOOLS "Build Tools" OFF)
+
+ OPTION(WITH_RYZOM_LIVE "Use ryzom.com urls" OFF)
ENDMACRO(NL_SETUP_DEFAULT_OPTIONS)
MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)
diff --git a/code/config.h.cmake b/code/config.h.cmake
index 9d698ac08..fa4749cb2 100644
--- a/code/config.h.cmake
+++ b/code/config.h.cmake
@@ -33,6 +33,14 @@
#cmakedefine RYZOM_VERSION_RC ${RYZOM_VERSION_RC}
#cmakedefine RYZOM_PRODUCT_VERSION "${RYZOM_PRODUCT_VERSION}"
+#cmakedefine RYZOM_CLIENT_CREATE_ACCOUNT_URL "${RYZOM_CLIENT_CREATE_ACCOUNT_URL}"
+#cmakedefine RYZOM_CLIENT_EDIT_ACCOUNT_URL "${RYZOM_CLIENT_EDIT_ACCOUNT_URL}"
+#cmakedefine RYZOM_CLIENT_FORGET_PASSWORD_URL "${RYZOM_CLIENT_FORGET_PASSWORD_URL}"
+#cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}"
+
+#cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}"
+#cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}"
+
#cmakedefine AUTHOR "${AUTHOR}"
#cmakedefine YEAR "${YEAR}"
#cmakedefine COPYRIGHT "${COPYRIGHT}"
diff --git a/code/nel/include/nel/gui/curl_certificates.h b/code/nel/include/nel/misc/curl_certificates.h
similarity index 97%
rename from code/nel/include/nel/gui/curl_certificates.h
rename to code/nel/include/nel/misc/curl_certificates.h
index 9d5ad4855..778074ca1 100644
--- a/code/nel/include/nel/gui/curl_certificates.h
+++ b/code/nel/include/nel/misc/curl_certificates.h
@@ -22,7 +22,7 @@
// forward declaration to avoid curl.h inclusion everywhere
typedef void CURL;
-namespace NLGUI
+namespace NLMISC
{
class CCurlCertificates
{
@@ -36,3 +36,5 @@ namespace NLGUI
} // namespace
#endif
+
+/* end of file */
diff --git a/code/ryzom/client/src/http_client_curl.h b/code/nel/include/nel/misc/http_client_curl.h
similarity index 75%
rename from code/ryzom/client/src/http_client_curl.h
rename to code/nel/include/nel/misc/http_client_curl.h
index 2ba58746e..b282c2b70 100644
--- a/code/ryzom/client/src/http_client_curl.h
+++ b/code/nel/include/nel/misc/http_client_curl.h
@@ -20,10 +20,12 @@
#include "nel/misc/types_nl.h"
#include
+namespace NLMISC
+{
/**
- * HTTP client with SSL capabilities
- */
+ * HTTP client with SSL capabilities
+ */
class CCurlHttpClient
{
public:
@@ -41,19 +43,19 @@ public:
bool verifyServer(bool verify);
/// Send a 'get' request
- bool sendGet(const std::string &url, const std::string& params=std::string(), bool verbose=false);
+ bool sendGet(const std::string &url, const std::string ¶ms = std::string(), bool verbose = false);
/// Send a 'get' request with a cookie
- bool sendGetWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string& params=std::string(), bool verbose=false);
+ bool sendGetWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string ¶ms = std::string(), bool verbose = false);
/// Send a 'post' request
- bool sendPost(const std::string &url, const std::string& params=std::string(), bool verbose=false);
+ bool sendPost(const std::string &url, const std::string ¶ms = std::string(), bool verbose = false);
/// Send a 'post' request with a cookie
- bool sendPostWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string& params=std::string(), bool verbose=false);
+ bool sendPostWithCookie(const std::string &url, const std::string &name, const std::string &value, const std::string ¶ms = std::string(), bool verbose = false);
/// Wait for a response
- bool receive(std::string &res, bool verbose=false);
+ bool receive(std::string &res, bool verbose = false);
/// Disconnect if connected (otherwise does nothing)
void disconnect();
@@ -61,7 +63,7 @@ public:
protected:
/// Helper
- bool sendRequest(const std::string& methodWB, const std::string &url, const std::string &cookieName, const std::string &cookieValue, const std::string& postParams, bool verbose);
+ bool sendRequest(const std::string &methodWB, const std::string &url, const std::string &cookieName, const std::string &cookieValue, const std::string &postParams, bool verbose);
/// Helper
void pushReceivedData(uint8 *buffer, uint size);
@@ -69,7 +71,7 @@ protected:
static size_t writeDataFromCurl(void *buffer, size_t size, size_t nmemb, void *pHttpClient);
private:
- void* _CurlStruct; // void* to prevent including curl.h in a header file
+ void *_CurlStruct; // void* to prevent including curl.h in a header file
std::vector _ReceiveBuffer;
std::string _Auth; // must be kept here because curl only stores the char pointer
@@ -77,6 +79,8 @@ private:
extern CCurlHttpClient CurlHttpClient;
+}
+
#endif // NL_HTTP_CLIENT_H
/* End of http_client_curl.h */
diff --git a/code/nel/include/nel/misc/string_common.h b/code/nel/include/nel/misc/string_common.h
index bb972a4eb..7366a0693 100644
--- a/code/nel/include/nel/misc/string_common.h
+++ b/code/nel/include/nel/misc/string_common.h
@@ -257,6 +257,20 @@ inline bool fromString(const std::string &str, uint &val) { return sscanf(str.c_
inline bool fromString(const std::string &str, sint &val) { return sscanf(str.c_str(), "%d", &val) == 1; }
#endif // NL_COMP_VC6
+inline bool startsWith(const char *str, const char *prefix)
+{
+ for (int i = 0;; ++i)
+ {
+ if (str[i] != prefix[i] || str[i] == '\0')
+ {
+ return prefix[i] == '\0';
+ }
+ }
+}
+
+inline bool startsWith(const std::string &str, const char *prefix) { return startsWith(str.c_str(), prefix); }
+inline bool startsWith(const std::string &str, const std::string &prefix) { return startsWith(str.c_str(), prefix.c_str()); }
+
// Convert local codepage to UTF-8
// On Windows, the local codepage is undetermined
// On Linux, the local codepage is always UTF-8 (no-op)
diff --git a/code/nel/include/nel/sound/clustered_sound.h b/code/nel/include/nel/sound/clustered_sound.h
index 4b28a71ec..e37762b20 100644
--- a/code/nel/include/nel/sound/clustered_sound.h
+++ b/code/nel/include/nel/sound/clustered_sound.h
@@ -189,7 +189,7 @@ public:
const std::vector > &getAudioPath() { return _AudioPath;}
-
+ static void buildSheets(const std::string &packedSheetPath);
private:
diff --git a/code/nel/include/nel/sound/u_audio_mixer.h b/code/nel/include/nel/sound/u_audio_mixer.h
index 089013797..a1fb2b3cc 100644
--- a/code/nel/include/nel/sound/u_audio_mixer.h
+++ b/code/nel/include/nel/sound/u_audio_mixer.h
@@ -169,6 +169,10 @@ public:
static std::string buildSampleBank(const std::vector &sampleList, const std::string &bankDir, const std::string &bankName);
/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file.
static std::string buildSoundBank(const std::string &packedSheetDir);
+ /// Build the cluster sound_group sheets.
+ static std::string buildClusteredSoundGroupSheets(const std::string &packedSheetDir);
+ /// Build the user var binding sheets.
+ static std::string buildUserVarBindingSheets(const std::string &packedSheetDir);
/** Set the global path to the sample banks
* If you have specified some sample bank to load in the
* mixer config file, you MUST set the sample path
diff --git a/code/nel/src/gui/CMakeLists.txt b/code/nel/src/gui/CMakeLists.txt
index cb7bbe23a..19c0cfea8 100644
--- a/code/nel/src/gui/CMakeLists.txt
+++ b/code/nel/src/gui/CMakeLists.txt
@@ -6,9 +6,9 @@ SOURCE_GROUP("src" FILES ${SRC})
NL_TARGET_LIB(nelgui ${SRC} ${HEADERS})
-INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR})
+INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${LUA_INCLUDE_DIR} ${LUABIND_INCLUDE_DIR} ${CURL_INCLUDE_DIRS})
-TARGET_LINK_LIBRARIES(nelgui nelmisc nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES})
+TARGET_LINK_LIBRARIES(nelgui nelmisc nel3d ${LUA_LIBRARIES} ${LUABIND_LIBRARIES} ${CURL_LIBRARIES})
NL_DEFAULT_PROPS(nelgui "NeL, Library: NeL GUI")
NL_ADD_RUNTIME_FLAGS(nelgui)
diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp
index 1f739cc5f..ce719f4b0 100644
--- a/code/nel/src/gui/group_html.cpp
+++ b/code/nel/src/gui/group_html.cpp
@@ -47,7 +47,7 @@
#include "nel/gui/url_parser.h"
#include "nel/gui/http_cache.h"
#include "nel/gui/http_hsts.h"
-#include "nel/gui/curl_certificates.h"
+#include "nel/misc/curl_certificates.h"
#include "nel/gui/html_parser.h"
#include "nel/gui/html_element.h"
#include "nel/gui/css_style.h"
diff --git a/code/nel/src/misc/CMakeLists.txt b/code/nel/src/misc/CMakeLists.txt
index cd66224ec..091e181cc 100644
--- a/code/nel/src/misc/CMakeLists.txt
+++ b/code/nel/src/misc/CMakeLists.txt
@@ -215,6 +215,7 @@ INCLUDE_DIRECTORIES(../../3rdparty)
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${CURL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR} config_file)
TARGET_LINK_LIBRARIES(nelmisc ${CMAKE_THREAD_LIBS_INIT} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY} ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES} nel_sevenzip)
+
NL_DEFAULT_PROPS(nelmisc "NeL, Library: NeL Misc")
NL_ADD_RUNTIME_FLAGS(nelmisc)
diff --git a/code/nel/src/gui/curl_certificates.cpp b/code/nel/src/misc/curl_certificates.cpp
similarity index 97%
rename from code/nel/src/gui/curl_certificates.cpp
rename to code/nel/src/misc/curl_certificates.cpp
index dbd3005ad..9dcdc72db 100644
--- a/code/nel/src/gui/curl_certificates.cpp
+++ b/code/nel/src/misc/curl_certificates.cpp
@@ -14,10 +14,12 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-//#include
-
-#include "stdpch.h"
-#include "nel/gui/curl_certificates.h"
+#include "stdmisc.h"
+#include
+#include
+#include
+#include
+#include
#include
#include
@@ -25,6 +27,13 @@
#include
+#ifdef NL_OS_WINDOWS
+#include
+#ifdef X509_NAME
+#undef X509_NAME
+#endif
+#endif
+
// for compatibility with older versions
#ifndef CURL_AT_LEAST_VERSION
#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|z)
@@ -40,7 +49,7 @@ using namespace NLMISC;
#define new DEBUG_NEW
#endif
-namespace NLGUI
+namespace NLMISC
{
//
// x509CertList lifetime manager
@@ -385,3 +394,4 @@ namespace NLGUI
}// namespace
+/* end of file */
diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp
index 260834200..71da430de 100644
--- a/code/nel/src/misc/debug.cpp
+++ b/code/nel/src/misc/debug.cpp
@@ -1048,9 +1048,9 @@ void getCallStack(std::string &result, sint skipNFirst)
}
-void getCallStackAndLog (string &result, sint /* skipNFirst */)
+void getCallStackAndLog (string &result, sint skipNFirst)
{
- //getCallStack(result, skipNFirst);
+ getCallStack(result, skipNFirst);
//#ifdef NL_OS_WINDOWS
// try
// {
diff --git a/code/ryzom/client/src/http_client_curl.cpp b/code/nel/src/misc/http_client_curl.cpp
similarity index 91%
rename from code/ryzom/client/src/http_client_curl.cpp
rename to code/nel/src/misc/http_client_curl.cpp
index 16436516b..d335716b0 100644
--- a/code/ryzom/client/src/http_client_curl.cpp
+++ b/code/nel/src/misc/http_client_curl.cpp
@@ -14,15 +14,15 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
-#include "stdpch.h"
-#include "http_client_curl.h"
+#include "stdmisc.h"
+#include
+#include
#include
-#include "nel/gui/curl_certificates.h"
+#include
using namespace NLMISC;
-using namespace NLNET;
using namespace std;
#ifdef DEBUG_NEW
@@ -31,6 +31,8 @@ using namespace std;
#define _Curl (CURL *)_CurlStruct
+namespace NLMISC
+{
// Ugly CURL callback
size_t CCurlHttpClient::writeDataFromCurl(void *buffer, size_t size, size_t nmemb, void *pHttpClient)
@@ -63,7 +65,7 @@ bool CCurlHttpClient::authenticate(const std::string &user, const std::string &p
return true;
}
-static const std::string CAFilename = "ssl_ca_cert.pem"; // this is the certificate "Thawte Server CA"
+static const std::string CAFilename = "cacert.pem"; // https://curl.haxx.se/docs/caextract.html
// ***************************************************************************
bool CCurlHttpClient::verifyServer(bool verify)
@@ -72,10 +74,10 @@ bool CCurlHttpClient::verifyServer(bool verify)
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, verify ? 1 : 0);
// specify custom CA certs
- NLGUI::CCurlCertificates::addCertificateFile(CAFilename);
+ CCurlCertificates::addCertificateFile(CAFilename);
// if supported, use custom SSL context function to load certificates
- NLGUI::CCurlCertificates::useCertificates(_Curl);
+ CCurlCertificates::useCertificates(_Curl);
return true;
}
@@ -88,6 +90,11 @@ bool CCurlHttpClient::sendRequest(const std::string& methodWB, const std::string
// Set URL
curl_easy_setopt(_Curl, CURLOPT_URL, url.c_str());
+ if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https
+ {
+ curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, 1L);
+ curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, 2L);
+ }
// Authentication
if (!_Auth.empty())
@@ -188,5 +195,6 @@ void CCurlHttpClient::disconnect()
CCurlHttpClient CurlHttpClient;
+}
-
+/* end of file */
diff --git a/code/nel/src/misc/path.cpp b/code/nel/src/misc/path.cpp
index 93a320715..e563ad810 100644
--- a/code/nel/src/misc/path.cpp
+++ b/code/nel/src/misc/path.cpp
@@ -900,9 +900,9 @@ void CFileContainer::getPathContent (const string &path, bool recurse, bool want
if (isdirectory(de))
{
// skip CVS, .svn and .hg directory
- if ((!showEverything) && (fn == "CVS" || fn == ".svn" || fn == ".hg"))
+ if ((!showEverything) && (fn == "CVS" || fn == ".svn" || fn == ".hg" || fn == ".git"))
{
- NL_DISPLAY_PATH("PATH: CPath::getPathContent(%s, %d, %d, %d): skip CVS, .svn and .hg directory", path.c_str(), recurse, wantDir, wantFile);
+ NL_DISPLAY_PATH("PATH: CPath::getPathContent(%s, %d, %d, %d): skip '%s' directory", path.c_str(), recurse, wantDir, wantFile, fn.c_str());
continue;
}
diff --git a/code/nel/src/sound/audio_mixer_user.cpp b/code/nel/src/sound/audio_mixer_user.cpp
index fdc6f6e11..c7fd988bd 100644
--- a/code/nel/src/sound/audio_mixer_user.cpp
+++ b/code/nel/src/sound/audio_mixer_user.cpp
@@ -974,20 +974,6 @@ void CAudioMixerUser::buildSampleBankList()
CPath::addSearchPath(sbp);
}
-/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file.
-std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir)
-{
- CGroupControllerRoot *tempRoot = NULL;
- if (!CGroupControllerRoot::isInitialized())
- tempRoot = new CGroupControllerRoot();
- std::string dir = CPath::standardizePath(packedSheetDir, true);
- CSoundBank *soundBank = new CSoundBank();
- soundBank->load(dir, true);
- delete soundBank;
- delete tempRoot;
- return dir + "sounds.packed_sheets";
-}
-
void CAudioMixerUser::setBackgroundFlagName(uint flagIndex, const std::string &flagName)
{
if (flagIndex < TBackgroundFlags::NB_BACKGROUND_FLAGS)
@@ -1127,6 +1113,37 @@ void CAudioMixerUser::initUserVar()
}
+/// Build the sound bank packed sheets file from georges sound sheet files with .sound extension in the search path, and return the path to the written file.
+std::string UAudioMixer::buildSoundBank(const std::string &packedSheetDir)
+{
+ CGroupControllerRoot *tempRoot = NULL;
+ if (!CGroupControllerRoot::isInitialized())
+ tempRoot = new CGroupControllerRoot();
+ std::string dir = CPath::standardizePath(packedSheetDir, true);
+ CSoundBank *soundBank = new CSoundBank();
+ soundBank->load(dir, true);
+ delete soundBank;
+ delete tempRoot;
+ return dir + "sounds.packed_sheets";
+}
+
+/// Build the cluster sound_group sheets.
+std::string UAudioMixer::buildClusteredSoundGroupSheets(const std::string &packedSheetDir)
+{
+ std::string dir = CPath::standardizePath(packedSheetDir, true);
+ CClusteredSound::buildSheets(dir);
+ return dir + "sound_groups.packed_sheets";
+}
+
+/// Build the user var binding sheets.
+std::string UAudioMixer::buildUserVarBindingSheets(const std::string &packedSheetDir)
+{
+ std::string dir = CPath::standardizePath(packedSheetDir, true);
+ std::map container;
+ ::loadForm("user_var_binding", dir + "user_var_binding.packed_sheets", container, true, false);
+ return dir + "user_var_binding.packed_sheets";
+}
+
// ******************************************************************
void CAudioMixerUser::CControledSources::serial(NLMISC::IStream &s)
diff --git a/code/nel/src/sound/clustered_sound.cpp b/code/nel/src/sound/clustered_sound.cpp
index 6e62f3176..52a9848da 100644
--- a/code/nel/src/sound/clustered_sound.cpp
+++ b/code/nel/src/sound/clustered_sound.cpp
@@ -160,10 +160,6 @@ public:
};
-// this structure is fill by the loadForm() function and will contain all you need
-std::map Container;
-
-
CClusteredSound::CClusteredSound()
: _Scene(0),
_RootCluster(0),
@@ -173,21 +169,27 @@ CClusteredSound::CClusteredSound()
}
+void CClusteredSound::buildSheets(const std::string &packedSheetPath)
+{
+ std::map container;
+ ::loadForm("sound_group", packedSheetPath + "sound_groups.packed_sheets", container, true, false);
+}
void CClusteredSound::init(NL3D::CScene *scene, float portalInterpolate, float maxEarDist, float minGain)
{
// load the sound_group sheets
- ::loadForm("sound_group", CAudioMixerUser::instance()->getPackedSheetPath()+"sound_groups.packed_sheets", Container, CAudioMixerUser::instance()->getPackedSheetUpdate(), false);
+ std::map container;
+ ::loadForm("sound_group", CAudioMixerUser::instance()->getPackedSheetPath()+"sound_groups.packed_sheets", container, CAudioMixerUser::instance()->getPackedSheetUpdate(), false);
// copy the container data into internal structure
- std::map::iterator first(Container.begin()), last(Container.end());
+ std::map::iterator first(container.begin()), last(container.end());
for (; first != last; ++first)
{
_SoundGroupToSound.insert(first->second._SoundGroupAssoc.begin(), first->second._SoundGroupAssoc.end());
}
// and clear the temporary Container
- Container.clear();
+ container.clear();
_Scene = scene;
diff --git a/code/nel/src/sound/complex_sound.cpp b/code/nel/src/sound/complex_sound.cpp
index 30b97347f..f33f4b2bf 100644
--- a/code/nel/src/sound/complex_sound.cpp
+++ b/code/nel/src/sound/complex_sound.cpp
@@ -171,6 +171,8 @@ CComplexSound::CComplexSound() :
_PatternMode(CComplexSound::MODE_UNDEFINED),
_TicksPerSeconds(1.0f),
_XFadeLength(3000), // default to 3000 sec.
+ _DoFadeIn(true),
+ _DoFadeOut(true),
_MaxDistValid(false),
_Duration(0),
_DurationValid(false)
@@ -314,7 +316,8 @@ void CComplexSound::importForm(const std::string& filename, NLGEORGES::UFormElm&
if (mode == "Chained" || mode == "Sparse")
{
// XFade length
- formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLength");
+ if (!formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLength"))
+ formRoot.getValueByName(_XFadeLength, ".SoundType.XFadeLenght"); // WORKAROUND: Typo in sound assets
// Fade in/out flag.
formRoot.getValueByName(_DoFadeIn, ".SoundType.DoFadeIn");
formRoot.getValueByName(_DoFadeOut, ".SoundType.DoFadeOut");
diff --git a/code/nel/src/sound/simple_sound.cpp b/code/nel/src/sound/simple_sound.cpp
index 393c9daeb..c4c320ea4 100644
--- a/code/nel/src/sound/simple_sound.cpp
+++ b/code/nel/src/sound/simple_sound.cpp
@@ -38,6 +38,7 @@ CSimpleSound::CSimpleSound() :
_Registered(false),
_Buffer(NULL),
// _Detailed(false), // not used?
+ _Alpha(1.0),
_NeedContext(false)
{
// init with NULL in case of unexecpted access
diff --git a/code/nel/src/sound/stream_file_sound.cpp b/code/nel/src/sound/stream_file_sound.cpp
index 83641cdf7..1eb40f4bb 100644
--- a/code/nel/src/sound/stream_file_sound.cpp
+++ b/code/nel/src/sound/stream_file_sound.cpp
@@ -41,7 +41,7 @@ using namespace std;
namespace NLSOUND {
-CStreamFileSound::CStreamFileSound()
+CStreamFileSound::CStreamFileSound() : m_Async(true)
{
}
diff --git a/code/nel/src/sound/stream_sound.cpp b/code/nel/src/sound/stream_sound.cpp
index 21b6de9d0..8933f8be7 100644
--- a/code/nel/src/sound/stream_sound.cpp
+++ b/code/nel/src/sound/stream_sound.cpp
@@ -18,19 +18,19 @@
#include "nel/sound/stream_sound.h"
#if NLSOUND_SHEET_VERSION_BUILT < 2
-# include "nel/sound/group_controller_root.h"
+#include "nel/sound/group_controller_root.h"
#endif
-namespace NLSOUND {
+namespace NLSOUND
+{
CStreamSound::CStreamSound()
+ : m_Alpha(1.0f)
{
-
}
CStreamSound::~CStreamSound()
{
-
}
void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm &root)
@@ -49,7 +49,7 @@ void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm &
CSound::importForm(filename, root);
// MaxDistance
- root.getValueByName(_MaxDist, ".SoundType.MaxDistance");
+ root.getValueByName(_MaxDist, ".SoundType.MaxDistance");
// MinDistance
root.getValueByName(_MinDist, ".SoundType.MinDistance");
@@ -60,7 +60,6 @@ void CStreamSound::importForm(const std::string &filename, NLGEORGES::UFormElm &
#if NLSOUND_SHEET_VERSION_BUILT < 2
_GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER);
#endif
-
}
void CStreamSound::serial(NLMISC::IStream &s)
@@ -71,9 +70,9 @@ void CStreamSound::serial(NLMISC::IStream &s)
s.serial(m_Alpha);
#if NLSOUND_SHEET_VERSION_BUILT < 2
- if (s.isReading()) _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER);
+ if (s.isReading())
+ _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_STREAM_GROUP_CONTROLLER);
#endif
-
}
} /* namespace NLSOUND */
diff --git a/code/nel/tools/3d/CMakeLists.txt b/code/nel/tools/3d/CMakeLists.txt
index 0b6f6540d..e6ba62e3b 100644
--- a/code/nel/tools/3d/CMakeLists.txt
+++ b/code/nel/tools/3d/CMakeLists.txt
@@ -32,6 +32,7 @@ IF(WITH_NEL_TOOLS)
zone_ig_lighter
zone_lighter
zone_welder
+ zone_elevation
shapes_exporter
shape2obj
zone_check_bind
diff --git a/code/nel/tools/3d/ig_elevation/CMakeLists.txt b/code/nel/tools/3d/ig_elevation/CMakeLists.txt
index 9c3e0fe26..6f330bc2e 100644
--- a/code/nel/tools/3d/ig_elevation/CMakeLists.txt
+++ b/code/nel/tools/3d/ig_elevation/CMakeLists.txt
@@ -5,7 +5,7 @@ SOURCE_GROUP("" FILES ${SRC})
ADD_EXECUTABLE(ig_elevation ${SRC})
TARGET_LINK_LIBRARIES(ig_elevation nelmisc nel3d nelligo)
-NL_DEFAULT_PROPS(ig_elevation "NeL, Tools, 3D: ig_elevation")
+NL_DEFAULT_PROPS(ig_elevation "NeL, Tools, 3D: IG Elevation")
NL_ADD_RUNTIME_FLAGS(ig_elevation)
INSTALL(TARGETS ig_elevation RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d)
diff --git a/code/nel/tools/3d/ig_elevation/main.cpp b/code/nel/tools/3d/ig_elevation/main.cpp
index a3f7dba5f..122957eb0 100644
--- a/code/nel/tools/3d/ig_elevation/main.cpp
+++ b/code/nel/tools/3d/ig_elevation/main.cpp
@@ -259,13 +259,13 @@ int main(int nNbArg, char**ppArgs)
printf ("ZFactor2 = 0.5;\n");
printf ("LandFile = \"w:/matis.land\";\n");
- return -1;
+ return EXIT_FAILURE;
}
SExportOptions options;
if (!options.load(ppArgs[1]))
{
- return -1;
+ return EXIT_FAILURE;
}
// Get all ig files in the input directory and elevate to the z of the double heightmap
@@ -358,7 +358,7 @@ int main(int nNbArg, char**ppArgs)
for (uint32 i = 0; i < vAllFiles.size(); ++i)
{
- CInstanceGroup *pIG = LoadInstanceGroup (CPath::standardizePath(options.InputIGDir) + vAllFiles[i]);
+ CInstanceGroup *pIG = LoadInstanceGroup (vAllFiles[i]);
if (pIG != NULL)
{
@@ -430,11 +430,13 @@ int main(int nNbArg, char**ppArgs)
pIGout->build (vGlobalPos, IA, Clusters, Portals, PLN);
pIGout->enableRealTimeSunContribution(realTimeSunContribution);
- SaveInstanceGroup (CPath::standardizePath(options.OutputIGDir) + vAllFiles[i], pIGout);
+ std::string outFilePath = CPath::standardizePath(options.OutputIGDir, true) + CFile::getFilename(vAllFiles[i]);
+ nldebug("Writing %s...", outFilePath.c_str());
+ SaveInstanceGroup(outFilePath, pIGout);
delete pIG;
}
}
- return 1;
+ return EXIT_SUCCESS;
}
diff --git a/code/nel/tools/3d/zone_elevation/CMakeLists.txt b/code/nel/tools/3d/zone_elevation/CMakeLists.txt
new file mode 100644
index 000000000..20d715e13
--- /dev/null
+++ b/code/nel/tools/3d/zone_elevation/CMakeLists.txt
@@ -0,0 +1,11 @@
+FILE(GLOB SRC *.cpp *.h *.rc)
+
+SOURCE_GROUP("" FILES ${SRC})
+
+ADD_EXECUTABLE(zone_elevation ${SRC})
+
+TARGET_LINK_LIBRARIES(zone_elevation nel3d nelmisc nelligo)
+NL_DEFAULT_PROPS(zone_elevation "NeL, Tools, 3D: Zone Elevation")
+NL_ADD_RUNTIME_FLAGS(zone_elevation)
+
+INSTALL(TARGETS zone_elevation RUNTIME DESTINATION ${NL_BIN_PREFIX} COMPONENT tools3d)
diff --git a/code/nel/tools/3d/zone_elevation/blue_pill.ico b/code/nel/tools/3d/zone_elevation/blue_pill.ico
new file mode 100644
index 000000000..269907ec3
Binary files /dev/null and b/code/nel/tools/3d/zone_elevation/blue_pill.ico differ
diff --git a/code/nel/tools/3d/zone_elevation/main.rc b/code/nel/tools/3d/zone_elevation/main.rc
new file mode 100644
index 000000000..05cf7c976
--- /dev/null
+++ b/code/nel/tools/3d/zone_elevation/main.rc
@@ -0,0 +1,42 @@
+#include
+#include "config.h"
+
+IDI_MAIN_ICON ICON DISCARDABLE "blue_pill.ico"
+
+#ifdef _DEBUG
+#define NL_FILEEXT "_d"
+#else
+#define NL_FILEEXT ""
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION NL_VERSION_RC
+ PRODUCTVERSION NL_VERSION_RC
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "CompanyName", AUTHOR
+ VALUE "FileDescription", "NeL Zone Heightmap"
+ VALUE "FileVersion", NL_VERSION
+ VALUE "LegalCopyright", COPYRIGHT
+ VALUE "OriginalFilename", "zone_heightmap" NL_FILEEXT ".exe"
+ VALUE "ProductName", "NeL Tools"
+ VALUE "ProductVersion", NL_PRODUCT_VERSION
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x9, 1200
+ END
+END
diff --git a/code/nel/tools/3d/zone_elevation/zone_elevation.cpp b/code/nel/tools/3d/zone_elevation/zone_elevation.cpp
new file mode 100644
index 000000000..3287a68ea
--- /dev/null
+++ b/code/nel/tools/3d/zone_elevation/zone_elevation.cpp
@@ -0,0 +1,396 @@
+// NeL - MMORPG Framework
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero 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 Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#include "../zone_lib/zone_utility.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+//#include
+#include
+//#include
+//#include
+//#include
+//#include
+#include
+#include
+#include
+
+using namespace NL3D;
+using namespace NLMISC;
+using namespace NLLIGO;
+using namespace std;
+
+namespace /* anonymous */
+{
+
+sint32 s_ZoneMinX, s_ZoneMinY, s_ZoneMaxX, s_ZoneMaxY;
+float s_CellSize = 160.0f;
+
+float s_ZFactor = 1.0f;
+NLMISC::CBitmap *s_HeightMap;
+
+float s_ZFactor2 = 1.0f;
+NLMISC::CBitmap *s_HeightMap2;
+
+std::string s_InputZone; // UTF-8
+std::string s_OutputZone; // UTF-8
+
+CZoneRegion s_Land;
+
+bool loadLand(const string &filename)
+{
+ try
+ {
+ CIFile fileIn;
+ if (fileIn.open (filename))
+ {
+ CIXml xml(true);
+ nlverify(xml.init(fileIn));
+ s_Land.serial(xml);
+ }
+ else
+ {
+ nlwarning("Can't open the land file: %s", filename.c_str());
+ return false;
+ }
+ }
+ catch (const Exception& e)
+ {
+ nlwarning("Error in land file: %s", e.what());
+ return true;
+ }
+ return true;
+}
+
+bool getXYFromZoneName(sint32 &x, sint32 &y, const string &zoneName)
+{
+ string xStr, yStr;
+ uint32 i = 0;
+ while (zoneName[i] != '_')
+ {
+ yStr += zoneName[i];
+ ++i;
+ if (i == zoneName.size())
+ goto Fail;
+ }
+ if (!NLMISC::fromString(yStr, y))
+ goto Fail;
+ y = -y;
+ ++i;
+ while (i < zoneName.size())
+ {
+ xStr += zoneName[i];
+ ++i;
+ }
+ if (xStr.size() != 2)
+ goto Fail;
+ xStr = NLMISC::toUpper(xStr);
+ x = ((xStr[0] - 'A') * 26 + (xStr[1] - 'A'));
+ return true;
+Fail:
+ x = -1;
+ y = -1;
+ return false;
+}
+
+float getHeight(float x, float y)
+{
+ float deltaZ = 0.0f, deltaZ2 = 0.0f;
+ CRGBAF color;
+ sint32 sizeX = s_ZoneMaxX - s_ZoneMinX + 1;
+ sint32 sizeY = s_ZoneMaxY - s_ZoneMinY + 1;
+
+ clamp(x, s_CellSize * s_ZoneMinX, s_CellSize * (s_ZoneMaxX + 1));
+ clamp(y, s_CellSize * s_ZoneMinY, s_CellSize * (s_ZoneMaxY + 1));
+
+ if (s_HeightMap != NULL)
+ {
+ float xc = (x - s_CellSize * s_ZoneMinX) / (s_CellSize * sizeX);
+ float yc = 1.0f - ((y - s_CellSize * s_ZoneMinY) / (s_CellSize * sizeY));
+ color = s_HeightMap->getColor(xc, yc);
+ color *= 255;
+ deltaZ = color.A;
+ deltaZ = deltaZ - 127.0f; // Median intensity is 127
+ deltaZ *= s_ZFactor;
+ }
+
+ if (s_HeightMap2 != NULL)
+ {
+ float xc = (x - s_CellSize * s_ZoneMinX) / (s_CellSize * sizeX);
+ float yc = 1.0f - ((y - s_CellSize * s_ZoneMinY) / (s_CellSize * sizeY));
+ color = s_HeightMap2->getColor(xc, yc);
+ color *= 255;
+ deltaZ2 = color.A;
+ deltaZ2 = deltaZ2 - 127.0f; // Median intensity is 127
+ deltaZ2 *= s_ZFactor2;
+ }
+
+ return (deltaZ + deltaZ2);
+}
+
+NLMISC::CVector getHeightNormal(float x, float y)
+{
+ sint32 SizeX = s_ZoneMaxX - s_ZoneMinX + 1;
+ sint32 SizeY = s_ZoneMaxY - s_ZoneMinY + 1;
+ sint32 bmpW, bmpH;
+
+ // get width/height of the bitmap
+ if (s_HeightMap != NULL)
+ {
+ bmpW = s_HeightMap->getWidth();
+ bmpH = s_HeightMap->getHeight();
+ }
+ else if (s_HeightMap2 != NULL)
+ {
+ bmpW = s_HeightMap2->getWidth();
+ bmpH = s_HeightMap2->getHeight();
+ }
+ else
+ {
+ // no heightmap: unmodified normal
+ return CVector::K;
+ }
+
+ // compute a good delta to compute tangents of the heightmap: 1/10 of a pixel, avoiding precision problem.
+ float dx = ((s_CellSize * SizeX) / bmpW) / 10; // eg: 160m/20pixels/10= 0.8
+ float dy = ((s_CellSize * SizeY) / bmpH) / 10;
+
+ // compute tangent around the position.
+ float hc = getHeight(x, y);
+ float hx = getHeight(x + dx, y);
+ float hy = getHeight(x, y + dy);
+ CVector ds(dx, 0, hx - hc);
+ CVector dt(0, dy, hy - hc);
+
+ // compute the heightmap normal with the tangents
+ return (ds ^ dt).normed();
+}
+
+void applyZoneHeightmap()
+{
+ // Load zone
+ CIFile zoneFile(s_InputZone);
+ CZone zone;
+ zone.serial(zoneFile);
+ zoneFile.close();
+
+ // Retrieve patches and vertices
+ uint16 zoneId = zone.getZoneId();
+ std::vector zonePatches;
+ std::vector zoneBorderVertices;
+ zone.retrieve(zonePatches, zoneBorderVertices);
+
+ // Apply the Heighmap to all vertices/tangents/interiors (see Land Export tool.)
+ for (size_t i = 0; i < zonePatches.size(); ++i)
+ {
+ CPatchInfo &rPI = zonePatches[i];
+
+ // Elevate the vertices.
+ CVector verticesBeforeHeightMap[4];
+ for (size_t j = 0; j < 4; ++j)
+ {
+ verticesBeforeHeightMap[j] = rPI.Patch.Vertices[j];
+ float height = getHeight(rPI.Patch.Vertices[j].x, rPI.Patch.Vertices[j].y);
+ rPI.Patch.Vertices[j].z += height;
+ }
+
+ // Interior and tangent are rotated to follow the heightmap normal, avoiding the "Stair Effect".
+ // Compute the matrix to apply to interiors and tangents.
+ CMatrix tgMatrix[4];
+ for (size_t j = 0; j < 4; ++j)
+ {
+ // compute the normal of the heightmap.
+ CVector hmapNormal = getHeightNormal(rPI.Patch.Vertices[j].x, rPI.Patch.Vertices[j].y);
+
+ // Compute the rotation which transforms the original normal: (0,0,1), to this normal.
+ CAngleAxis angleAxis;
+ angleAxis.Axis = CVector::K ^ hmapNormal;
+ angleAxis.Angle = (float)asin(angleAxis.Axis.norm());
+ angleAxis.Axis.normalize();
+
+ // build the matrix which transform the old tgt/interior to his newValue:
+ // newVertexPos + rotate * (oldTgPos - oldVertexPos)
+ tgMatrix[j].identity();
+ tgMatrix[j].translate(rPI.Patch.Vertices[j]);
+ tgMatrix[j].setRot(CQuat(angleAxis));
+ tgMatrix[j].translate(-verticesBeforeHeightMap[j]);
+ }
+
+ // For all interior.
+ for (size_t j = 0; j < 4; ++j)
+ rPI.Patch.Interiors[j] = tgMatrix[j] * rPI.Patch.Interiors[j];
+
+ // when j == 7 or 0 use vertex 0 for delta Z to ensure continuity of normals
+ // when j == 1 or 2 use vertex 1
+ // when j == 3 or 4 use vertex 2
+ // when j == 5 or 6 use vertex 3
+ for (size_t j = 0; j < 8; ++j)
+ {
+ // get the correct vertex
+ uint vertexId = ((j + 1) / 2) % 4;
+ // apply the tgMatrix to the tangent
+ rPI.Patch.Tangents[j] = tgMatrix[vertexId] * rPI.Patch.Tangents[j];
+ }
+ }
+
+ // Save zone
+ zone.build(zoneId, zonePatches, zoneBorderVertices);
+ COFile centerSave(s_OutputZone);
+ nldebug("Writing file %s", s_OutputZone.c_str());
+ zone.serial(centerSave);
+}
+
+} /* anonymous namespace */
+
+int main(int argc, char **argv)
+{
+ NLMISC::CApplicationContext myApplicationContext;
+
+ NLMISC::CCmdArgs args;
+
+ args.addAdditionalArg("zonenhw", "Input zone"); // .zonenhw
+ args.addAdditionalArg("zonew", "Output zone"); // .zonew
+ args.addArg("", "land", "land", "Ligo land file (either specify this or the boundaries)");
+ args.addArg("", "zonemin", "zone", "Zone boundary");
+ args.addArg("", "zonemax", "zone", "Zone boundary");
+ args.addArg("", "cellsize", "meters", "Zone cell size");
+ args.addArg("", "zfactor", "factor", "Factor for heightmap");
+ args.addArg("", "heightmap", "bitmap", "Heightmap");
+ args.addArg("", "zfactor2", "factor", "Factor for second heightmap");
+ args.addArg("", "heightmap2", "bitmap", "Second heightmap");
+ // TODO: args.addArg("", "batch", "", "Process all zones in input (specify input as C:/folder/.zonenhw)");
+
+ if (!args.parse(argc, argv))
+ {
+ return EXIT_FAILURE;
+ }
+
+ s_InputZone = args.getAdditionalArg("zonenhw")[0];
+ s_OutputZone = args.getAdditionalArg("zonew")[0];
+
+ if (args.haveLongArg("zonemin") && args.haveLongArg("zonemax"))
+ {
+ sint32 zoneMinX, zoneMinY;
+ sint32 zoneMaxX, zoneMaxY;
+ if (!getXYFromZoneName(zoneMinX, zoneMinY, args.getLongArg("zonemin")[0])
+ || !getXYFromZoneName(zoneMaxX, zoneMaxY, args.getLongArg("zonemax")[0]))
+ {
+ goto Fail;
+ }
+ s_ZoneMinX = min(zoneMinX, zoneMaxX);
+ s_ZoneMaxX = max(zoneMinX, zoneMaxX);
+ s_ZoneMinY = min(zoneMinY, zoneMaxY);
+ s_ZoneMaxY = max(zoneMinY, zoneMaxY);
+ }
+ else if (args.haveLongArg("land"))
+ {
+ if (!loadLand(args.getLongArg("land")[0]))
+ goto Fail;
+ s_ZoneMinX = s_Land.getMinX();
+ s_ZoneMaxX = s_Land.getMaxX();
+ s_ZoneMinY = s_Land.getMinY();
+ s_ZoneMaxY = s_Land.getMaxY();
+ }
+ else
+ {
+ nlwarning("Must have either both 'zonemin' and 'zonemax', or 'land' specified");
+ goto Fail;
+ }
+
+ if (args.haveLongArg("heightmap"))
+ {
+ nldebug("Loading height map");
+ s_HeightMap = new CBitmap();
+ try
+ {
+ CIFile inFile;
+ if (inFile.open(args.getLongArg("heightmap")[0]))
+ {
+ s_HeightMap->load(inFile);
+ }
+ else
+ {
+ nldebug("Cant load height map: %s", args.getLongArg("heightmap")[0].c_str());
+ delete s_HeightMap;
+ s_HeightMap = NULL;
+ }
+ }
+ catch (const Exception &)
+ {
+ nldebug("Cant load height map: %s", args.getLongArg("heightmap")[0].c_str());
+ delete s_HeightMap;
+ s_HeightMap = NULL;
+ }
+ }
+
+ if (args.haveLongArg("heightmap2"))
+ {
+ nldebug("Loading height map");
+ s_HeightMap2 = new CBitmap();
+ try
+ {
+ CIFile inFile;
+ if (inFile.open(args.getLongArg("heightmap2")[0]))
+ {
+ s_HeightMap2->load(inFile);
+ }
+ else
+ {
+ nldebug("Cant load height map: %s", args.getLongArg("heightmap2")[0].c_str());
+ delete s_HeightMap2;
+ s_HeightMap2 = NULL;
+ }
+ }
+ catch (const Exception &)
+ {
+ nldebug("Cant load height map: %s", args.getLongArg("heightmap2")[0].c_str());
+ delete s_HeightMap2;
+ s_HeightMap2 = NULL;
+ }
+ }
+
+ if (args.haveLongArg("zfactor"))
+ {
+ if (!NLMISC::fromString(args.getLongArg("zfactor")[0], s_ZFactor))
+ goto Fail;
+ }
+
+ if (args.haveLongArg("zfactor2"))
+ {
+ if (!NLMISC::fromString(args.getLongArg("zfactor2")[0], s_ZFactor2))
+ goto Fail;
+ }
+
+ if (args.haveLongArg("cellsize"))
+ {
+ if (!NLMISC::fromString(args.getLongArg("cellsize")[0], s_CellSize))
+ goto Fail;
+ }
+
+ applyZoneHeightmap();
+
+ return EXIT_SUCCESS;
+Fail:
+ args.displayHelp();
+ delete s_HeightMap;
+ delete s_HeightMap2;
+ return EXIT_FAILURE;
+}
diff --git a/code/nel/tools/build_gamedata/0_setup.py b/code/nel/tools/build_gamedata/0_setup.py
index 479121428..00d19cbe6 100755
--- a/code/nel/tools/build_gamedata/0_setup.py
+++ b/code/nel/tools/build_gamedata/0_setup.py
@@ -88,13 +88,9 @@ if not args.noconf:
except NameError:
SoundDirectory = "V:"
try:
- SoundSheetsDirectory
+ SoundDfnDirectory
except NameError:
- SoundSheetsDirectory = "V:"
- try:
- SoundSheetsDfnDirectory
- except NameError:
- SoundSheetsDfnDirectory = "V:/DFN"
+ SoundDfnDirectory = "V:/DFN"
try:
ExportBuildDirectory
except NameError:
@@ -191,6 +187,18 @@ if not args.noconf:
PatchmanBridgeServerDirectory
except NameError:
PatchmanBridgeServerDirectory = "T:/bridge_server"
+ try:
+ SignToolExecutable
+ except NameError:
+ SignToolExecutable = "C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bin/signtool.exe"
+ try:
+ SignToolSha1
+ except NameError:
+ SignToolSha1 = ""
+ try:
+ SignToolTimestamp
+ except NameError:
+ SignToolTimestamp = "http://timestamp.comodoca.com/authenticode"
try:
MaxAvailable
except NameError:
@@ -231,8 +239,7 @@ if not args.noconf:
WorkspaceDirectory = askVar(log, "[IN] Workspace Directory", WorkspaceDirectory).replace("\\", "/")
DatabaseDirectory = askVar(log, "[IN] Database Directory", DatabaseDirectory).replace("\\", "/")
SoundDirectory = askVar(log, "[IN] Sound Directory", SoundDirectory).replace("\\", "/")
- SoundSheetsDirectory = askVar(log, "[IN] Sound Sheets Directory", SoundSheetsDirectory).replace("\\", "/")
- SoundSheetsDfnDirectory = askVar(log, "[IN] Sound Sheets DFN Directory", SoundSheetsDfnDirectory).replace("\\", "/")
+ SoundDfnDirectory = askVar(log, "[IN] Sound DFN Directory", SoundDfnDirectory).replace("\\", "/")
ExportBuildDirectory = askVar(log, "[OUT] Export Build Directory", ExportBuildDirectory).replace("\\", "/")
InstallDirectory = askVar(log, "[OUT] Install Directory", InstallDirectory).replace("\\", "/")
ClientDevDirectory = askVar(log, "[OUT] Client Dev Directory", ClientDevDirectory).replace("\\", "/")
@@ -263,6 +270,9 @@ if not args.noconf:
PatchmanCfgAdminDirectory = askVar(log, "[IN] Patchman Cfg Admin Directory", PatchmanCfgAdminDirectory).replace("\\", "/")
PatchmanCfgDefaultDirectory = askVar(log, "[IN] Patchman Cfg Default Directory", PatchmanCfgDefaultDirectory).replace("\\", "/")
PatchmanBridgeServerDirectory = askVar(log, "[OUT] Patchman Bridge Server Patch Directory", PatchmanBridgeServerDirectory).replace("\\", "/")
+ SignToolExecutable = askVar(log, "Sign Tool Executable", SignToolExecutable).replace("\\", "/")
+ SignToolSha1 = askVar(log, "Sign Tool Signature SHA1", SignToolSha1)
+ SignToolTimestamp = askVar(log, "Sign Tool Timestamp Authority", SignToolTimestamp)
MaxAvailable = int(askVar(log, "3dsMax Available", str(MaxAvailable)))
if MaxAvailable:
MaxDirectory = askVar(log, "3dsMax Directory", MaxDirectory).replace("\\", "/")
@@ -317,8 +327,7 @@ if not args.noconf:
sf.write("# Data build directories\n")
sf.write("DatabaseDirectory = \"" + str(DatabaseDirectory) + "\"\n")
sf.write("SoundDirectory = \"" + str(SoundDirectory) + "\"\n")
- sf.write("SoundSheetsDirectory = \"" + str(SoundSheetsDirectory) + "\"\n")
- sf.write("SoundSheetsDfnDirectory = \"" + str(SoundSheetsDfnDirectory) + "\"\n")
+ sf.write("SoundDfnDirectory = \"" + str(SoundDfnDirectory) + "\"\n")
sf.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory) + "\"\n")
sf.write("\n")
sf.write("# Install directories\n")
@@ -352,6 +361,11 @@ if not args.noconf:
sf.write("PatchmanCfgDefaultDirectory = \"" + str(PatchmanCfgDefaultDirectory) + "\"\n")
sf.write("PatchmanBridgeServerDirectory = \"" + str(PatchmanBridgeServerDirectory) + "\"\n")
sf.write("\n")
+ sf.write("# Sign tool\n")
+ sf.write("SignToolExecutable = \"" + str(SignToolExecutable) + "\"\n")
+ sf.write("SignToolSha1 = \"" + str(SignToolSha1) + "\"\n")
+ sf.write("SignToolTimestamp = \"" + str(SignToolTimestamp) + "\"\n")
+ sf.write("\n")
sf.write("# 3dsMax directives\n")
sf.write("MaxAvailable = " + str(MaxAvailable) + "\n")
sf.write("MaxDirectory = \"" + str(MaxDirectory) + "\"\n")
@@ -420,6 +434,7 @@ if not args.noverify:
findTool(log, ToolDirectories, BuildFarbankTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix)
findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix)
+ findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix)
findTool(log, ToolDirectories, BuildRbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildIndoorRbankTool, ToolSuffix)
findTool(log, ToolDirectories, BuildIgBoxesTool, ToolSuffix)
diff --git a/code/nel/tools/build_gamedata/configuration/scripts.py b/code/nel/tools/build_gamedata/configuration/scripts.py
index 9a815a2b9..5bbed497f 100755
--- a/code/nel/tools/build_gamedata/configuration/scripts.py
+++ b/code/nel/tools/build_gamedata/configuration/scripts.py
@@ -541,9 +541,10 @@ def needUpdateDirNoSubdirLogExtMultidir(log, all_dir_base, all_dir_source, dir_s
def findFileMultiDir(log, dirs_where, file_name):
try:
for dir in dirs_where:
- file = findFile(log, dir, file_name)
- if file != "":
- return file
+ if dir != "":
+ file = findFile(log, dir, file_name)
+ if file != "":
+ return file
except Exception, e:
printLog(log, "EXCEPTION " + str(e))
printLog(log, "FILE NOT FOUND " + file_name)
@@ -552,10 +553,11 @@ def findFileMultiDir(log, dirs_where, file_name):
def findTool(log, dirs_where, file_name, suffix):
try:
for dir in dirs_where:
- tool = findFile(log, dir, file_name + suffix)
- if tool != "":
- printLog(log, "TOOL " + tool)
- return tool
+ if dir != "":
+ tool = findFile(log, dir, file_name + suffix)
+ if tool != "":
+ printLog(log, "TOOL " + tool)
+ return tool
except Exception, e:
printLog(log, "EXCEPTION " + str(e))
printLog(log, "TOOL NOT FOUND " + file_name + suffix)
diff --git a/code/nel/tools/build_gamedata/configuration/tools.py b/code/nel/tools/build_gamedata/configuration/tools.py
index b9a74820c..ebb1d07da 100755
--- a/code/nel/tools/build_gamedata/configuration/tools.py
+++ b/code/nel/tools/build_gamedata/configuration/tools.py
@@ -60,6 +60,7 @@ BuildSmallbankTool = "build_smallbank"
BuildFarbankTool = "build_far_bank"
ZoneDependenciesTool = "zone_dependencies"
ZoneWelderTool = "zone_welder"
+ZoneElevationTool = "zone_elevation"
BuildRbankTool = "build_rbank"
BuildIndoorRbankTool = "build_indoor_rbank"
BuildIgBoxesTool = "build_ig_boxes"
diff --git a/code/nel/tools/build_gamedata/executables_dev.bat b/code/nel/tools/build_gamedata/executables_dev.bat
index 2007016c4..bbca70ab7 100644
--- a/code/nel/tools/build_gamedata/executables_dev.bat
+++ b/code/nel/tools/build_gamedata/executables_dev.bat
@@ -1,3 +1,9 @@
+title Ryzom Core: 0_setup.py (EXECUTABLES)
+0_setup.py --noconf -ipj common/gamedev common/exedll common/cfg common/data_common
+title Ryzom Core: 1_export.py (EXECUTABLES)
+1_export.py -ipj common/gamedev common/exedll common/cfg common/data_common
+title Ryzom Core: 2_build.py (EXECUTABLES)
+2_build.py -ipj common/gamedev common/exedll common/cfg common/data_common
title Ryzom Core: 3_install.py (EXECUTABLES)
3_install.py -ipj common/gamedev common/exedll common/cfg common/data_common
title Ryzom Core: b1_client_dev.py
diff --git a/code/nel/tools/build_gamedata/processes/ig/2_build.py b/code/nel/tools/build_gamedata/processes/ig/2_build.py
index afb84c312..c2ab57059 100755
--- a/code/nel/tools/build_gamedata/processes/ig/2_build.py
+++ b/code/nel/tools/build_gamedata/processes/ig/2_build.py
@@ -54,6 +54,8 @@ mkPath(log, configDir)
def igElevation(inputIgDir, outputIgDir):
printLog(log, ">>> IG Elevation <<<")
+ mkPath(log, inputIgDir)
+ mkPath(log, outputIgDir)
needUpdateIg = needUpdateDirByTagLog(log, inputIgDir, ".ig", outputIgDir, ".ig")
if needUpdateIg:
printLog(log, "DETECT UPDATE IG->Elevated")
@@ -100,7 +102,7 @@ def igElevation(inputIgDir, outputIgDir):
os.remove(configFile)
# Copy remaining IG files
- copyFilesLogless(log, inputIgDir, outputIgDir)
+ #BUG:copyFilesLogless(log, inputIgDir, outputIgDir)
else:
printLog(log, "DETECT DECIDE SKIP")
printLog(log, "SKIP *")
diff --git a/code/nel/tools/build_gamedata/processes/properties/0_setup.py b/code/nel/tools/build_gamedata/processes/properties/0_setup.py
index 1a0889caf..b6114d5b2 100755
--- a/code/nel/tools/build_gamedata/processes/properties/0_setup.py
+++ b/code/nel/tools/build_gamedata/processes/properties/0_setup.py
@@ -81,6 +81,10 @@ for line in ps:
ContinentPath
except NameError:
ContinentPath = "_invalid"
+ try:
+ ContinentSheet
+ except NameError:
+ ContinentSheet = ContinentName
try:
BankTileBankName
except NameError:
@@ -113,6 +117,7 @@ for line in ps:
newline = newline.replace("%ContinentPath%", ContinentPath)
newline = newline.replace("%CommonName%", CommonName)
newline = newline.replace("%CommonPath%", CommonPath)
+ newline = newline.replace("%ContinentSheet%", ContinentSheet)
newline = newline.replace("%BankTileBankName%", BankTileBankName)
newline = newline.replace("%IgLandBuildDirectory%", IgLandBuildDirectory)
newline = newline.replace("%IgOtherBuildDirectory%", IgOtherBuildDirectory)
diff --git a/code/nel/tools/build_gamedata/processes/sign/0_setup.py b/code/nel/tools/build_gamedata/processes/sign/0_setup.py
new file mode 100644
index 000000000..418fcb15e
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sign/0_setup.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+#
+# \file 0_setup.py
+# \brief setup sign
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Setup sign
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Setup sign")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+# Setup source directories
+printLog(log, ">>> Setup source directories <<<")
+
+# Setup build directories
+printLog(log, ">>> Setup export directories <<<")
+mkPath(log, ExportBuildDirectory + "/" + UnsignedExeDllDirectory)
+
+# Setup build directories
+printLog(log, ">>> Setup build directories <<<")
+mkPath(log, ExportBuildDirectory + "/" + SignedExeDllDirectory)
+
+# Setup client directories
+printLog(log, ">>> Setup client directories <<<")
+mkPath(log, InstallDirectory + "/" + SignInstallDirectory)
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sign/1_export.py b/code/nel/tools/build_gamedata/processes/sign/1_export.py
new file mode 100644
index 000000000..352860bda
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sign/1_export.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+#
+# \file 1_export.py
+# \brief Export sign
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Export sign
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Export sign")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+mkPath(log, ExportBuildDirectory + "/" + UnsignedExeDllDirectory)
+for file in SignExeDllFiles:
+ printLog(log, str(WindowsExeDllCfgDirectories))
+ printLog(log, file)
+ filePath = findFileMultiDir(log, WindowsExeDllCfgDirectories, file)
+ if (filePath != ""):
+ copyFileIfNeeded(log, filePath, ExportBuildDirectory + "/" + UnsignedExeDllDirectory + "/" + os.path.basename(file))
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sign/2_build.py b/code/nel/tools/build_gamedata/processes/sign/2_build.py
new file mode 100644
index 000000000..c08049538
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sign/2_build.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+#
+# \file 2_build.py
+# \brief Build sign
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Build sign
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Build sign")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+if SignToolSha1 != "":
+ unsignedDirectory = ExportBuildDirectory + "/" + UnsignedExeDllDirectory
+ signedDirectory = ExportBuildDirectory + "/" + SignedExeDllDirectory
+ mkPath(log, unsignedDirectory)
+ mkPath(log, signedDirectory)
+ unsignedFiles = os.listdir(unsignedDirectory)
+ for fileName in unsignedFiles:
+ if (fileName != ".svn" and fileName != ".." and fileName != "." and fileName != "*.*"):
+ if needUpdateLogRemoveDest(log, unsignedDirectory + "/" + fileName, signedDirectory + "/" + fileName):
+ shutil.copy(unsignedDirectory + "/" + fileName, signedDirectory + "/" + fileName)
+ subprocess.call([ SignToolExecutable, "sign", "/sha1", SignToolSha1, "/t", SignToolTimestamp, signedDirectory + "/" + fileName ])
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sign/3_install.py b/code/nel/tools/build_gamedata/processes/sign/3_install.py
new file mode 100644
index 000000000..b537da92d
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sign/3_install.py
@@ -0,0 +1,58 @@
+#!/usr/bin/python
+#
+# \file 3_install.py
+# \brief Install sign
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Install sign
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Install sign")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+srcDir = ExportBuildDirectory + "/" + SignedExeDllDirectory
+if SignToolSha1 == "":
+ srcDir = ExportBuildDirectory + "/" + UnsignedExeDllDirectory
+mkPath(log, srcDir)
+destDir = InstallDirectory + "/" + SignInstallDirectory
+mkPath(log, destDir)
+copyFilesNoTreeIfNeeded(log, srcDir, destDir)
+
+printLog(log, "")
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sound/0_setup.py b/code/nel/tools/build_gamedata/processes/sound/0_setup.py
new file mode 100644
index 000000000..7ce690d5d
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sound/0_setup.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+#
+# \file 0_setup.py
+# \brief setup sound
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Setup sound
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Setup sound")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+# Setup source directories
+printLog(log, ">>> Setup source directories <<<")
+mkPath(log, SoundDirectory)
+mkPath(log, SoundDfnDirectory)
+
+# Setup export directories
+printLog(log, ">>> Setup export directories <<<")
+mkPath(log, ExportBuildDirectory + "/" + SoundExportDirectory)
+
+# Setup build directories
+printLog(log, ">>> Setup build directories <<<")
+
+# Setup client directories
+printLog(log, ">>> Setup client directories <<<")
+mkPath(log, InstallDirectory + "/" + SoundInstallDirectory)
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sound/1_export.py b/code/nel/tools/build_gamedata/processes/sound/1_export.py
new file mode 100644
index 000000000..066b2c256
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sound/1_export.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+#
+# \file 1_export.py
+# \brief Export sound
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Export sound
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Export sound")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+# For each sound directory
+printLog(log, ">>> Export sound <<<")
+mkPath(log, ExportBuildDirectory + "/" + SoundExportDirectory)
+mkPath(log, SoundDirectory)
+mkPath(log, SoundDfnDirectory)
+copyFilesExtNoTreeIfNeeded(log, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".dfn")
+copyFilesExtNoTreeIfNeeded(log, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".typ")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".mixer_config")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".mp3")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".ogg")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".flac")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".primitive")
+copyFilesExtNoTreeIfNeeded(log, SoundDirectory, ExportBuildDirectory + "/" + SoundExportDirectory, ".sound_anim")
+
+printLog(log, "")
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sound/2_build.py b/code/nel/tools/build_gamedata/processes/sound/2_build.py
new file mode 100644
index 000000000..048f8f456
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sound/2_build.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+#
+# \file 2_build.py
+# \brief Build sound
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Build sound
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Build sound")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/sound/3_install.py b/code/nel/tools/build_gamedata/processes/sound/3_install.py
new file mode 100644
index 000000000..b8078609f
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/sound/3_install.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+#
+# \file 3_install.py
+# \brief Install sound
+# \date 2010-05-24 13:42GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Install sound
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Install sound")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+printLog(log, ">>> Install sound <<<")
+srcDir = ExportBuildDirectory + "/" + SoundExportDirectory
+mkPath(log, srcDir)
+destDir = InstallDirectory + "/" + SoundInstallDirectory
+mkPath(log, destDir)
+copyFilesNoTreeIfNeeded(log, srcDir, destDir)
+
+printLog(log, "")
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py b/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py
new file mode 100644
index 000000000..368011d1a
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/soundbank/0_setup.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+#
+# \file 0_setup.py
+# \brief Setup soundbank
+# \date 2009-06-03 10:47GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Setup soundbank
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Setup soundbank")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+# Setup source directories
+printLog(log, ">>> Setup source directories <<<")
+mkPath(log, SoundDirectory)
+mkPath(log, SoundDfnDirectory)
+
+# Setup export directories
+printLog(log, ">>> Setup export directories <<<")
+
+# Setup build directories
+printLog(log, ">>> Setup build directories <<<")
+mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory)
+
+# Setup client directories
+printLog(log, ">>> Setup client directories <<<")
+mkPath(log, InstallDirectory + "/" + SoundInstallDirectory)
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/soundbank/1_export.py b/code/nel/tools/build_gamedata/processes/soundbank/1_export.py
new file mode 100644
index 000000000..ffecbb4d3
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/soundbank/1_export.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+#
+# \file 1_export.py
+# \brief Export soundbank
+# \date 2009-06-03 10:47GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Export soundbank
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Export soundbank")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/soundbank/2_build.py b/code/nel/tools/build_gamedata/processes/soundbank/2_build.py
new file mode 100644
index 000000000..03d2f6b07
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/soundbank/2_build.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+#
+# \file 2_build.py
+# \brief Build soundbank
+# \date 2009-06-03 10:47GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Build soundbank
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Build soundbank")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+# Find tools
+BuildSoundbank = findTool(log, ToolDirectories, BuildSoundbankTool, ToolSuffix)
+printLog(log, "")
+
+# build_soundbank
+printLog(log, ">>> Build soundbank <<<")
+if BuildSoundbank == "":
+ toolLogFail(log, BuildSoundbankTool, ToolSuffix)
+else:
+ mkPath(log, SoundDirectory)
+ mkPath(log, SoundDfnDirectory)
+ mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory)
+ subprocess.call([ BuildSoundbank, SoundDirectory, SoundDfnDirectory, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory ])
+printLog(log, "")
+
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/soundbank/3_install.py b/code/nel/tools/build_gamedata/processes/soundbank/3_install.py
new file mode 100644
index 000000000..e8a2a6242
--- /dev/null
+++ b/code/nel/tools/build_gamedata/processes/soundbank/3_install.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+#
+# \file 3_install.py
+# \brief Install soundbank
+# \date 2009-06-03 10:47GMT
+# \author Jan Boon (Kaetemi)
+# Python port of game data build pipeline.
+# Install soundbank
+#
+# NeL - MMORPG Framework
+# Copyright (C) 2009-2014 by authors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import time, sys, os, shutil, subprocess, distutils.dir_util
+sys.path.append("../../configuration")
+
+if os.path.isfile("log.log"):
+ os.remove("log.log")
+log = open("log.log", "w")
+from scripts import *
+from buildsite import *
+from process import *
+from tools import *
+from directories import *
+
+printLog(log, "")
+printLog(log, "-------")
+printLog(log, "--- Install soundbank")
+printLog(log, "-------")
+printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
+printLog(log, "")
+
+printLog(log, ">>> Install soundbank packed_sheets <<<")
+mkPath(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory)
+mkPath(log, InstallDirectory + "/" + SoundInstallDirectory)
+copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + SoundSheetsBuildDirectory, InstallDirectory + "/" + SoundInstallDirectory, ".packed_sheets")
+
+printLog(log, "")
+log.close()
+
+
+# end of file
diff --git a/code/nel/tools/build_gamedata/processes/zone/2_build.py b/code/nel/tools/build_gamedata/processes/zone/2_build.py
index ad2f052fd..f9a31e3c4 100755
--- a/code/nel/tools/build_gamedata/processes/zone/2_build.py
+++ b/code/nel/tools/build_gamedata/processes/zone/2_build.py
@@ -46,6 +46,7 @@ printLog(log, "")
# Find tools
ZoneDependencies = findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix)
ZoneWelder = findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix)
+ZoneElevation = findTool(log, ToolDirectories, ZoneElevationTool, ToolSuffix)
ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
printLog(log, "")
@@ -99,7 +100,24 @@ if BuildQuality == 1:
printLog(log, "")
# For each zone directory
-printLog(log, ">>> Build zone weld <<<")
+#printLog(log, ">>> Build zone weld <<<")
+#if ZoneWelder == "":
+# toolLogFail(log, ZoneWelderTool, ToolSuffix)
+#elif ExecTimeout == "":
+# toolLogFail(log, ExecTimeoutTool, ToolSuffix)
+#else:
+# mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
+# mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
+# files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zone")
+# for file in files:
+# sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file
+# destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew"
+# if needUpdateLogRemoveDest(log, sourceFile, destFile):
+# subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
+#printLog(log, "")
+
+# For each zone directory
+printLog(log, ">>> Weld zone without heightmap <<<")
if ZoneWelder == "":
toolLogFail(log, ZoneWelderTool, ToolSuffix)
elif ExecTimeout == "":
@@ -107,29 +125,29 @@ elif ExecTimeout == "":
else:
mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
- files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zone")
+ files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zonenh")
for file in files:
sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file
- destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zone")] + ".zonew"
+ destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenh")] + ".zonenhw"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
printLog(log, "")
-# For each zone directory
-printLog(log, ">>> Build zone weld no heightmap <<<")
-if ZoneWelder == "":
- toolLogFail(log, ZoneWelderTool, ToolSuffix)
-elif ExecTimeout == "":
- toolLogFail(log, ExecTimeoutTool, ToolSuffix)
+printLog(log, ">>> Apply zone heightmap to welded zone <<<")
+if ZoneElevation == "":
+ toolLogFail(log, ZoneElevationTool, ToolSuffix)
else:
- mkPath(log, ExportBuildDirectory + "/" + ZoneExportDirectory)
mkPath(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory)
- files = findFiles(log, ExportBuildDirectory + "/" + ZoneExportDirectory, "", ".zonenh")
+ mkPath(log, DatabaseDirectory + "/" + LigoBaseSourceDirectory);
+ land = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportLand
+ heightMap1 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap1
+ heightMap2 = DatabaseDirectory + "/" + LigoBaseSourceDirectory + "/" + LigoExportHeightmap2
+ files = findFiles(log, ExportBuildDirectory + "/" + ZoneWeldBuildDirectory, "", ".zonenhw")
for file in files:
- sourceFile = ExportBuildDirectory + "/" + ZoneExportDirectory + "/" + file
- destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenh")] + ".zonenhw"
+ sourceFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + file
+ destFile = ExportBuildDirectory + "/" + ZoneWeldBuildDirectory + "/" + os.path.basename(file)[0:-len(".zonenhw")] + ".zonew"
if needUpdateLogRemoveDest(log, sourceFile, destFile):
- subprocess.call([ ExecTimeout, str(ZoneBuildWeldTimeout), ZoneWelder, sourceFile, destFile ])
+ subprocess.call([ ZoneElevation, sourceFile, destFile, "--land", land, "--heightmap", heightMap1, "--zfactor", LigoExportZFactor1, "--heightmap2", heightMap2, "--zfactor2", LigoExportZFactor2 ])
printLog(log, "")
log.close()
diff --git a/code/nel/tools/misc/bnp_make_qt/main.cpp b/code/nel/tools/misc/bnp_make_qt/main.cpp
new file mode 100644
index 000000000..4efc51df3
--- /dev/null
+++ b/code/nel/tools/misc/bnp_make_qt/main.cpp
@@ -0,0 +1,11 @@
+#include "main.h"
+
+int main(int argc, char * argv[])
+{
+ QApplication application(argc, argv);
+ MainWindow window;
+
+ window.show();
+
+ return application.exec();
+}
diff --git a/code/nel/tools/misc/bnp_make_qt/main.h b/code/nel/tools/misc/bnp_make_qt/main.h
new file mode 100644
index 000000000..a8a4b8652
--- /dev/null
+++ b/code/nel/tools/misc/bnp_make_qt/main.h
@@ -0,0 +1,8 @@
+#ifndef MAIN_H
+#define MAIN_H
+
+#include
+
+#include "mainwindow.h"
+
+#endif // MAIN_H
diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp b/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp
new file mode 100644
index 000000000..888330a80
--- /dev/null
+++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.cpp
@@ -0,0 +1,253 @@
+#include "mainwindow.h"
+
+MainWindow::MainWindow(QWidget * parent) :
+ QMainWindow(parent),
+ uiMainWindow_(new Ui::MainWindow),
+ processList_(new QProcess(this)),
+ processSearch_(new QProcess(this)),
+ processPack_(new QProcess(this)),
+ processUnpack_(new QProcess(this))
+{
+ uiMainWindow_->setupUi(this);
+
+ settings_ = new QSettings("bnp_make_frontend.cfg", QSettings::IniFormat);
+ bnpMakeBinary_ = settings_->value("BnpMakeBinary").toString();
+ dataPath_ = settings_->value("DataPath").toString();
+
+ uiMainWindow_->lineEditSearchPath->setText(dataPath_);
+ uiMainWindow_->lineEditBnpMake->setText(bnpMakeBinary_);
+ uiMainWindow_->lineEditDataPath->setText(dataPath_);
+
+ connect(uiMainWindow_->pushButtonListBrowse, SIGNAL(clicked()), this, SLOT(onButtonListBrowseClicked()));
+ connect(uiMainWindow_->pushButtonList, SIGNAL(clicked()), this, SLOT(onButtonListClicked()));
+ connect(processList_, SIGNAL(finished(int)), this, SLOT(onProcessListComplete()));
+
+ connect(uiMainWindow_->pushButtonSearchBrowse, SIGNAL(clicked()), this, SLOT(onButtonSearchBrowseClicked()));
+ connect(uiMainWindow_->pushButtonSearch, SIGNAL(clicked()), this, SLOT(onButtonSearchClicked()));
+ connect(processSearch_, SIGNAL(finished(int)), this, SLOT(onProcessSearchComplete()));
+
+ connect(uiMainWindow_->pushButtonPackBrowse, SIGNAL(clicked()), this, SLOT(onButtonPackBrowseClicked()));
+ connect(uiMainWindow_->pushButtonPack, SIGNAL(clicked()), this, SLOT(onButtonPackClicked()));
+ connect(processPack_, SIGNAL(finished(int)), this, SLOT(onProcessPackComplete()));
+
+ connect(uiMainWindow_->pushButtonUnpackBrowse, SIGNAL(clicked()), this, SLOT(onButtonUnpackBrowseClicked()));
+ connect(uiMainWindow_->pushButtonUnpack, SIGNAL(clicked()), this, SLOT(onButtonUnpackClicked()));
+ connect(processUnpack_, SIGNAL(finished(int)), this, SLOT(onProcessUnpackComplete()));
+
+ connect(uiMainWindow_->pushButtonBnpMakeBrowse, SIGNAL(clicked()), this, SLOT(onButtonBnpMakeBrowseClicked()));
+ connect(uiMainWindow_->pushButtonDataPathBrowse, SIGNAL(clicked()), this, SLOT(onButtonDataPathBrowseClicked()));
+}
+
+MainWindow::~MainWindow()
+{
+ delete uiMainWindow_;
+}
+
+void MainWindow::onButtonListBrowseClicked()
+{
+ QString fileName;
+
+ fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
+ uiMainWindow_->lineEditList->setText(fileName);
+}
+
+void MainWindow::onButtonListClicked()
+{
+ QStringList arguments;
+
+ uiMainWindow_->textEditList->clear();
+
+ if (bnpMakeBinary_ != "")
+ if (uiMainWindow_->lineEditList->text() != "")
+ {
+ arguments << "/l" << uiMainWindow_->lineEditList->text();
+ processList_->start(bnpMakeBinary_, arguments);
+ }
+ else
+ uiMainWindow_->textEditList->append("Choose a BNP file.");
+ else
+ uiMainWindow_->textEditList->append("Check bnp_make path.");
+}
+
+void MainWindow::onProcessListComplete()
+{
+ QString output;
+
+ output = processList_->readAllStandardOutput();
+ uiMainWindow_->textEditList->append(output);
+ uiMainWindow_->textEditList->append("List complete.");
+}
+
+void MainWindow::onButtonSearchBrowseClicked()
+{
+ QString directory;
+
+ directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ uiMainWindow_->lineEditSearchPath->setText(directory);
+}
+
+void MainWindow::onButtonSearchClicked()
+{
+ QDir dir;
+ QStringList nameFilters;
+
+ uiMainWindow_->textEditSearch->clear();
+
+ if (bnpMakeBinary_ != "")
+ if (uiMainWindow_->lineEditSearchPath->text() != "")
+ {
+ dir.cd(uiMainWindow_->lineEditSearchPath->text());
+
+ nameFilters << "*.bnp";
+ dir.setNameFilters(nameFilters);
+ dir.setFilter(QDir::Files);
+
+ fileInfoList_ = dir.entryInfoList();
+ fileInfoListIndex_ = 0;
+
+ onProcessSearchComplete();
+ }
+ else
+ uiMainWindow_->textEditSearch->append("Choose a directory.");
+ else
+ uiMainWindow_->textEditSearch->append("Check bnp_make path.");
+}
+
+void MainWindow::onProcessSearchComplete()
+{
+ QFileInfo fileInfo;
+ QStringList arguments;
+ QString output;
+ QStringList outputList;
+ QString line;
+
+ if (fileInfoListIndex_ > 0)
+ {
+ output = processSearch_->readAllStandardOutput();
+
+ if (uiMainWindow_->lineEditSearchString->text() == "")
+ uiMainWindow_->textEditSearch->append(output);
+ else
+ {
+ outputList = output.split("\n");
+
+ foreach (line, outputList)
+ if (line.contains(uiMainWindow_->lineEditSearchString->text()))
+ uiMainWindow_->textEditSearch->append(line.trimmed());
+ }
+ }
+
+ if (fileInfoListIndex_ < fileInfoList_.count())
+ {
+ fileInfo = fileInfoList_.at(fileInfoListIndex_++);
+ uiMainWindow_->textEditSearch->append("===> " + uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName() + ":");
+ arguments << "/l" << uiMainWindow_->lineEditSearchPath->text() + "/" + fileInfo.fileName();
+ processSearch_->start(bnpMakeBinary_, arguments);
+ }
+ else
+ {
+ uiMainWindow_->textEditSearch->append("Search complete.");
+ }
+}
+
+void MainWindow::onButtonPackBrowseClicked()
+{
+ QString directory;
+
+ directory = QFileDialog::getExistingDirectory(this, tr("Choose the source directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ uiMainWindow_->lineEditPack->setText(directory);
+}
+
+void MainWindow::onButtonPackClicked()
+{
+ QStringList arguments;
+
+ uiMainWindow_->textEditPack->clear();
+
+ if (bnpMakeBinary_ != "")
+ if (uiMainWindow_->lineEditPack->text() != "")
+ {
+ uiMainWindow_->textEditPack->append("Pack in progress...");
+
+ arguments << "/p" << uiMainWindow_->lineEditPack->text();
+ processPack_->start(bnpMakeBinary_, arguments);
+ }
+ else
+ uiMainWindow_->textEditPack->append("Choose the source directory.");
+ else
+ uiMainWindow_->textEditPack->append("Check bnp_make path.");
+}
+
+void MainWindow::onProcessPackComplete()
+{
+ QString output;
+
+ output = processPack_->readAllStandardOutput();
+ uiMainWindow_->textEditPack->append(output);
+ uiMainWindow_->textEditPack->append("Pack complete.");
+}
+
+void MainWindow::onButtonUnpackBrowseClicked()
+{
+ QString fileName;
+
+ fileName = QFileDialog::getOpenFileName(this, "Choose a BNP file", dataPath_, "BNP file (*.bnp)");
+ uiMainWindow_->lineEditUnpack->setText(fileName);
+}
+
+void MainWindow::onButtonUnpackClicked()
+{
+ QStringList arguments;
+
+ uiMainWindow_->textEditUnpack->clear();
+
+ if (bnpMakeBinary_ != "")
+ if (uiMainWindow_->lineEditUnpack->text() != "")
+ {
+ uiMainWindow_->textEditUnpack->append("Unpack in progress...");
+
+ arguments << "/u" << uiMainWindow_->lineEditUnpack->text();
+ processUnpack_->start(bnpMakeBinary_, arguments);
+ }
+ else
+ uiMainWindow_->textEditUnpack->append("Choose a BNP file.");
+ else
+ uiMainWindow_->textEditUnpack->append("Check bnp_make path.");
+}
+
+void MainWindow::onProcessUnpackComplete()
+{
+ uiMainWindow_->textEditUnpack->append("Unpack complete.");
+}
+
+void MainWindow::onButtonBnpMakeBrowseClicked()
+{
+ QString fileName;
+
+ fileName = QFileDialog::getOpenFileName(this, "Locate the bnp_make binary", dataPath_);
+ uiMainWindow_->lineEditBnpMake->setText(fileName);
+
+ bnpMakeBinary_ = fileName;
+ settings_->setValue("BnpMakeBinary", fileName);
+
+ uiMainWindow_->textEditSettings->clear();
+ if (fileName != "")
+ uiMainWindow_->textEditSettings->append("bnp_make path changed.");
+ else
+ uiMainWindow_->textEditSettings->append("Locate the bnp_make binary.");
+}
+
+void MainWindow::onButtonDataPathBrowseClicked()
+{
+ QString directory;
+
+ directory = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), dataPath_, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ uiMainWindow_->lineEditDataPath->setText(directory);
+
+ dataPath_ = directory;
+ settings_->setValue("DataPath", directory);
+ uiMainWindow_->lineEditSearchPath->setText(directory);
+
+ uiMainWindow_->textEditSettings->clear();
+ uiMainWindow_->textEditSettings->append("Data path changed.");
+}
diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.h b/code/nel/tools/misc/bnp_make_qt/mainwindow.h
new file mode 100644
index 000000000..776b5fe01
--- /dev/null
+++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.h
@@ -0,0 +1,61 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include
+#include
+#include
+#include
+
+#include "ui_mainwindow.h"
+
+namespace Ui
+{
+ class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+ public:
+ explicit MainWindow(QWidget * parent = 0);
+ ~MainWindow();
+
+ public slots:
+ void onButtonListBrowseClicked();
+ void onButtonListClicked();
+ void onProcessListComplete();
+
+ void onButtonSearchBrowseClicked();
+ void onButtonSearchClicked();
+ void onProcessSearchComplete();
+
+ void onButtonPackBrowseClicked();
+ void onButtonPackClicked();
+ void onProcessPackComplete();
+
+ void onButtonUnpackBrowseClicked();
+ void onButtonUnpackClicked();
+ void onProcessUnpackComplete();
+
+ void onButtonBnpMakeBrowseClicked();
+ void onButtonDataPathBrowseClicked();
+
+ private:
+ Ui::MainWindow * uiMainWindow_;
+ QSettings * settings_;
+ QString bnpMakeBinary_;
+ QString dataPath_;
+
+ QProcess * processList_;
+
+ QProcess * processSearch_;
+ int fileInfoListIndex_;
+ QFileInfoList fileInfoList_;
+
+ QProcess * processPack_;
+
+ QProcess * processUnpack_;
+};
+
+#endif // MAINWINDOW_H
diff --git a/code/nel/tools/misc/bnp_make_qt/mainwindow.ui b/code/nel/tools/misc/bnp_make_qt/mainwindow.ui
new file mode 100644
index 000000000..37097744e
--- /dev/null
+++ b/code/nel/tools/misc/bnp_make_qt/mainwindow.ui
@@ -0,0 +1,322 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 800
+ 600
+
+
+
+ bnp-make-frontend
+
+
+
+ :/images/bnp-make-frontend.ico:/images/bnp-make-frontend.ico
+
+
+ QTabWidget::Rounded
+
+
+
+ -
+
+
+ 0
+
+
+
+ List
+
+
+
-
+
+
-
+
+
-
+
+
+ BNP file:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
+ List
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+ Search
+
+
+ -
+
+
-
+
+
-
+
+
+ Search path:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
-
+
+
+ Search string:
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Search
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+ Pack
+
+
+ -
+
+
-
+
+
-
+
+
+ Source path:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
+ Pack
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+ Unpack
+
+
+ -
+
+
-
+
+
-
+
+
+ BNP file:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
+ Unpack
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+ Settings
+
+
+ -
+
+
-
+
+
-
+
+
+ bnp_make path:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
-
+
+
+ Data path:
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Browse
+
+
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/nel/tools/pacs/build_rbank/build_surf.cpp b/code/nel/tools/pacs/build_rbank/build_surf.cpp
index 465f5f94f..ba75234d1 100644
--- a/code/nel/tools/pacs/build_rbank/build_surf.cpp
+++ b/code/nel/tools/pacs/build_rbank/build_surf.cpp
@@ -880,6 +880,7 @@ void NLPACS::CZoneTessellation::checkSameLandscapeHmBinds(const NL3D::CLandscape
// or at least the welding of zones should just keep the same welding as the non heightmapped one
nlwarning("ERROR: The zone %s has a different bind strucutre in the landscape and in the landscape_with_No_Heightmap", zoneName.c_str());
nlwarning("ERROR: Hint: Check your heightmap: it may be too precise or has too much noise, causing the zonewelder to behav differently...");
+ nlwarning("ERROR: Use the 'zone_heightmap' tool to resolve this!");
nlwarning("More Details (information landscape / information landscape_with_No_Heightmap):");
for(uint j=0;jsetRyzomFilename(Args.getProgramPath() + Args.getProgramName());
diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp
index 132b8bef9..23f5cc961 100644
--- a/code/ryzom/client/src/client_cfg.cpp
+++ b/code/ryzom/client/src/client_cfg.cpp
@@ -42,6 +42,10 @@
// Game Share.
#include "game_share/time_weather_season/time_and_season.h"
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#ifdef NL_OS_MAC
#include "app_bundle_utils.h"
#endif // NL_OS_MAC
@@ -330,9 +334,9 @@ CClientConfig::CClientConfig()
TexturesLoginInterface.push_back("texture_interfaces_v3_login");
DisplayAccountButtons = true;
- CreateAccountURL = "https://account.ryzom.com/signup/from_client.php";
- EditAccountURL = "https://account.ryzom.com/payment_profile/index.php";
- ForgetPwdURL = "https://account.ryzom.com/payment_profile/lost_secure_password.php";
+ CreateAccountURL = RYZOM_CLIENT_CREATE_ACCOUNT_URL; // "https://open.ryzom.dev/ams/";
+ EditAccountURL = RYZOM_CLIENT_EDIT_ACCOUNT_URL; // "https://open.ryzom.dev/ams/";
+ ForgetPwdURL = RYZOM_CLIENT_FORGET_PASSWORD_URL; // "https://open.ryzom.dev/ams/";
Position = CVector(0.f, 0.f, 0.f); // Default Position.
Heading = CVector(0.f, 1.f, 0.f); // Default Heading.
EyesHeight = 1.5f; // Default User Eyes Height.
@@ -428,15 +432,15 @@ CClientConfig::CClientConfig()
PatchletUrl.clear();
PatchVersion.clear();
- WebIgMainDomain = "atys.ryzom.com";
- WebIgTrustedDomains.push_back(WebIgMainDomain);
+ WebIgMainDomain = RYZOM_WEBIG_MAIN_URL; // https://open.ryzom.dev/"
+ WebIgTrustedDomains.push_back(RYZOM_WEBIG_TRUSTED_DOMAIN); // open.ryzom.dev
WebIgNotifInterval = 10; // time in minutes
CurlMaxConnections = 5;
CurlCABundle.clear();
- RingReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes_ring/index.php";
- ReleaseNotePath = "http://" + WebIgMainDomain + "/releasenotes/index.php";
+ RingReleaseNotePath = WebIgMainDomain + "/releasenotes_ring/index.php";
+ ReleaseNotePath = WebIgMainDomain + "/releasenotes/index.php";
///////////////
@@ -452,7 +456,7 @@ CClientConfig::CClientConfig()
SoundOn = true; // Default is with sound.
DriverSound = SoundDrvAuto;
SoundForceSoftwareBuffer = true;
- SoundOutGameMusic = "Main Menu Loop.ogg";
+ SoundOutGameMusic = "main menu loop.ogg";
SoundSFXVolume = 1.f;
SoundGameMusicVolume = 1.f;
SoundTPFade = 500;
@@ -1095,6 +1099,9 @@ void CClientConfig::setValues()
///////////
// WEBIG //
READ_STRING_FV(WebIgMainDomain);
+ if (ClientCfg.WebIgMainDomain.find("http://") == std::string::npos
+ || ClientCfg.WebIgMainDomain.find("https://") == std::string::npos)
+ ClientCfg.WebIgMainDomain = "http://" + ClientCfg.WebIgMainDomain;
READ_STRINGVECTOR_FV(WebIgTrustedDomains);
READ_INT_FV(WebIgNotifInterval);
READ_INT_FV(CurlMaxConnections);
diff --git a/code/ryzom/client/src/init_main_loop.cpp b/code/ryzom/client/src/init_main_loop.cpp
index 0ecc1d095..47c11d899 100644
--- a/code/ryzom/client/src/init_main_loop.cpp
+++ b/code/ryzom/client/src/init_main_loop.cpp
@@ -28,6 +28,7 @@
#include "nel/misc/path.h"
#include "nel/misc/sheet_id.h"
#include "nel/misc/big_file.h"
+#include "nel/misc/curl_certificates.h"
// 3D Interface.
#include "nel/3d/bloom_effect.h"
#include "nel/3d/u_driver.h"
@@ -187,6 +188,13 @@ struct CStatThread : public NLMISC::IRunnable
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)");
curl_easy_setopt(curl, CURLOPT_REFERER, string("http://www.ryzom.com/" + referer).c_str());
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
+ if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https
+ {
+ NLMISC::CCurlCertificates::addCertificateFile("cacert.pem");
+ NLMISC::CCurlCertificates::useCertificates(curl);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
+ }
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
//curl_global_cleanup();
diff --git a/code/ryzom/client/src/interface_v3/action_handler_ui.cpp b/code/ryzom/client/src/interface_v3/action_handler_ui.cpp
index 68b55076e..bf83ddce1 100644
--- a/code/ryzom/client/src/interface_v3/action_handler_ui.cpp
+++ b/code/ryzom/client/src/interface_v3/action_handler_ui.cpp
@@ -416,7 +416,7 @@ class CAHUIShowHide : public IActionHandler
nlwarning("%s is not a group html", window.c_str());
return;
}
- pGH->setURL("http://"+ClientCfg.WebIgMainDomain+"/index.php?app="+webapp);
+ pGH->setURL(ClientCfg.WebIgMainDomain + "/index.php?app=" + webapp);
}
}
else
diff --git a/code/ryzom/client/src/interface_v3/group_html_webig.cpp b/code/ryzom/client/src/interface_v3/group_html_webig.cpp
index 8f5c6da01..5ec107bcb 100644
--- a/code/ryzom/client/src/interface_v3/group_html_webig.cpp
+++ b/code/ryzom/client/src/interface_v3/group_html_webig.cpp
@@ -30,7 +30,7 @@
#include "../connection.h"
#include
-#include "nel/gui/curl_certificates.h"
+#include "nel/misc/curl_certificates.h"
using namespace std;
using namespace NLMISC;
@@ -188,7 +188,7 @@ public:
curl_easy_setopt(Curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(Curl, CURLOPT_WRITEFUNCTION, writeDataFromCurl);
- NLGUI::CCurlCertificates::useCertificates(Curl);
+ NLMISC::CCurlCertificates::useCertificates(Curl);
}
~CWebigNotificationThread()
@@ -267,7 +267,7 @@ public:
uint c = 0;
while (_Running)
{
- string url = "https://"+domain+"/index.php?app=notif&format=lua&rnd="+randomString();
+ string url = domain + "/index.php?app=notif&format=lua&rnd=" + randomString();
addWebIGParams(url, true);
get(url);
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp
index 16377ac94..d01e89a24 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp
@@ -113,7 +113,7 @@
#include "nel/gui/lua_helper.h"
using namespace NLGUI;
#include "nel/gui/lua_ihm.h"
-#include "nel/gui/curl_certificates.h"
+#include "nel/misc/curl_certificates.h"
#include "lua_ihm_ryzom.h"
@@ -480,7 +480,7 @@ CInterfaceManager::CInterfaceManager()
if (!ClientCfg.CurlCABundle.empty())
{
// specify custom CA certs, lookup will be made in this function
- NLGUI::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle);
+ NLMISC::CCurlCertificates::addCertificateFile(ClientCfg.CurlCABundle);
}
NLGUI::CDBManager::getInstance()->resizeBanks( NB_CDB_BANKS );
diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp
index 5265f801e..4bc8c10be 100644
--- a/code/ryzom/client/src/login.cpp
+++ b/code/ryzom/client/src/login.cpp
@@ -51,7 +51,7 @@
#include "global.h"
#include "input.h"
#include "nel/gui/libwww.h"
-#include "http_client_curl.h"
+#include "nel/misc/http_client_curl.h"
#include "login_progress_post_thread.h"
#include "init.h"
@@ -156,7 +156,8 @@ CLoginStateMachine LoginSM;
bool CStartupHttpClient::connectToLogin()
{
- return connect(ClientCfg.ConfigFile.getVar("StartupHost").asString(0));
+ return connect(ClientCfg.ConfigFile.getVar("StartupHost").asString(0))
+ && verifyServer(ClientCfg.ConfigFile.getVar("StartupVerify").asBool(0));
}
CStartupHttpClient HttpClient;
@@ -2827,7 +2828,36 @@ string checkLogin(const string &login, const string &password, const string &cli
if(res.empty())
return "Empty answer from server (error code 62)";
- if(res[0] == '0')
+ size_t first = res.find("\n\n");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\r");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\n\r\n");
+ if (first != std::string::npos)
+ {
+ res = res.substr(first + 4);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+
+ nldebug("res1: %s", res.c_str());
+
+ if (res[0] == 'H')
+ {
+ nlwarning("missing response body: %s", res.c_str());
+ return "missing response body (error code 64)";
+ }
+ else if(res[0] == '0')
{
// server returns an error
nlwarning("server error: %s", res.substr(2).c_str());
@@ -2880,7 +2910,36 @@ string checkLogin(const string &login, const string &password, const string &cli
if(res.empty())
return "Empty answer from server (error code 4)";
- if(res[0] == '0')
+ size_t first = res.find("\n\n");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\r");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\n\r\n");
+ if (first != std::string::npos)
+ {
+ res = res.substr(first + 4);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+
+ nldebug("res2: %s", res.c_str());
+
+ if (res[0] == 'H')
+ {
+ nlwarning("missing response body: %s", res.c_str());
+ return "missing response body (error code 65)";
+ }
+ else if(res[0] == '0')
{
// server returns an error
nlwarning("server error: %s", res.substr(2).c_str());
@@ -2962,7 +3021,36 @@ string checkLogin(const string &login, const string &password, const string &cli
if(res.empty())
return "Empty answer from server (error code 4)";
- if(res[0] == '0')
+ size_t first = res.find("\n\n");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\r");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\n\r\n");
+ if (first != std::string::npos)
+ {
+ res = res.substr(first + 4);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+
+ nldebug("res2: %s", res.c_str());
+
+ if (res[0] == 'H')
+ {
+ nlwarning("missing response body: %s", res.c_str());
+ return "missing response body (error code 66)";
+ }
+ else if(res[0] == '0')
{
// server returns an error
nlwarning("server error: %s", res.substr(2).c_str());
@@ -3067,7 +3155,36 @@ string selectShard(uint32 shardId, string &cookie, string &addr)
if(res.empty())
return "Empty result (error code 13)";
- if(res[0] == '0')
+ size_t first = res.find("\n\n");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\r");
+ if (first == std::string::npos)
+ {
+ first = res.find("\r\n\r\n");
+ if (first != std::string::npos)
+ {
+ res = res.substr(first + 4);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+ }
+ else
+ {
+ res = res.substr(first + 2);
+ }
+
+ nldebug("res2: %s", res.c_str());
+
+ if (res[0] == 'H')
+ {
+ nlwarning("missing response body: %s", res.c_str());
+ return "missing response body (error code 66)";
+ }
+ else if(res[0] == '0')
{
// server returns an error
nlwarning("server error: %s", res.substr(2).c_str());
diff --git a/code/ryzom/client/src/login.h b/code/ryzom/client/src/login.h
index 2c6e8c960..d01f0ea8a 100644
--- a/code/ryzom/client/src/login.h
+++ b/code/ryzom/client/src/login.h
@@ -18,8 +18,8 @@
#ifndef CL_LOGIN_H
#define CL_LOGIN_H
-#include "nel/misc/types_nl.h"
-#include "game_share/http_client.h"
+#include
+#include
#include
#include
@@ -74,7 +74,7 @@ extern sint32 ShardSelected;
/*
* HTTP client preconfigured to connect to the startup login host
*/
-class CStartupHttpClient : public CHttpClient
+class CStartupHttpClient : public NLMISC::CCurlHttpClient
{
public:
diff --git a/code/ryzom/client/src/login_patch.cpp b/code/ryzom/client/src/login_patch.cpp
index a21f7cab1..ca91fcbfa 100644
--- a/code/ryzom/client/src/login_patch.cpp
+++ b/code/ryzom/client/src/login_patch.cpp
@@ -49,6 +49,7 @@
#include "nel/misc/i18n.h"
#include "nel/misc/cmd_args.h"
#include "nel/misc/seven_zip.h"
+#include "nel/misc/curl_certificates.h"
#include "game_share/bg_downloader_msg.h"
@@ -239,12 +240,10 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s
cf = &ClientCfg.ConfigFile;
#endif
- std::string appName = "ryzom_live";
-
- if (cf->getVarPtr("Application"))
- {
- appName = cf->getVar("Application").asString(0);
- }
+ // App name matches Domain on the SQL server
+ std::string appName = cf->getVarPtr("Application")
+ ? cf->getVar("Application").asString(0)
+ : "default";
std::string versionFileName = appName + ".version";
getServerFile(versionFileName);
@@ -252,7 +251,7 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s
// ok, we have the file, extract version number (aka build number) and the
// version name if present
- CIFile versionFile(ClientPatchPath+versionFileName);
+ CIFile versionFile(ClientPatchPath + versionFileName);
char buffer[1024];
versionFile.getline(buffer, 1024);
CSString line(buffer);
@@ -266,8 +265,12 @@ void CPatchManager::init(const std::vector& patchURIs, const std::s
}
#endif
- ServerVersion = line.firstWord(true);
- VersionName = line.firstWord(true);
+ // Use the version specified in this file, if the file does not contain an asterisk
+ if (line[0] != '*')
+ {
+ ServerVersion = line.firstWord(true);
+ VersionName = line.firstWord(true);
+ }
// force the R2ServerVersion
R2ServerVersion = ServerVersion;
@@ -1258,19 +1261,18 @@ void CPatchManager::readDescFile(sint32 nVersion)
if (foundPlatformPatchCategory)
{
- std::vector forceRemovePatchCategories;
+ std::set forceRemovePatchCategories;
// only download binaries for current platform
- forceRemovePatchCategories.push_back("main_exedll");
- forceRemovePatchCategories.push_back("main_exedll_win32");
- forceRemovePatchCategories.push_back("main_exedll_win64");
- forceRemovePatchCategories.push_back("main_exedll_linux32");
- forceRemovePatchCategories.push_back("main_exedll_linux64");
- forceRemovePatchCategories.push_back("main_exedll_osx");
+ forceRemovePatchCategories.insert("main_exedll");
+ forceRemovePatchCategories.insert("main_exedll_win32");
+ forceRemovePatchCategories.insert("main_exedll_win64");
+ forceRemovePatchCategories.insert("main_exedll_linux32");
+ forceRemovePatchCategories.insert("main_exedll_linux64");
+ forceRemovePatchCategories.insert("main_exedll_osx");
// remove current platform category from remove list
- forceRemovePatchCategories.erase(std::remove(forceRemovePatchCategories.begin(),
- forceRemovePatchCategories.end(), platformPatchCategory), forceRemovePatchCategories.end());
+ forceRemovePatchCategories.erase(platformPatchCategory);
CBNPFileSet &bnpFS = const_cast(DescFile.getFiles());
@@ -1427,6 +1429,13 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, downloadProgressFunc);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, (void *) progress);
curl_easy_setopt(curl, CURLOPT_URL, source.c_str());
+ if (source.length() > 8 && (source[4] == 's' || source[4] == 'S')) // 01234 https
+ {
+ NLMISC::CCurlCertificates::addCertificateFile("cacert.pem");
+ NLMISC::CCurlCertificates::useCertificates(curl);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
+ curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);
+ }
// create the local file
if (NLMISC::CFile::fileExists(dest))
@@ -1525,12 +1534,14 @@ void CPatchManager::downloadFileWithCurl (const string &source, const string &de
void CPatchManager::downloadFile (const string &source, const string &dest, NLMISC::IProgressCallback *progress)
{
// For the moment use only curl
- const string sHeadHttp = toLower(source.substr(0,5));
- const string sHeadFtp = toLower(source.substr(0,4));
- const string sHeadFile = toLower(source.substr(0,5));
+ const string sourceLower = toLower(source.substr(0, 6));
- if ((sHeadHttp == "http:") || (sHeadFtp == "ftp:") || (sHeadFile == "file:"))
+ if (startsWith(sourceLower, "http:")
+ || startsWith(sourceLower, "https:")
+ || startsWith(sourceLower, "ftp:")
+ || startsWith(sourceLower, "file:"))
{
+ nldebug("Download patch file %s", source.c_str());
downloadFileWithCurl(source, dest, progress);
}
else
diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp
index 7bdcfb5ed..d562e5ea4 100644
--- a/code/ryzom/client/src/net_manager.cpp
+++ b/code/ryzom/client/src/net_manager.cpp
@@ -3292,7 +3292,7 @@ private:
if(i != digitMaxEnd)
{
ucstring web_app = contentStr.substr(digitStart, i-digitStart);
- contentStr = ucstring("http://"+ClientCfg.WebIgMainDomain+"/")+web_app+ucstring("/index.php?")+contentStr.substr(i+1);
+ contentStr = ucstring(ClientCfg.WebIgMainDomain + "/") + web_app + ucstring("/index.php?") + contentStr.substr((size_t)i + 1);
}
else
{
diff --git a/code/ryzom/tools/client/client_patcher/main.cpp b/code/ryzom/tools/client/client_patcher/main.cpp
index fc440abf4..e7d57a335 100644
--- a/code/ryzom/tools/client/client_patcher/main.cpp
+++ b/code/ryzom/tools/client/client_patcher/main.cpp
@@ -191,7 +191,7 @@ struct CClientPatcherTranslations : public NLMISC::CI18N::ILoadProxy
};
// hardcoded URL to not depend on external files
-static const std::string PatchUrl = "http://dl.ryzom.com/patch_live";
+static const std::string PatchUrl = RYZOM_CLIENT_PATCH_URL; // "https://cdn.ryzom.dev/open/patch";
int main(int argc, char *argv[])
{
diff --git a/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp b/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp
index d44e5a155..c0a74297b 100644
--- a/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp
+++ b/code/ryzom/tools/leveldesign/georges_dll/file_tree_view.cpp
@@ -457,7 +457,9 @@ bool CFileTreeCtrl::enumObjects(HTREEITEM hParentItem,IShellFolder* pParentFolde
string ext5 = pItemInfo->displayName.substr(displayNameSize-5);
bool cvs = ext3 == "CVS" || ext4 == "CVS\\" || ext4 == "CVS/" ||
- ext4 == ".svn" || ext5 == ".svn\\" || ext5 == ".svn/";
+ ext4 == ".svn" || ext5 == ".svn\\" || ext5 == ".svn/" ||
+ ext4 == ".hg" || ext5 == ".hg\\" || ext5 == ".hg/" ||
+ ext4 == ".git" || ext5 == ".git\\" || ext5 == ".git/";
/* bool cvs = ( pItemInfo->displayName[displayNameSize-3] == 'C') &&
(pItemInfo->displayName[displayNameSize-2] == 'V') &&