diff --git a/.browserslistrc b/.browserslistrc
index 3e5809a..c529e38 100644
--- a/.browserslistrc
+++ b/.browserslistrc
@@ -1,11 +1,12 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
+
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
-last 1 Edge major versions
+last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..0792692
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+# Editor configuration, see https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ts]
+quote_type = single
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index 695c05d..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
- "root": true,
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaVersion": "latest",
- "sourceType": "module",
- "ecmaFeatures": {
- "jsx": true
- }
- },
- "settings": {
- "react": {
- "pragma": "React",
- "version": "18.0.0"
- }
- },
- "env": {
- "browser": true,
- "es2021": true
- },
- "extends": [
- "plugin:react/recommended",
- "plugin:react/jsx-runtime",
- "plugin:react-hooks/recommended"
- ],
- "plugins": [
- "@typescript-eslint",
- "react"
- ],
- "rules": {
- "linebreak-style": [
- "off"
- ],
- "quotes": [
- "error",
- "single"
- ],
- "@typescript-eslint/indent": [
- "error",
- 4,
- {
- "SwitchCase": 1
- }
- ],
- "array-bracket-spacing": [
- "error",
- "always"
- ],
- "brace-style": [
- "error",
- "allman"
- ],
- "template-curly-spacing": [
- "error",
- "always"
- ],
- "no-multi-spaces": [
- "error"
- ],
- "@typescript-eslint/object-curly-spacing": [
- "error",
- "always",
- {
- "arraysInObjects": true,
- "objectsInObjects": false
- }
- ],
- "@typescript-eslint/ban-types": [
- "error",
- {
- "types": {
- "String": true,
- "Boolean": true,
- "Number": true,
- "Symbol": true,
- "{}": false,
- "Object": false,
- "object": false,
- "Function": false
- },
- "extendDefaults": true
- }
- ],
- "no-switch-case-fall-through": [
- "off"
- ],
- "jsx-quotes": [
- "error"
- ],
- "react/prop-types": [
- "off"
- ],
- "react/jsx-curly-spacing": [
- "error",
- {
- "when": "always",
- "children": true
- }
- ],
- "react/jsx-equals-spacing": [
- "error"
- ],
- "react/jsx-newline": [
- "error",
- {
- "prevent": true
- }
- ]
- }
-}
diff --git a/.gitignore b/.gitignore
index 154341f..1413af9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,20 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
/dist
/tmp
/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
/.idea
.project
.classpath
@@ -9,23 +22,30 @@
*.launch
.settings/
*.sublime-workspace
+
+# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
+
+# misc
/.sass-cache
/connect.lock
/coverage
-*.log
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
.git
+
+# System Files
.DS_Store
Thumbs.db
-# Nitro
-/build
*.zip
-.env
-public/renderer-config*
-public/ui-config*
+*.as
+*.bin
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index 7b6ffc1..33c4b6b 100644
--- a/README.md
+++ b/README.md
@@ -1,50 +1,17 @@
-# Nitro React v2.1
+# Nitro Renderer
-## Prerequisites
-
-- [Git](https://git-scm.com/)
-- [NodeJS](https://nodejs.org/) >= 18
- - If using NodeJS < 18 remove `--openssl-legacy-provider` from the package.json scripts
-- [Yarn](https://yarnpkg.com/) `npm i yarn -g`
+nitro-renderer is a Javascript library for rendering Nitro in the browser using PixiJS
## Installation
-- First you should open terminal and navigate to the folder where you want to clone Nitro
-- Clone Nitro
- - `git clone https://git.krews.org/nitro/nitro-react.git`
-- Install the dependencies
- - `yarn install`
- - This may take some time, please be patient
-- Rename a few files
- - Rename `public/renderer-config.json.example` to `public/renderer-config.json`
- - Rename `public/ui-config.json.example` to `public/ui-config.json`
-- Set your links
- - Open `public/renderer-config.json`
- - Update `socket.url, asset.url, image.library.url, & hof.furni.url`
- - Open `public/ui-config.json`
- - Update `camera.url, thumbnails.url, url.prefix, habbopages.url`
- - You can override any variable by passing it to `NitroConfig` in the index.html
-
-## Usage
-
-- To use Nitro you need `.nitro` assets generated, see [nitro-converter](https://git.krews.org/nitro/nitro-converter) for instructions
-- See [Morningstar Websockets](https://git.krews.org/nitro/ms-websockets) for instructions on configuring websockets on your server
-
-### Development
-
-Run Nitro in development mode when you are editing the files, this way you can see the changes in your browser instantly
+npm
```
-yarn start
+npm install @nitrots/nitro-renderer
```
-### Production
-
-To build a production version of Nitro just run the following command
+yarn
```
-yarn build:prod
+yarn add @nitrots/nitro-renderer
```
-
-- A `dist` folder will be generated, these are the files that must be uploaded to your webserver
-- Consult your CMS documentation for compatibility with Nitro and how to add the production files
diff --git a/index.html b/index.html
deleted file mode 100644
index 18b1a79..0000000
--- a/index.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Nitro
-
-
-
-
-
-
-
-
diff --git a/index.ts b/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/package.json b/package.json
index 4910ee8..6a0b294 100644
--- a/package.json
+++ b/package.json
@@ -1,39 +1,45 @@
{
- "name": "nitro-react",
- "version": "2.2",
- "homepage": ".",
+ "name": "@nitrots/nitro-renderer",
+ "description": "Javascript library for rendering Nitro in the browser using PixiJS",
+ "version": "2.0.0",
"private": true,
- "scripts": {
- "start": "vite",
- "build": "vite build",
- "build:prod": "npx browserslist@latest --update-db && yarn build",
- "eslint": "eslint src --ext .ts,.tsx"
+ "type": "module",
+ "workspaces": [
+ "packages/*"
+ ],
+ "publishConfig": {
+ "access": "public"
},
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/billsonnn/nitro-renderer.git"
+ },
+ "license": "GPL-3.0",
+ "bugs": {
+ "url": "https://github.com/billsonnn/nitro-renderer/issues"
+ },
+ "homepage": "https://github.com/billsonnn/nitro-renderer",
+ "scripts": {
+ "build": "vite build",
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
"dependencies": {
- "@tanstack/react-virtual": "3.2.0",
- "react": "^18.2.0",
- "react-bootstrap": "^2.2.2",
- "react-dom": "^18.2.0",
- "react-icons": "^5.0.1",
- "react-slider": "^2.0.6",
- "react-youtube": "^7.13.1",
- "use-between": "^1.3.5"
+ "howler": "^2.2.4",
+ "pako": "^2.1.0",
+ "pixi-filters": "^6.0.0",
+ "pixi.js": "~8.0.4"
},
"devDependencies": {
- "@types/node": "^20.11.30",
- "@types/react": "^18.2.67",
- "@types/react-dom": "^18.2.22",
- "@types/react-slider": "^1.3.6",
- "@typescript-eslint/eslint-plugin": "^7.3.1",
- "@typescript-eslint/parser": "^7.3.1",
- "@vitejs/plugin-react": "^4.2.1",
+ "@rollup/plugin-typescript": "^11.1.6",
+ "@types/howler": "^2.2.11",
+ "@types/pako": "^2.0.3",
+ "@typescript-eslint/eslint-plugin": "^7.1.1",
+ "@typescript-eslint/parser": "^7.1.1",
"eslint": "^8.57.0",
- "eslint-plugin-import": "^2.29.1",
- "eslint-plugin-jsx-a11y": "^6.8.0",
- "eslint-plugin-react": "^7.34.1",
- "eslint-plugin-react-hooks": "^4.6.0",
- "sass": "^1.72.0",
- "typescript": "^5.4.2",
- "vite": "^5.1.6"
+ "tslib": "^2.3.1",
+ "typescript": "~5.4.2",
+ "vite": "^5.1.3"
}
}
diff --git a/packages/api/.gitignore b/packages/api/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/packages/api/.gitignore
@@ -0,0 +1,51 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
+/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+.git
+
+# System Files
+.DS_Store
+Thumbs.db
+
+*.zip
+*.as
+*.bin
diff --git a/packages/api/index.ts b/packages/api/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/packages/api/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/api/package.json b/packages/api/package.json
new file mode 100644
index 0000000..6539872
--- /dev/null
+++ b/packages/api/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@nitrots/api",
+ "description": "Nitro api module",
+ "version": "1.0.0",
+ "type": "module",
+ "publishConfig": {
+ "access": "public"
+ },
+ "license": "GPL-3.0",
+ "scripts": {
+ "build": "vite build",
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "pixi.js": "^8.0.4"
+ },
+ "devDependencies": {
+ "typescript": "~5.4.2"
+ }
+}
diff --git a/packages/api/src/asset/IAsset.ts b/packages/api/src/asset/IAsset.ts
new file mode 100644
index 0000000..f4e4fb4
--- /dev/null
+++ b/packages/api/src/asset/IAsset.ts
@@ -0,0 +1,9 @@
+export interface IAsset
+{
+ source?: string;
+ x?: number;
+ y?: number;
+ flipH?: boolean;
+ flipV?: boolean;
+ usesPalette?: boolean;
+}
diff --git a/packages/api/src/asset/IAssetAlias.ts b/packages/api/src/asset/IAssetAlias.ts
new file mode 100644
index 0000000..5c14027
--- /dev/null
+++ b/packages/api/src/asset/IAssetAlias.ts
@@ -0,0 +1,6 @@
+export interface IAssetAlias
+{
+ link?: string;
+ flipH?: boolean;
+ flipV?: boolean;
+}
diff --git a/packages/api/src/asset/IAssetData.ts b/packages/api/src/asset/IAssetData.ts
new file mode 100644
index 0000000..f12820f
--- /dev/null
+++ b/packages/api/src/asset/IAssetData.ts
@@ -0,0 +1,23 @@
+import { IAssetAnimation } from './animation';
+import { IAsset } from './IAsset';
+import { IAssetAlias } from './IAssetAlias';
+import { IAssetPalette } from './IAssetPalette';
+import { IAssetLogicData } from './logic';
+import { IAssetRoomVisualizationData } from './room-visualization';
+import { ISpritesheetData } from './spritesheet';
+import { IAssetVisualizationData } from './visualization';
+
+export interface IAssetData {
+ type?: string;
+ name?: string;
+ visualizationType?: string;
+ logicType?: string;
+ spritesheet?: ISpritesheetData;
+ logic?: IAssetLogicData;
+ assets?: { [index: string]: IAsset };
+ aliases?: { [index: string]: IAssetAlias };
+ animations?: { [index: string]: IAssetAnimation };
+ palettes?: { [index: string]: IAssetPalette };
+ visualizations?: IAssetVisualizationData[];
+ roomVisualization?: IAssetRoomVisualizationData;
+}
diff --git a/packages/api/src/asset/IAssetManager.ts b/packages/api/src/asset/IAssetManager.ts
new file mode 100644
index 0000000..6457e28
--- /dev/null
+++ b/packages/api/src/asset/IAssetManager.ts
@@ -0,0 +1,18 @@
+
+import { Spritesheet, Texture } from 'pixi.js';
+import { IAssetData } from './IAssetData';
+import { IGraphicAsset } from './IGraphicAsset';
+import { IGraphicAssetCollection } from './IGraphicAssetCollection';
+
+export interface IAssetManager
+{
+ getTexture(name: string): Texture;
+ setTexture(name: string, texture: Texture): void;
+ addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override?: boolean): boolean;
+ getAsset(name: string): IGraphicAsset;
+ getCollection(name: string): IGraphicAssetCollection;
+ createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection;
+ downloadAssets(urls: string[]): Promise;
+ downloadAsset(url: string): Promise;
+ readonly collections: Map;
+}
diff --git a/packages/api/src/asset/IAssetPalette.ts b/packages/api/src/asset/IAssetPalette.ts
new file mode 100644
index 0000000..9b0384b
--- /dev/null
+++ b/packages/api/src/asset/IAssetPalette.ts
@@ -0,0 +1,12 @@
+export interface IAssetPalette
+{
+ id?: number;
+ source?: string;
+ master?: boolean;
+ tags?: string[];
+ breed?: number;
+ colorTag?: number;
+ color1?: string;
+ color2?: string;
+ rgb?: [ number, number, number ][];
+}
diff --git a/packages/api/src/asset/IGraphicAsset.ts b/packages/api/src/asset/IGraphicAsset.ts
new file mode 100644
index 0000000..620a115
--- /dev/null
+++ b/packages/api/src/asset/IGraphicAsset.ts
@@ -0,0 +1,19 @@
+import { Rectangle, Texture } from 'pixi.js';
+
+export interface IGraphicAsset
+{
+ recycle(): void;
+ readonly name: string;
+ readonly source: string;
+ readonly texture: Texture;
+ readonly usesPalette: boolean;
+ readonly x: number;
+ readonly y: number;
+ readonly width: number;
+ readonly height: number;
+ readonly offsetX: number;
+ readonly offsetY: number;
+ readonly flipH: boolean;
+ readonly flipV: boolean;
+ readonly rectangle: Rectangle;
+}
diff --git a/packages/api/src/asset/IGraphicAssetCollection.ts b/packages/api/src/asset/IGraphicAssetCollection.ts
new file mode 100644
index 0000000..40a513b
--- /dev/null
+++ b/packages/api/src/asset/IGraphicAssetCollection.ts
@@ -0,0 +1,24 @@
+import { Texture, TextureSource } from 'pixi.js';
+import { IAssetData } from './IAssetData';
+import { IGraphicAsset } from './IGraphicAsset';
+import { IGraphicAssetPalette } from './IGraphicAssetPalette';
+
+export interface IGraphicAssetCollection
+{
+ dispose(): void;
+ addReference(): void;
+ removeReference(): void;
+ define(data: IAssetData): void;
+ getAsset(name: string): IGraphicAsset;
+ getAssetWithPalette(name: string, paletteName: string): IGraphicAsset;
+ getTexture(name: string): Texture;
+ getPaletteNames(): string[];
+ getPaletteColors(paletteName: string): number[];
+ getPalette(name: string): IGraphicAssetPalette;
+ addAsset(name: string, texture: Texture, override: boolean, x?: number, y?: number, flipH?: boolean, flipV?: boolean): boolean;
+ disposeAsset(name: string): void;
+ referenceCount: number;
+ name: string;
+ textureSource: TextureSource;
+ data: IAssetData;
+}
diff --git a/packages/api/src/asset/IGraphicAssetPalette.ts b/packages/api/src/asset/IGraphicAssetPalette.ts
new file mode 100644
index 0000000..cf4a8f5
--- /dev/null
+++ b/packages/api/src/asset/IGraphicAssetPalette.ts
@@ -0,0 +1,8 @@
+import { Texture } from 'pixi.js';
+
+export interface IGraphicAssetPalette
+{
+ applyPalette(texture: Texture): Texture;
+ primaryColor: number;
+ secondaryColor: number;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimation.ts b/packages/api/src/asset/animation/IAssetAnimation.ts
new file mode 100644
index 0000000..b35e0eb
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimation.ts
@@ -0,0 +1,23 @@
+import { IAssetAnimationAdd } from './IAssetAnimationAdd';
+import { IAssetAnimationAvatar } from './IAssetAnimationAvatar';
+import { IAssetAnimationDirection } from './IAssetAnimationDirection';
+import { IAssetAnimationFrame } from './IAssetAnimationFrame';
+import { IAssetAnimationOverride } from './IAssetAnimationOverride';
+import { IAssetAnimationRemove } from './IAssetAnimationRemove';
+import { IAssetAnimationShadow } from './IAssetAnimationShadow';
+import { IAssetAnimationSprite } from './IAssetAnimationSprite';
+
+export interface IAssetAnimation
+{
+ name?: string;
+ desc?: string;
+ resetOnToggle?: boolean;
+ directions?: IAssetAnimationDirection[];
+ shadows?: IAssetAnimationShadow[];
+ adds?: IAssetAnimationAdd[];
+ removes?: IAssetAnimationRemove[];
+ sprites?: IAssetAnimationSprite[];
+ frames?: IAssetAnimationFrame[];
+ avatars?: IAssetAnimationAvatar[];
+ overrides?: IAssetAnimationOverride[];
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationAdd.ts b/packages/api/src/asset/animation/IAssetAnimationAdd.ts
new file mode 100644
index 0000000..3da37c6
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationAdd.ts
@@ -0,0 +1,8 @@
+export interface IAssetAnimationAdd
+{
+ id?: string;
+ align?: string;
+ blend?: string;
+ ink?: number;
+ base?: string;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationAvatar.ts b/packages/api/src/asset/animation/IAssetAnimationAvatar.ts
new file mode 100644
index 0000000..dcd030e
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationAvatar.ts
@@ -0,0 +1,6 @@
+export interface IAssetAnimationAvatar
+{
+ ink?: number;
+ foreground?: string;
+ background?: string;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationDirection.ts b/packages/api/src/asset/animation/IAssetAnimationDirection.ts
new file mode 100644
index 0000000..0c18eae
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationDirection.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationDirection
+{
+ offset?: number;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationFrame.ts b/packages/api/src/asset/animation/IAssetAnimationFrame.ts
new file mode 100644
index 0000000..b8b88a0
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationFrame.ts
@@ -0,0 +1,8 @@
+import { IAssetAnimationFramePart } from './IAssetAnimationFramePart';
+
+export interface IAssetAnimationFrame
+{
+ repeats?: number;
+ fxs?: IAssetAnimationFramePart[];
+ bodyparts?: IAssetAnimationFramePart[];
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationFramePart.ts b/packages/api/src/asset/animation/IAssetAnimationFramePart.ts
new file mode 100644
index 0000000..ac8c093
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationFramePart.ts
@@ -0,0 +1,14 @@
+import { IAssetAnimationFramePartItem } from './IAssetAnimationFramePartItem';
+
+export interface IAssetAnimationFramePart
+{
+ id?: string;
+ frame?: number;
+ base?: string;
+ action?: string;
+ dx?: number;
+ dy?: number;
+ dz?: number;
+ dd?: number;
+ items?: IAssetAnimationFramePartItem[];
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts b/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts
new file mode 100644
index 0000000..45a7642
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationFramePartItem.ts
@@ -0,0 +1,5 @@
+export interface IAssetAnimationFramePartItem
+{
+ id?: string;
+ base?: string;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationOverride.ts b/packages/api/src/asset/animation/IAssetAnimationOverride.ts
new file mode 100644
index 0000000..3d56833
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationOverride.ts
@@ -0,0 +1,8 @@
+import { IAssetAnimationFrame } from './IAssetAnimationFrame';
+
+export interface IAssetAnimationOverride
+{
+ name?: string;
+ override?: string;
+ frames?: IAssetAnimationFrame[];
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationRemove.ts b/packages/api/src/asset/animation/IAssetAnimationRemove.ts
new file mode 100644
index 0000000..ac65fb5
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationRemove.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationRemove
+{
+ id?: string;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationShadow.ts b/packages/api/src/asset/animation/IAssetAnimationShadow.ts
new file mode 100644
index 0000000..dfe22a8
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationShadow.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationShadow
+{
+ id?: string;
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationSprite.ts b/packages/api/src/asset/animation/IAssetAnimationSprite.ts
new file mode 100644
index 0000000..afc7b05
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationSprite.ts
@@ -0,0 +1,11 @@
+import { IAssetAnimationSpriteDirection } from './IAssetAnimationSpriteDirection';
+
+export interface IAssetAnimationSprite
+{
+ id?: string;
+ member?: string;
+ directions?: number;
+ staticY?: number;
+ ink?: number;
+ directionList?: IAssetAnimationSpriteDirection[];
+}
diff --git a/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts b/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts
new file mode 100644
index 0000000..746719d
--- /dev/null
+++ b/packages/api/src/asset/animation/IAssetAnimationSpriteDirection.ts
@@ -0,0 +1,7 @@
+export interface IAssetAnimationSpriteDirection
+{
+ id?: number;
+ dx?: number;
+ dy?: number;
+ dz?: number;
+}
diff --git a/packages/api/src/asset/animation/index.ts b/packages/api/src/asset/animation/index.ts
new file mode 100644
index 0000000..56543d0
--- /dev/null
+++ b/packages/api/src/asset/animation/index.ts
@@ -0,0 +1,12 @@
+export * from './IAssetAnimation';
+export * from './IAssetAnimationAdd';
+export * from './IAssetAnimationAvatar';
+export * from './IAssetAnimationDirection';
+export * from './IAssetAnimationFrame';
+export * from './IAssetAnimationFramePart';
+export * from './IAssetAnimationFramePartItem';
+export * from './IAssetAnimationOverride';
+export * from './IAssetAnimationRemove';
+export * from './IAssetAnimationShadow';
+export * from './IAssetAnimationSprite';
+export * from './IAssetAnimationSpriteDirection';
diff --git a/packages/api/src/asset/index.ts b/packages/api/src/asset/index.ts
new file mode 100644
index 0000000..1211968
--- /dev/null
+++ b/packages/api/src/asset/index.ts
@@ -0,0 +1,19 @@
+export * from './IAsset';
+export * from './IAssetAlias';
+export * from './IAssetData';
+export * from './IAssetManager';
+export * from './IAssetPalette';
+export * from './IGraphicAsset';
+export * from './IGraphicAssetCollection';
+export * from './IGraphicAssetPalette';
+export * from './animation';
+export * from './logic';
+export * from './logic/model';
+export * from './logic/particlesystem';
+export * from './room-visualization';
+export * from './spritesheet';
+export * from './visualization';
+export * from './visualization/animation';
+export * from './visualization/color';
+export * from './visualization/gestures';
+export * from './visualization/postures';
diff --git a/packages/api/src/asset/logic/IAssetLogicCustomVars.ts b/packages/api/src/asset/logic/IAssetLogicCustomVars.ts
new file mode 100644
index 0000000..1ebd4a8
--- /dev/null
+++ b/packages/api/src/asset/logic/IAssetLogicCustomVars.ts
@@ -0,0 +1,4 @@
+export interface ICustomVars
+{
+ variables?: string[];
+}
diff --git a/packages/api/src/asset/logic/IAssetLogicData.ts b/packages/api/src/asset/logic/IAssetLogicData.ts
new file mode 100644
index 0000000..acf484c
--- /dev/null
+++ b/packages/api/src/asset/logic/IAssetLogicData.ts
@@ -0,0 +1,17 @@
+import { ICustomVars } from './IAssetLogicCustomVars';
+import { IAssetLogicPlanetSystem } from './IAssetLogicPlanetSystem';
+import { ISoundSample } from './ISoundSample';
+import { IAssetLogicModel } from './model/IAssetLogicModel';
+import { IParticleSystem } from './particlesystem';
+
+export interface IAssetLogicData
+{
+ model?: IAssetLogicModel;
+ maskType?: string;
+ credits?: string;
+ soundSample?: ISoundSample;
+ action?: { link?: string, startState?: number };
+ planetSystems?: IAssetLogicPlanetSystem[];
+ particleSystems?: IParticleSystem[];
+ customVars?: ICustomVars;
+}
diff --git a/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts b/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts
new file mode 100644
index 0000000..47521bc
--- /dev/null
+++ b/packages/api/src/asset/logic/IAssetLogicPlanetSystem.ts
@@ -0,0 +1,11 @@
+export interface IAssetLogicPlanetSystem
+{
+ id?: number;
+ name?: string;
+ parent?: string;
+ radius?: number;
+ arcSpeed?: number;
+ arcOffset?: number;
+ blend?: number;
+ height?: number;
+}
diff --git a/packages/api/src/asset/logic/ISoundSample.ts b/packages/api/src/asset/logic/ISoundSample.ts
new file mode 100644
index 0000000..003f9f6
--- /dev/null
+++ b/packages/api/src/asset/logic/ISoundSample.ts
@@ -0,0 +1,5 @@
+export interface ISoundSample
+{
+ id?: number;
+ noPitch?: boolean;
+}
diff --git a/packages/api/src/asset/logic/index.ts b/packages/api/src/asset/logic/index.ts
new file mode 100644
index 0000000..569907b
--- /dev/null
+++ b/packages/api/src/asset/logic/index.ts
@@ -0,0 +1,6 @@
+export * from './IAssetLogicCustomVars';
+export * from './IAssetLogicData';
+export * from './IAssetLogicPlanetSystem';
+export * from './ISoundSample';
+export * from './model';
+export * from './particlesystem';
diff --git a/packages/api/src/asset/logic/model/IAssetDimension.ts b/packages/api/src/asset/logic/model/IAssetDimension.ts
new file mode 100644
index 0000000..4a4629f
--- /dev/null
+++ b/packages/api/src/asset/logic/model/IAssetDimension.ts
@@ -0,0 +1,6 @@
+export interface IAssetDimension
+{
+ x: number;
+ y: number;
+ z?: number;
+}
\ No newline at end of file
diff --git a/packages/api/src/asset/logic/model/IAssetLogicModel.ts b/packages/api/src/asset/logic/model/IAssetLogicModel.ts
new file mode 100644
index 0000000..eef3245
--- /dev/null
+++ b/packages/api/src/asset/logic/model/IAssetLogicModel.ts
@@ -0,0 +1,7 @@
+import { IAssetDimension } from './IAssetDimension';
+
+export interface IAssetLogicModel
+{
+ dimensions?: IAssetDimension;
+ directions?: number[];
+}
diff --git a/packages/api/src/asset/logic/model/index.ts b/packages/api/src/asset/logic/model/index.ts
new file mode 100644
index 0000000..4d08a72
--- /dev/null
+++ b/packages/api/src/asset/logic/model/index.ts
@@ -0,0 +1,2 @@
+export * from './IAssetDimension';
+export * from './IAssetLogicModel';
diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts
new file mode 100644
index 0000000..871f5f3
--- /dev/null
+++ b/packages/api/src/asset/logic/particlesystem/IParticleSystem.ts
@@ -0,0 +1,11 @@
+import { IParticleSystemEmitter } from './IParticleSystemEmitter';
+
+export interface IParticleSystem
+{
+ size?: number;
+ canvasId?: number;
+ offsetY?: number;
+ blend?: number;
+ bgColor?: string;
+ emitters?: IParticleSystemEmitter[];
+}
diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts
new file mode 100644
index 0000000..fa175e2
--- /dev/null
+++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemEmitter.ts
@@ -0,0 +1,15 @@
+import { IParticleSystemParticle } from './IParticleSystemParticle';
+import { IParticleSystemSimulation } from './IParticleSystemSimulation';
+
+export interface IParticleSystemEmitter
+{
+ id?: number;
+ name?: string;
+ spriteId?: number;
+ maxNumParticles?: number;
+ particlesPerFrame?: number;
+ burstPulse?: number;
+ fuseTime?: number;
+ simulation?: IParticleSystemSimulation;
+ particles?: IParticleSystemParticle[];
+}
diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts
new file mode 100644
index 0000000..99281fa
--- /dev/null
+++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemParticle.ts
@@ -0,0 +1,7 @@
+export interface IParticleSystemParticle
+{
+ isEmitter?: boolean;
+ lifeTime?: number;
+ fade?: boolean;
+ frames?: string[];
+}
diff --git a/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts b/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts
new file mode 100644
index 0000000..fef400c
--- /dev/null
+++ b/packages/api/src/asset/logic/particlesystem/IParticleSystemSimulation.ts
@@ -0,0 +1,9 @@
+export interface IParticleSystemSimulation
+{
+ force?: number;
+ direction?: number;
+ gravity?: number;
+ airFriction?: number;
+ shape?: string;
+ energy?: number;
+}
diff --git a/packages/api/src/asset/logic/particlesystem/index.ts b/packages/api/src/asset/logic/particlesystem/index.ts
new file mode 100644
index 0000000..428f6fc
--- /dev/null
+++ b/packages/api/src/asset/logic/particlesystem/index.ts
@@ -0,0 +1,4 @@
+export * from './IParticleSystem';
+export * from './IParticleSystemEmitter';
+export * from './IParticleSystemParticle';
+export * from './IParticleSystemSimulation';
diff --git a/packages/api/src/asset/room-visualization/IAssetPlane.ts b/packages/api/src/asset/room-visualization/IAssetPlane.ts
new file mode 100644
index 0000000..6007641
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlane.ts
@@ -0,0 +1,8 @@
+import { IAssetPlaneVisualization } from './IAssetPlaneVisualization';
+
+export interface IAssetPlane
+{
+ id?: string;
+ visualizations?: IAssetPlaneVisualization[];
+ animatedVisualization?: IAssetPlaneVisualization[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts
new file mode 100644
index 0000000..0fd8465
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMask.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaskVisualization } from './IAssetPlaneMaskVisualization';
+
+export interface IAssetPlaneMask
+{
+ id?: string;
+ visualizations?: IAssetPlaneMaskVisualization[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts
new file mode 100644
index 0000000..2767b59
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaskData.ts
@@ -0,0 +1,6 @@
+import { IAssetPlaneMask } from './IAssetPlaneMask';
+
+export interface IAssetPlaneMaskData
+{
+ masks?: IAssetPlaneMask[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts
new file mode 100644
index 0000000..66c5ae8
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaskVisualization.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap';
+
+export interface IAssetPlaneMaskVisualization
+{
+ size?: number;
+ bitmaps?: IAssetPlaneTextureBitmap[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts
new file mode 100644
index 0000000..59ae007
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterial.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaterialCellMatrix } from './IAssetPlaneMaterialCellMatrix';
+
+export interface IAssetPlaneMaterial
+{
+ id?: string;
+ matrices?: IAssetPlaneMaterialCellMatrix[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts
new file mode 100644
index 0000000..fafae27
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCell.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaterialCellExtraItemData } from './IAssetPlaneMaterialCellExtraItemData';
+
+export interface IAssetPlaneMaterialCell
+{
+ textureId?: string;
+ extraData?: IAssetPlaneMaterialCellExtraItemData;
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts
new file mode 100644
index 0000000..d2b36d3
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts
@@ -0,0 +1,8 @@
+import { IAssetPlaneMaterialCell } from './IAssetPlaneMaterialCell';
+
+export interface IAssetPlaneMaterialCellColumn
+{
+ repeatMode?: string;
+ width?: number;
+ cells?: IAssetPlaneMaterialCell[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts
new file mode 100644
index 0000000..a49833f
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts
@@ -0,0 +1,6 @@
+export interface IAssetPlaneMaterialCellExtraItemData
+{
+ limitMax?: number;
+ extraItemTypes?: string[];
+ offsets?: [number, number][];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts
new file mode 100644
index 0000000..526cde2
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts
@@ -0,0 +1,12 @@
+import { IAssetPlaneMaterialCellColumn } from './IAssetPlaneMaterialCellColumn';
+
+export interface IAssetPlaneMaterialCellMatrix
+{
+ repeatMode?: string;
+ align?: string;
+ normalMinX?: number;
+ normalMaxX?: number;
+ normalMinY?: number;
+ normalMaxY?: number;
+ columns?: IAssetPlaneMaterialCellColumn[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts b/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts
new file mode 100644
index 0000000..fff62fa
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneTexture.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap';
+
+export interface IAssetPlaneTexture
+{
+ id?: string;
+ bitmaps?: IAssetPlaneTextureBitmap[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts b/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts
new file mode 100644
index 0000000..e1af985
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneTextureBitmap.ts
@@ -0,0 +1,8 @@
+export interface IAssetPlaneTextureBitmap
+{
+ assetName?: string;
+ normalMinX?: number;
+ normalMaxX?: number;
+ normalMinY?: number;
+ normalMaxY?: number;
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts
new file mode 100644
index 0000000..db3b4de
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualization.ts
@@ -0,0 +1,10 @@
+import { IAssetPlaneVisualizationAnimatedLayer } from './IAssetPlaneVisualizationAnimatedLayer';
+import { IAssetPlaneVisualizationLayer } from './IAssetPlaneVisualizationLayer';
+
+export interface IAssetPlaneVisualization
+{
+ size?: number;
+ horizontalAngle?: number;
+ verticalAngle?: number;
+ allLayers?: (IAssetPlaneVisualizationLayer | IAssetPlaneVisualizationAnimatedLayer)[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts
new file mode 100644
index 0000000..4cd50c2
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts
@@ -0,0 +1,6 @@
+import { IAssetPlaneVisualizationAnimatedLayerItem } from './IAssetPlaneVisualizationAnimatedLayerItem';
+
+export interface IAssetPlaneVisualizationAnimatedLayer
+{
+ items?: IAssetPlaneVisualizationAnimatedLayerItem[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts
new file mode 100644
index 0000000..9ee426e
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts
@@ -0,0 +1,11 @@
+export interface IAssetPlaneVisualizationAnimatedLayerItem
+{
+ id?: number;
+ assetId?: string;
+ x?: string;
+ y?: string;
+ randomX?: string;
+ randomY?: string;
+ speedX?: number;
+ speedY?: number;
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts
new file mode 100644
index 0000000..4e48d53
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationData.ts
@@ -0,0 +1,10 @@
+import { IAssetPlane } from './IAssetPlane';
+import { IAssetPlaneMaterial } from './IAssetPlaneMaterial';
+import { IAssetPlaneTexture } from './IAssetPlaneTexture';
+
+export interface IAssetPlaneVisualizationData
+{
+ planes?: IAssetPlane[];
+ materials?: IAssetPlaneMaterial[];
+ textures?: IAssetPlaneTexture[];
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts
new file mode 100644
index 0000000..e009893
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetPlaneVisualizationLayer.ts
@@ -0,0 +1,7 @@
+export interface IAssetPlaneVisualizationLayer
+{
+ materialId?: string;
+ color?: number;
+ offset?: number;
+ align?: string;
+}
diff --git a/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts b/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts
new file mode 100644
index 0000000..e82ea8f
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/IAssetRoomVisualizationData.ts
@@ -0,0 +1,10 @@
+import { IAssetPlaneMaskData } from './IAssetPlaneMaskData';
+import { IAssetPlaneVisualizationData } from './IAssetPlaneVisualizationData';
+
+export interface IAssetRoomVisualizationData
+{
+ floorData?: IAssetPlaneVisualizationData;
+ wallData?: IAssetPlaneVisualizationData;
+ landscapeData?: IAssetPlaneVisualizationData;
+ maskData?: IAssetPlaneMaskData;
+}
diff --git a/packages/api/src/asset/room-visualization/index.ts b/packages/api/src/asset/room-visualization/index.ts
new file mode 100644
index 0000000..4d6face
--- /dev/null
+++ b/packages/api/src/asset/room-visualization/index.ts
@@ -0,0 +1,17 @@
+export * from './IAssetPlane';
+export * from './IAssetPlaneMask';
+export * from './IAssetPlaneMaskData';
+export * from './IAssetPlaneMaskVisualization';
+export * from './IAssetPlaneMaterial';
+export * from './IAssetPlaneMaterialCell';
+export * from './IAssetPlaneMaterialCellColumn';
+export * from './IAssetPlaneMaterialCellExtraItemData';
+export * from './IAssetPlaneMaterialCellMatrix';
+export * from './IAssetPlaneTexture';
+export * from './IAssetPlaneTextureBitmap';
+export * from './IAssetPlaneVisualization';
+export * from './IAssetPlaneVisualizationAnimatedLayer';
+export * from './IAssetPlaneVisualizationAnimatedLayerItem';
+export * from './IAssetPlaneVisualizationData';
+export * from './IAssetPlaneVisualizationLayer';
+export * from './IAssetRoomVisualizationData';
diff --git a/packages/api/src/asset/spritesheet/ISpritesheetData.ts b/packages/api/src/asset/spritesheet/ISpritesheetData.ts
new file mode 100644
index 0000000..3d96adc
--- /dev/null
+++ b/packages/api/src/asset/spritesheet/ISpritesheetData.ts
@@ -0,0 +1,9 @@
+import { SpritesheetData } from 'pixi.js';
+import { ISpritesheetFrame } from './ISpritesheetFrame';
+import { ISpritesheetMeta } from './ISpritesheetMeta';
+
+export interface ISpritesheetData extends SpritesheetData
+{
+ meta: ISpritesheetMeta;
+ frames: { [index: string]: ISpritesheetFrame };
+}
diff --git a/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts b/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts
new file mode 100644
index 0000000..0833b50
--- /dev/null
+++ b/packages/api/src/asset/spritesheet/ISpritesheetFrame.ts
@@ -0,0 +1,25 @@
+export interface ISpritesheetFrame
+{
+ frame: {
+ x: number;
+ y: number;
+ w: number;
+ h: number;
+ };
+ rotated: boolean;
+ trimmed: boolean;
+ spriteSourceSize: {
+ x: number;
+ y: number;
+ w: number;
+ h: number;
+ };
+ sourceSize: {
+ w: number;
+ h: number;
+ };
+ pivot: {
+ x: number;
+ y: number;
+ };
+}
diff --git a/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts b/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts
new file mode 100644
index 0000000..3a74f7b
--- /dev/null
+++ b/packages/api/src/asset/spritesheet/ISpritesheetMeta.ts
@@ -0,0 +1,12 @@
+export interface ISpritesheetMeta
+{
+ app: string;
+ version: string;
+ image: string;
+ format: string;
+ size: {
+ w: number;
+ h: number;
+ };
+ scale: string;
+}
diff --git a/packages/api/src/asset/spritesheet/index.ts b/packages/api/src/asset/spritesheet/index.ts
new file mode 100644
index 0000000..9c94e8b
--- /dev/null
+++ b/packages/api/src/asset/spritesheet/index.ts
@@ -0,0 +1,3 @@
+export * from './ISpritesheetData';
+export * from './ISpritesheetFrame';
+export * from './ISpritesheetMeta';
diff --git a/packages/api/src/asset/visualization/IAssetVisualizationData.ts b/packages/api/src/asset/visualization/IAssetVisualizationData.ts
new file mode 100644
index 0000000..e92f959
--- /dev/null
+++ b/packages/api/src/asset/visualization/IAssetVisualizationData.ts
@@ -0,0 +1,20 @@
+import { IAssetVisualAnimation } from './animation';
+import { IAssetColor } from './color';
+import { IAssetGesture } from './gestures';
+import { IAssetVisualizationDirection } from './IAssetVisualizationDirection';
+import { IAssetVisualizationLayer } from './IAssetVisualizationLayer';
+import { IAssetPosture } from './postures/IAssetPosture';
+
+export interface IAssetVisualizationData
+{
+ size?: number;
+ layerCount?: number;
+ angle?: number;
+ layers?: { [index: string]: IAssetVisualizationLayer };
+ colors?: { [index: string]: IAssetColor };
+ directions?: { [index: string]: IAssetVisualizationDirection };
+ animations?: { [index: string]: IAssetVisualAnimation };
+ defaultPosture?: string;
+ postures?: { defaultPosture?: string, postures?: IAssetPosture[] };
+ gestures?: IAssetGesture[];
+}
diff --git a/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts b/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts
new file mode 100644
index 0000000..cc628f1
--- /dev/null
+++ b/packages/api/src/asset/visualization/IAssetVisualizationDirection.ts
@@ -0,0 +1,6 @@
+import { IAssetVisualizationLayer } from './IAssetVisualizationLayer';
+
+export interface IAssetVisualizationDirection
+{
+ layers?: { [index: string]: IAssetVisualizationLayer };
+}
diff --git a/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts b/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts
new file mode 100644
index 0000000..61fcf56
--- /dev/null
+++ b/packages/api/src/asset/visualization/IAssetVisualizationLayer.ts
@@ -0,0 +1,10 @@
+export interface IAssetVisualizationLayer
+{
+ x?: number;
+ y?: number;
+ z?: number;
+ alpha?: number;
+ ink?: string;
+ tag?: string;
+ ignoreMouse?: boolean;
+}
\ No newline at end of file
diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts
new file mode 100644
index 0000000..4e71438
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimation.ts
@@ -0,0 +1,10 @@
+import { IAssetVisualAnimationLayer } from './IAssetVisualAnimationLayer';
+
+export interface IAssetVisualAnimation
+{
+ transitionTo?: number;
+ transitionFrom?: number;
+ immediateChangeFrom?: string;
+ randomStart?: boolean;
+ layers?: { [index: string]: IAssetVisualAnimationLayer };
+}
diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts
new file mode 100644
index 0000000..2a274ea
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationLayer.ts
@@ -0,0 +1,9 @@
+import { IAssetVisualAnimationSequence } from './IAssetVisualAnimationSequence';
+
+export interface IAssetVisualAnimationLayer
+{
+ loopCount?: number;
+ frameRepeat?: number;
+ random?: number;
+ frameSequences?: { [index: string]: IAssetVisualAnimationSequence };
+}
diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts
new file mode 100644
index 0000000..bb25104
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequence.ts
@@ -0,0 +1,8 @@
+import { IAssetVisualAnimationSequenceFrame } from './IAssetVisualAnimationSequenceFrame';
+
+export interface IAssetVisualAnimationSequence
+{
+ loopCount?: number;
+ random?: number;
+ frames?: { [index: string]: IAssetVisualAnimationSequenceFrame };
+}
diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
new file mode 100644
index 0000000..196631e
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
@@ -0,0 +1,11 @@
+import { IAssetVisualAnimationSequenceFrameOffset } from './IAssetVisualAnimationSequenceFrameOffset';
+
+export interface IAssetVisualAnimationSequenceFrame
+{
+ id?: number;
+ x?: number;
+ y?: number;
+ randomX?: number;
+ randomY?: number;
+ offsets?: { [index: string]: IAssetVisualAnimationSequenceFrameOffset };
+}
diff --git a/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
new file mode 100644
index 0000000..bc85461
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
@@ -0,0 +1,6 @@
+export interface IAssetVisualAnimationSequenceFrameOffset
+{
+ direction?: number;
+ x?: number;
+ y?: number;
+}
diff --git a/packages/api/src/asset/visualization/animation/index.ts b/packages/api/src/asset/visualization/animation/index.ts
new file mode 100644
index 0000000..19b332c
--- /dev/null
+++ b/packages/api/src/asset/visualization/animation/index.ts
@@ -0,0 +1,5 @@
+export * from './IAssetVisualAnimation';
+export * from './IAssetVisualAnimationLayer';
+export * from './IAssetVisualAnimationSequence';
+export * from './IAssetVisualAnimationSequenceFrame';
+export * from './IAssetVisualAnimationSequenceFrameOffset';
diff --git a/packages/api/src/asset/visualization/color/IAssetColor.ts b/packages/api/src/asset/visualization/color/IAssetColor.ts
new file mode 100644
index 0000000..29ebc75
--- /dev/null
+++ b/packages/api/src/asset/visualization/color/IAssetColor.ts
@@ -0,0 +1,6 @@
+import { IAssetColorLayer } from './IAssetColorLayer';
+
+export interface IAssetColor
+{
+ layers?: { [index: string]: IAssetColorLayer };
+}
diff --git a/packages/api/src/asset/visualization/color/IAssetColorLayer.ts b/packages/api/src/asset/visualization/color/IAssetColorLayer.ts
new file mode 100644
index 0000000..7a1372e
--- /dev/null
+++ b/packages/api/src/asset/visualization/color/IAssetColorLayer.ts
@@ -0,0 +1,4 @@
+export interface IAssetColorLayer
+{
+ color?: number;
+}
diff --git a/packages/api/src/asset/visualization/color/index.ts b/packages/api/src/asset/visualization/color/index.ts
new file mode 100644
index 0000000..00aff50
--- /dev/null
+++ b/packages/api/src/asset/visualization/color/index.ts
@@ -0,0 +1,2 @@
+export * from './IAssetColor';
+export * from './IAssetColorLayer';
diff --git a/packages/api/src/asset/visualization/gestures/IAssetGesture.ts b/packages/api/src/asset/visualization/gestures/IAssetGesture.ts
new file mode 100644
index 0000000..ddf3752
--- /dev/null
+++ b/packages/api/src/asset/visualization/gestures/IAssetGesture.ts
@@ -0,0 +1,5 @@
+export interface IAssetGesture
+{
+ id?: string;
+ animationId?: number;
+}
diff --git a/packages/api/src/asset/visualization/gestures/index.ts b/packages/api/src/asset/visualization/gestures/index.ts
new file mode 100644
index 0000000..2c6e978
--- /dev/null
+++ b/packages/api/src/asset/visualization/gestures/index.ts
@@ -0,0 +1 @@
+export * from './IAssetGesture';
diff --git a/packages/api/src/asset/visualization/index.ts b/packages/api/src/asset/visualization/index.ts
new file mode 100644
index 0000000..ec77223
--- /dev/null
+++ b/packages/api/src/asset/visualization/index.ts
@@ -0,0 +1,7 @@
+export * from './IAssetVisualizationData';
+export * from './IAssetVisualizationDirection';
+export * from './IAssetVisualizationLayer';
+export * from './animation';
+export * from './color';
+export * from './gestures';
+export * from './postures';
diff --git a/packages/api/src/asset/visualization/postures/IAssetPosture.ts b/packages/api/src/asset/visualization/postures/IAssetPosture.ts
new file mode 100644
index 0000000..3313851
--- /dev/null
+++ b/packages/api/src/asset/visualization/postures/IAssetPosture.ts
@@ -0,0 +1,5 @@
+export interface IAssetPosture
+{
+ id?: string;
+ animationId?: number;
+}
diff --git a/packages/api/src/asset/visualization/postures/index.ts b/packages/api/src/asset/visualization/postures/index.ts
new file mode 100644
index 0000000..c24c1b9
--- /dev/null
+++ b/packages/api/src/asset/visualization/postures/index.ts
@@ -0,0 +1 @@
+export * from './IAssetPosture';
diff --git a/packages/api/src/common/IDisposable.ts b/packages/api/src/common/IDisposable.ts
new file mode 100644
index 0000000..b9f6040
--- /dev/null
+++ b/packages/api/src/common/IDisposable.ts
@@ -0,0 +1,5 @@
+export interface IDisposable
+{
+ dispose(): void;
+ disposed: boolean;
+}
\ No newline at end of file
diff --git a/packages/api/src/common/IEventDispatcher.ts b/packages/api/src/common/IEventDispatcher.ts
new file mode 100644
index 0000000..2e4ebdb
--- /dev/null
+++ b/packages/api/src/common/IEventDispatcher.ts
@@ -0,0 +1,10 @@
+import { INitroEvent } from './INitroEvent';
+
+export interface IEventDispatcher
+{
+ dispose(): void;
+ addEventListener(type: string, callback: (event: T) => void): void;
+ removeEventListener(type: string, callback: Function): void;
+ removeAllListeners(): void;
+ dispatchEvent(event: T): boolean;
+}
diff --git a/packages/api/src/common/ILinkEventTracker.ts b/packages/api/src/common/ILinkEventTracker.ts
new file mode 100644
index 0000000..311567d
--- /dev/null
+++ b/packages/api/src/common/ILinkEventTracker.ts
@@ -0,0 +1,5 @@
+export interface ILinkEventTracker
+{
+ linkReceived(link: string): void;
+ eventUrlPrefix: string;
+}
\ No newline at end of file
diff --git a/packages/api/src/common/INitroEvent.ts b/packages/api/src/common/INitroEvent.ts
new file mode 100644
index 0000000..e063ad8
--- /dev/null
+++ b/packages/api/src/common/INitroEvent.ts
@@ -0,0 +1,4 @@
+export interface INitroEvent
+{
+ type: string;
+}
diff --git a/packages/api/src/common/INitroManager.ts b/packages/api/src/common/INitroManager.ts
new file mode 100644
index 0000000..22ac5f8
--- /dev/null
+++ b/packages/api/src/common/INitroManager.ts
@@ -0,0 +1,10 @@
+import { IDisposable } from './IDisposable';
+import { IEventDispatcher } from './IEventDispatcher';
+
+export interface INitroManager extends IDisposable
+{
+ init(): void;
+ events: IEventDispatcher;
+ isLoaded: boolean;
+ isLoading: boolean;
+}
diff --git a/packages/api/src/common/IUpdateReceiver.ts b/packages/api/src/common/IUpdateReceiver.ts
new file mode 100644
index 0000000..9bc3b4e
--- /dev/null
+++ b/packages/api/src/common/IUpdateReceiver.ts
@@ -0,0 +1,6 @@
+import { Ticker } from 'pixi.js';
+
+export interface IUpdateReceiver
+{
+ update(ticker: Ticker): void;
+}
diff --git a/packages/api/src/common/index.ts b/packages/api/src/common/index.ts
new file mode 100644
index 0000000..856b24c
--- /dev/null
+++ b/packages/api/src/common/index.ts
@@ -0,0 +1,6 @@
+export * from './IDisposable';
+export * from './IEventDispatcher';
+export * from './ILinkEventTracker';
+export * from './INitroEvent';
+export * from './INitroManager';
+export * from './IUpdateReceiver';
diff --git a/packages/api/src/communication/ICodec.ts b/packages/api/src/communication/ICodec.ts
new file mode 100644
index 0000000..39c4b29
--- /dev/null
+++ b/packages/api/src/communication/ICodec.ts
@@ -0,0 +1,9 @@
+import { IBinaryWriter } from '../utils';
+import { IConnection } from './IConnection';
+import { IMessageDataWrapper } from './IMessageDataWrapper';
+
+export interface ICodec
+{
+ encode(header: number, messages: any[]): IBinaryWriter;
+ decode(connection: IConnection): IMessageDataWrapper[];
+}
diff --git a/packages/api/src/communication/ICommunicationManager.ts b/packages/api/src/communication/ICommunicationManager.ts
new file mode 100644
index 0000000..7c15877
--- /dev/null
+++ b/packages/api/src/communication/ICommunicationManager.ts
@@ -0,0 +1,10 @@
+import { IConnection } from './IConnection';
+import { IMessageEvent } from './IMessageEvent';
+
+export interface ICommunicationManager
+{
+ init(): Promise;
+ registerMessageEvent(event: IMessageEvent): IMessageEvent;
+ removeMessageEvent(event: IMessageEvent): void;
+ connection: IConnection;
+}
diff --git a/packages/api/src/communication/IConnection.ts b/packages/api/src/communication/IConnection.ts
new file mode 100644
index 0000000..3139c22
--- /dev/null
+++ b/packages/api/src/communication/IConnection.ts
@@ -0,0 +1,17 @@
+import { IMessageComposer } from './IMessageComposer';
+import { IMessageConfiguration } from './IMessageConfiguration';
+import { IMessageEvent } from './IMessageEvent';
+
+export interface IConnection
+{
+ init(socketUrl: string): void;
+ ready(): void;
+ authenticated(): void;
+ send(...composers: IMessageComposer[]): void;
+ processReceivedData(): void;
+ registerMessages(configuration: IMessageConfiguration): void;
+ addMessageEvent(event: IMessageEvent): void;
+ removeMessageEvent(event: IMessageEvent): void;
+ isAuthenticated: boolean;
+ dataBuffer: ArrayBuffer;
+}
diff --git a/packages/api/src/communication/IConnectionStateListener.ts b/packages/api/src/communication/IConnectionStateListener.ts
new file mode 100644
index 0000000..d140fd0
--- /dev/null
+++ b/packages/api/src/communication/IConnectionStateListener.ts
@@ -0,0 +1,4 @@
+export interface IConnectionStateListener
+{
+ connectionInit(socketUrl: string): void;
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/IMessageComposer.ts b/packages/api/src/communication/IMessageComposer.ts
new file mode 100644
index 0000000..eb09bc8
--- /dev/null
+++ b/packages/api/src/communication/IMessageComposer.ts
@@ -0,0 +1,5 @@
+export interface IMessageComposer
+{
+ dispose(): void;
+ getMessageArray(): T;
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/IMessageConfiguration.ts b/packages/api/src/communication/IMessageConfiguration.ts
new file mode 100644
index 0000000..03efd30
--- /dev/null
+++ b/packages/api/src/communication/IMessageConfiguration.ts
@@ -0,0 +1,5 @@
+export interface IMessageConfiguration
+{
+ events: Map;
+ composers: Map;
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/IMessageDataWrapper.ts b/packages/api/src/communication/IMessageDataWrapper.ts
new file mode 100644
index 0000000..0f1c39f
--- /dev/null
+++ b/packages/api/src/communication/IMessageDataWrapper.ts
@@ -0,0 +1,15 @@
+import { IBinaryReader } from '../utils';
+
+export interface IMessageDataWrapper
+{
+ readByte(): number;
+ readBytes(length: number): IBinaryReader;
+ readBoolean(): boolean;
+ readShort(): number;
+ readInt(): number;
+ readFloat(): number;
+ readDouble(): number;
+ readString(): string;
+ header: number;
+ bytesAvailable: boolean;
+}
diff --git a/packages/api/src/communication/IMessageEvent.ts b/packages/api/src/communication/IMessageEvent.ts
new file mode 100644
index 0000000..5949015
--- /dev/null
+++ b/packages/api/src/communication/IMessageEvent.ts
@@ -0,0 +1,11 @@
+import { IConnection } from './IConnection';
+import { IMessageParser } from './IMessageParser';
+
+export interface IMessageEvent
+{
+ dispose(): void;
+ callBack: Function;
+ parserClass: Function;
+ parser: IMessageParser;
+ connection: IConnection;
+}
diff --git a/packages/api/src/communication/IMessageParser.ts b/packages/api/src/communication/IMessageParser.ts
new file mode 100644
index 0000000..f10a50d
--- /dev/null
+++ b/packages/api/src/communication/IMessageParser.ts
@@ -0,0 +1,7 @@
+import { IMessageDataWrapper } from './IMessageDataWrapper';
+
+export interface IMessageParser
+{
+ flush(): boolean;
+ parse(wrapper: IMessageDataWrapper): boolean;
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts b/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts
new file mode 100644
index 0000000..abd127f
--- /dev/null
+++ b/packages/api/src/communication/enums/ClientDeviceCategoryEnum.ts
@@ -0,0 +1,5 @@
+export class ClientDeviceCategoryEnum
+{
+ public static UNKNOWN: number = 0;
+ public static BROWSER: number = 1;
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/enums/ClientPlatformEnum.ts b/packages/api/src/communication/enums/ClientPlatformEnum.ts
new file mode 100644
index 0000000..417b811
--- /dev/null
+++ b/packages/api/src/communication/enums/ClientPlatformEnum.ts
@@ -0,0 +1,7 @@
+export class ClientPlatformEnum
+{
+ public static UNKNOWN: number = 0;
+ public static FLASH: number = 1;
+ public static HTML5: number = 2;
+
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/enums/WebSocketEventEnum.ts b/packages/api/src/communication/enums/WebSocketEventEnum.ts
new file mode 100644
index 0000000..303b79c
--- /dev/null
+++ b/packages/api/src/communication/enums/WebSocketEventEnum.ts
@@ -0,0 +1,7 @@
+export class WebSocketEventEnum
+{
+ public static CONNECTION_OPENED = 'open';
+ public static CONNECTION_CLOSED = 'close';
+ public static CONNECTION_ERROR = 'error';
+ public static CONNECTION_MESSAGE = 'message';
+}
\ No newline at end of file
diff --git a/packages/api/src/communication/enums/index.ts b/packages/api/src/communication/enums/index.ts
new file mode 100644
index 0000000..42a2270
--- /dev/null
+++ b/packages/api/src/communication/enums/index.ts
@@ -0,0 +1,3 @@
+export * from './ClientDeviceCategoryEnum';
+export * from './ClientPlatformEnum';
+export * from './WebSocketEventEnum';
diff --git a/packages/api/src/communication/index.ts b/packages/api/src/communication/index.ts
new file mode 100644
index 0000000..01b0ed3
--- /dev/null
+++ b/packages/api/src/communication/index.ts
@@ -0,0 +1,10 @@
+export * from './ICodec';
+export * from './ICommunicationManager';
+export * from './IConnection';
+export * from './IConnectionStateListener';
+export * from './IMessageComposer';
+export * from './IMessageConfiguration';
+export * from './IMessageDataWrapper';
+export * from './IMessageEvent';
+export * from './IMessageParser';
+export * from './enums';
diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts
new file mode 100644
index 0000000..d545082
--- /dev/null
+++ b/packages/api/src/index.ts
@@ -0,0 +1,43 @@
+export * from './asset';
+export * from './asset/animation';
+export * from './asset/logic';
+export * from './asset/logic/model';
+export * from './asset/logic/particlesystem';
+export * from './asset/room-visualization';
+export * from './asset/spritesheet';
+export * from './asset/visualization';
+export * from './asset/visualization/animation';
+export * from './asset/visualization/color';
+export * from './asset/visualization/gestures';
+export * from './asset/visualization/postures';
+export * from './common';
+export * from './communication';
+export * from './communication/enums';
+export * from './nitro';
+export * from './nitro/avatar';
+export * from './nitro/avatar/actions';
+export * from './nitro/avatar/animation';
+export * from './nitro/avatar/enum';
+export * from './nitro/avatar/figuredata';
+export * from './nitro/avatar/structure';
+export * from './nitro/camera';
+export * from './nitro/enums';
+export * from './nitro/localization';
+export * from './nitro/room';
+export * from './nitro/room/enums';
+export * from './nitro/room/object';
+export * from './nitro/room/object/data';
+export * from './nitro/room/object/data/type';
+export * from './nitro/room/utils';
+export * from './nitro/session';
+export * from './nitro/session/enum';
+export * from './nitro/sound';
+export * from './room';
+export * from './room/object';
+export * from './room/object/enum';
+export * from './room/object/logic';
+export * from './room/object/visualization';
+export * from './room/renderer';
+export * from './ui';
+export * from './ui/enums';
+export * from './utils';
diff --git a/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts b/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts
new file mode 100644
index 0000000..82e779a
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarAssetDownloadLibrary.ts
@@ -0,0 +1,6 @@
+export interface IAvatarAssetDownloadLibrary
+{
+ downloadAsset(): Promise;
+ readonly libraryName: string;
+ readonly isLoaded: boolean;
+}
diff --git a/packages/api/src/nitro/avatar/IAvatarEffectListener.ts b/packages/api/src/nitro/avatar/IAvatarEffectListener.ts
new file mode 100644
index 0000000..a04ebc3
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarEffectListener.ts
@@ -0,0 +1,4 @@
+export interface IAvatarEffectListener
+{
+ resetEffect(effect: number): void;
+}
diff --git a/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts b/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts
new file mode 100644
index 0000000..6e11806
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarFigureContainer.ts
@@ -0,0 +1,10 @@
+export interface IAvatarFigureContainer
+{
+ getPartTypeIds(): IterableIterator;
+ hasPartType(_arg_1: string): boolean;
+ getPartSetId(_arg_1: string): number;
+ getPartColorIds(_arg_1: string): number[];
+ updatePart(_arg_1: string, _arg_2: number, _arg_3: number[]): void;
+ removePart(_arg_1: string): void;
+ getFigureString(): string;
+}
diff --git a/packages/api/src/nitro/avatar/IAvatarImage.ts b/packages/api/src/nitro/avatar/IAvatarImage.ts
new file mode 100644
index 0000000..d8d5052
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarImage.ts
@@ -0,0 +1,29 @@
+import { Container, Texture } from 'pixi.js';
+import { IAvatarFigureContainer } from './IAvatarFigureContainer';
+import { IAnimationLayerData, ISpriteDataContainer } from './animation';
+import { IPartColor } from './structure';
+
+export interface IAvatarImage
+{
+ dispose(): void;
+ setDirection(_arg_1: string, _arg_2: number): void;
+ setDirectionAngle(_arg_1: string, _arg_2: number): void;
+ updateAnimationByFrames(_arg_1?: number): void;
+ getScale(): string;
+ getSprites(): ISpriteDataContainer[];
+ getLayerData(_arg_1: ISpriteDataContainer): IAnimationLayerData;
+ processAsTexture(setType: string, hightlight: boolean, texture?: Texture): Texture;
+ processAsImageUrl(setType: string): string;
+ processAsContainer(setType: string): Container;
+ getDirection(): number;
+ getFigure(): IAvatarFigureContainer;
+ getPartColor(_arg_1: string): IPartColor;
+ isAnimating(): boolean;
+ getCanvasOffsets(): number[];
+ initActionAppends(): void;
+ endActionAppends(): void;
+ appendAction(_arg_1: string, ..._args: any[]): boolean;
+ isPlaceholder(): boolean;
+ animationHasResetOnToggle: boolean;
+ resetAnimationFrameCounter(): void;
+}
diff --git a/packages/api/src/nitro/avatar/IAvatarImageListener.ts b/packages/api/src/nitro/avatar/IAvatarImageListener.ts
new file mode 100644
index 0000000..cc68c92
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarImageListener.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from '../../common';
+
+export interface IAvatarImageListener extends IDisposable
+{
+ resetFigure(figure: string): void;
+}
diff --git a/packages/api/src/nitro/avatar/IAvatarRenderManager.ts b/packages/api/src/nitro/avatar/IAvatarRenderManager.ts
new file mode 100644
index 0000000..a0e80ed
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IAvatarRenderManager.ts
@@ -0,0 +1,22 @@
+import { IAssetManager, IGraphicAsset } from '../../asset';
+import { IAvatarEffectListener } from './IAvatarEffectListener';
+import { IAvatarFigureContainer } from './IAvatarFigureContainer';
+import { IAvatarImage } from './IAvatarImage';
+import { IAvatarImageListener } from './IAvatarImageListener';
+import { IStructureData } from './structure';
+
+export interface IAvatarRenderManager
+{
+ init(): Promise;
+ createFigureContainer(figure: string): IAvatarFigureContainer;
+ isFigureContainerReady(container: IAvatarFigureContainer): boolean;
+ createAvatarImage(figure: string, size: string, gender: string, listener?: IAvatarImageListener, effectListener?: IAvatarEffectListener): IAvatarImage;
+ downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void;
+ getFigureClubLevel(container: IAvatarFigureContainer, gender: string, searchParts?: string[]): number;
+ isValidFigureSetForGender(setId: number, gender: string): boolean;
+ getFigureStringWithFigureIds(k: string, _arg_2: string, _arg_3: number[]): string;
+ getMandatoryAvatarPartSetIds(k: string, _arg_2: number): string[];
+ getAssetByName(name: string): IGraphicAsset;
+ assets: IAssetManager;
+ structureData: IStructureData;
+}
diff --git a/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts b/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts
new file mode 100644
index 0000000..b76a32e
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IEffectAssetDownloadLibrary.ts
@@ -0,0 +1,9 @@
+import { IAssetAnimation } from '../../asset';
+
+export interface IEffectAssetDownloadLibrary
+{
+ downloadAsset(): void;
+ readonly libraryName: string;
+ readonly animation: { [index: string]: IAssetAnimation };
+ readonly isLoaded: boolean;
+}
diff --git a/packages/api/src/nitro/avatar/IOutfit.ts b/packages/api/src/nitro/avatar/IOutfit.ts
new file mode 100644
index 0000000..e797d6f
--- /dev/null
+++ b/packages/api/src/nitro/avatar/IOutfit.ts
@@ -0,0 +1,5 @@
+export interface IOutfit
+{
+ figure: string;
+ gender: string;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/actions/IActionDefinition.ts b/packages/api/src/nitro/avatar/actions/IActionDefinition.ts
new file mode 100644
index 0000000..9c0e5f1
--- /dev/null
+++ b/packages/api/src/nitro/avatar/actions/IActionDefinition.ts
@@ -0,0 +1,19 @@
+export interface IActionDefinition
+{
+ id: string;
+ state: string;
+ precedence: number;
+ activePartSet: string;
+ isMain: boolean;
+ isDefault: boolean;
+ assetPartDefinition: string;
+ lay: string;
+ geometryType: string;
+ isAnimation: boolean;
+ startFromFrameZero: boolean;
+ isAnimated(_arg_1: string): boolean;
+ getPrevents(_arg_1: string): string[];
+ getPreventHeadTurn(_arg_1: string): boolean;
+ setOffsets(_arg_1: string, _arg_2: number, _arg_3: []): void;
+ getOffsets(_arg_1: string, _arg_2: number): number[];
+}
diff --git a/packages/api/src/nitro/avatar/actions/IActiveActionData.ts b/packages/api/src/nitro/avatar/actions/IActiveActionData.ts
new file mode 100644
index 0000000..214c64f
--- /dev/null
+++ b/packages/api/src/nitro/avatar/actions/IActiveActionData.ts
@@ -0,0 +1,11 @@
+import { IActionDefinition } from './IActionDefinition';
+
+export interface IActiveActionData
+{
+ id: string;
+ actionType: string;
+ actionParameter: string;
+ startFrame: number;
+ definition: IActionDefinition;
+ overridingAction: string;
+}
diff --git a/packages/api/src/nitro/avatar/actions/index.ts b/packages/api/src/nitro/avatar/actions/index.ts
new file mode 100644
index 0000000..9e191b0
--- /dev/null
+++ b/packages/api/src/nitro/avatar/actions/index.ts
@@ -0,0 +1,2 @@
+export * from './IActionDefinition';
+export * from './IActiveActionData';
diff --git a/packages/api/src/nitro/avatar/animation/IAnimation.ts b/packages/api/src/nitro/avatar/animation/IAnimation.ts
new file mode 100644
index 0000000..2f53b72
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/IAnimation.ts
@@ -0,0 +1,11 @@
+export interface IAnimation
+{
+ hasAvatarData(): boolean;
+ hasDirectionData(): boolean;
+ hasAddData(): boolean;
+ id: string;
+ spriteData: any;
+ removeData: any;
+ addData: any;
+ resetOnToggle: boolean;
+}
diff --git a/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts b/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts
new file mode 100644
index 0000000..8bf9e86
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/IAnimationLayerData.ts
@@ -0,0 +1,12 @@
+import { IActiveActionData } from '../actions';
+
+export interface IAnimationLayerData
+{
+ id: string;
+ action: IActiveActionData;
+ animationFrame: number;
+ dx: number;
+ dy: number;
+ dz: number;
+ dd: number;
+}
diff --git a/packages/api/src/nitro/avatar/animation/IAnimationManager.ts b/packages/api/src/nitro/avatar/animation/IAnimationManager.ts
new file mode 100644
index 0000000..2fff676
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/IAnimationManager.ts
@@ -0,0 +1,9 @@
+import { IAnimation } from './IAnimation';
+import { IAnimationLayerData } from './IAnimationLayerData';
+
+export interface IAnimationManager
+{
+ animations: Map;
+ getAnimation(_arg_1: string): IAnimation;
+ getLayerData(_arg_1: string, _arg_2: number, _arg_3: string): IAnimationLayerData;
+}
diff --git a/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts b/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts
new file mode 100644
index 0000000..485f23a
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/IAvatarDataContainer.ts
@@ -0,0 +1,12 @@
+import { Filter } from 'pixi.js';
+
+export interface IAvatarDataContainer
+{
+ ink: number;
+ colorTransform: Filter;
+ paletteIsGrayscale: boolean;
+ reds: number[];
+ greens: number[];
+ blues: number[];
+ alphas: number[];
+}
diff --git a/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts b/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts
new file mode 100644
index 0000000..97df715
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/ISpriteDataContainer.ts
@@ -0,0 +1,14 @@
+import { IAnimation } from './IAnimation';
+
+export interface ISpriteDataContainer
+{
+ animation: IAnimation;
+ id: string;
+ ink: number;
+ member: string;
+ hasDirections: boolean;
+ hasStaticY: boolean;
+ getDirectionOffsetX(_arg_1: number): number;
+ getDirectionOffsetY(_arg_1: number): number;
+ getDirectionOffsetZ(_arg_1: number): number;
+}
diff --git a/packages/api/src/nitro/avatar/animation/index.ts b/packages/api/src/nitro/avatar/animation/index.ts
new file mode 100644
index 0000000..c6ce58c
--- /dev/null
+++ b/packages/api/src/nitro/avatar/animation/index.ts
@@ -0,0 +1,5 @@
+export * from './IAnimation';
+export * from './IAnimationLayerData';
+export * from './IAnimationManager';
+export * from './IAvatarDataContainer';
+export * from './ISpriteDataContainer';
diff --git a/packages/api/src/nitro/avatar/enum/AvatarAction.ts b/packages/api/src/nitro/avatar/enum/AvatarAction.ts
new file mode 100644
index 0000000..2d7ac10
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarAction.ts
@@ -0,0 +1,127 @@
+export class AvatarAction
+{
+ public static CARRY_OBJECT = 'cri';
+ public static DANCE = 'dance';
+ public static EFFECT = 'fx';
+ public static EXPRESSION = 'expression';
+ public static EXPRESSION_BLOW_A_KISS = 'blow';
+ public static EXPRESSION_CRY = 'cry';
+ public static EXPRESSION_IDLE = 'idle';
+ public static EXPRESSION_LAUGH = 'laugh';
+ public static EXPRESSION_RESPECT = 'respect';
+ public static EXPRESSION_RIDE_JUMP = 'ridejump';
+ public static EXPRESSION_SNOWBOARD_OLLIE = 'sbollie';
+ public static EXPRESSION_SNOWBORD_360 = 'sb360';
+ public static EXPRESSION_WAVE = 'wave';
+ public static GESTURE = 'gest';
+ public static GESTURE_AGGRAVATED = 'agr';
+ public static GESTURE_SAD = 'sad';
+ public static GESTURE_SMILE = 'sml';
+ public static GESTURE_SURPRISED = 'srp';
+ public static GUIDE_STATUS = 'guide';
+ public static MUTED = 'muted';
+ public static PET_GESTURE_BLINK = 'eyb';
+ public static PET_GESTURE_CRAZY = 'crz';
+ public static PET_GESTURE_JOY = 'joy';
+ public static PET_GESTURE_MISERABLE = 'mis';
+ public static PET_GESTURE_PUZZLED = 'puz';
+ public static PET_GESTURE_TONGUE = 'tng';
+ public static PLAYING_GAME = 'playing_game';
+ public static POSTURE = 'posture';
+ public static POSTURE_FLOAT = 'float';
+ public static POSTURE_LAY = 'lay';
+ public static POSTURE_SIT = 'sit';
+ public static POSTURE_STAND = 'std';
+ public static POSTURE_SWIM = 'swim';
+ public static POSTURE_WALK = 'mv';
+ public static SIGN = 'sign';
+ public static SLEEP = 'sleep';
+ public static SNOWWAR_DIE_BACK = 'swdieback';
+ public static SNOWWAR_DIE_FRONT = 'swdiefront';
+ public static SNOWWAR_PICK = 'swpick';
+ public static SNOWWAR_RUN = 'swrun';
+ public static SNOWWAR_THROW = 'swthrow';
+ public static TALK = 'talk';
+ public static BLINK = 'blink';
+ public static TYPING = 'typing';
+ public static USE_OBJECT = 'usei';
+ public static VOTE = 'vote';
+
+ public static GESTURE_MAP = [ '', AvatarAction.GESTURE_SMILE, AvatarAction.GESTURE_AGGRAVATED, AvatarAction.GESTURE_SURPRISED, AvatarAction.GESTURE_SAD, AvatarAction.PET_GESTURE_JOY, AvatarAction.PET_GESTURE_CRAZY, AvatarAction.PET_GESTURE_TONGUE, AvatarAction.PET_GESTURE_BLINK, AvatarAction.PET_GESTURE_MISERABLE, AvatarAction.PET_GESTURE_PUZZLED ];
+
+ public static EXPRESSION_MAP = [ '', AvatarAction.EXPRESSION_WAVE, AvatarAction.EXPRESSION_BLOW_A_KISS, AvatarAction.EXPRESSION_LAUGH, AvatarAction.EXPRESSION_CRY, AvatarAction.EXPRESSION_IDLE, AvatarAction.DANCE, AvatarAction.EXPRESSION_RESPECT, AvatarAction.EXPRESSION_SNOWBOARD_OLLIE, AvatarAction.EXPRESSION_SNOWBORD_360, AvatarAction.EXPRESSION_RIDE_JUMP ];
+
+ public static getExpressionTimeout(expressionId: number): number
+ {
+ expressionId = parseInt(expressionId as any);
+
+ switch(expressionId)
+ {
+ case 1:
+ return 5000;
+ case 2:
+ return 1400;
+ case 3:
+ return 2000;
+ case 4:
+ return 2000;
+ case 5:
+ return 0;
+ case 6:
+ return 700;
+ case 7:
+ return 2000;
+ case 8:
+ return 1500;
+ case 9:
+ return 1500;
+ case 10:
+ return 1500;
+ default:
+ return 0;
+ }
+ }
+
+ public static getExpressionId(expression: string): number
+ {
+ return AvatarAction.EXPRESSION_MAP.indexOf(expression);
+ }
+
+ public static getExpression(expressionId: number): string
+ {
+ if(expressionId > AvatarAction.EXPRESSION_MAP.length) return null;
+
+ return AvatarAction.EXPRESSION_MAP[expressionId];
+ }
+
+ public static getGestureId(gesture: string): number
+ {
+ return AvatarAction.GESTURE_MAP.indexOf(gesture);
+ }
+
+ public static getGesture(gestureId: number): string
+ {
+ if(gestureId > AvatarAction.GESTURE_MAP.length) return null;
+
+ return AvatarAction.GESTURE_MAP[gestureId];
+ }
+
+ public static idToAvatarActionState(id: string): string
+ {
+ if(id === 'Lay') return 'lay';
+ if(id === 'Float') return 'float';
+ if(id === 'Swim') return 'swim';
+ if(id === 'Sit') return 'sit';
+ if(id === 'Respect') return 'respect';
+ if(id === 'Wave') return 'wave';
+ if(id === 'Idle') return 'idle';
+ if(id === 'Dance') return 'dance';
+ if(id === 'UseItem') return 'usei';
+ if(id === 'CarryItem') return 'cri';
+ if(id === 'Talk') return 'talk';
+ if(id === 'Sleep') return 'Sleep';
+ if(id === 'Move') return 'mv';
+
+ return 'std';
+ }
+}
diff --git a/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts b/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts
new file mode 100644
index 0000000..83f9288
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarDirectionAngle.ts
@@ -0,0 +1,7 @@
+export class AvatarDirectionAngle
+{
+ public static DIRECTION_TO_ANGLE: number[] = [45, 90, 135, 180, 225, 270, 315, 0];
+ public static DIRECTION_IS_FLIPPED: boolean[] = [false, false, false, false, true, true, true, false];
+ public static MIN_DIRECTION: number = 0;
+ public static MAX_DIRECTION: number = 7;
+}
diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts
new file mode 100644
index 0000000..02e1801
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarEditorFigureCategory.ts
@@ -0,0 +1,10 @@
+export class AvatarEditorFigureCategory
+{
+ public static GENERIC: string = 'hd';
+ public static HEAD: string = 'head';
+ public static TORSO: string = 'torso';
+ public static LEGS: string = 'legs';
+ public static HOTLOOKS: string = 'hotlooks';
+ public static WARDROBE: string = 'wardrobe';
+ public static EFFECTS: string = 'effects';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts
new file mode 100644
index 0000000..82cfaae
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarEditorInstanceId.ts
@@ -0,0 +1,7 @@
+export class AvatarEditorInstanceId
+{
+ public static OWN_AVATAR_EDITOR: number = 0;
+ public static FURNITURE_AVATAR_EDITOR: number = 1;
+ public static BOT_EDITOR: number = 2;
+ public static DEV_TOOL_EDITOR: number = 3;
+}
diff --git a/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts b/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts
new file mode 100644
index 0000000..8dfd979
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarEditorSideCategory.ts
@@ -0,0 +1,5 @@
+export class AvatarEditorSideCategory
+{
+ public static NOTHING: string = 'nothing';
+ public static WARDROBE: string = 'wardrobe';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts b/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts
new file mode 100644
index 0000000..30bc564
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarFigurePartType.ts
@@ -0,0 +1,29 @@
+export class AvatarFigurePartType
+{
+ public static BODY: string = 'bd';
+ public static SHOES: string = 'sh';
+ public static LEGS: string = 'lg';
+ public static CHEST: string = 'ch';
+ public static WAIST_ACCESSORY: string = 'wa';
+ public static CHEST_ACCESSORY: string = 'ca';
+ public static HEAD: string = 'hd';
+ public static HAIR: string = 'hr';
+ public static FACE_ACCESSORY: string = 'fa';
+ public static EYE_ACCESSORY: string = 'ea';
+ public static HEAD_ACCESSORY: string = 'ha';
+ public static HEAD_ACCESSORY_EXTRA: string = 'he';
+ public static COAT_CHEST: string = 'cc';
+ public static CHEST_PRINT: string = 'cp';
+ public static LEFT_HAND_ITEM: string = 'li';
+ public static LEFT_HAND: string = 'lh';
+ public static LEFT_SLEEVE: string = 'ls';
+ public static RIGHT_HAND: string = 'rh';
+ public static RIGHT_SLEEVE: string = 'rs';
+ public static FACE: string = 'fc';
+ public static EYES: string = 'ey';
+ public static HAIR_BIG: string = 'hrb';
+ public static RIGHT_HAND_ITEM: string = 'ri';
+ public static LEFT_COAT_SLEEVE: string = 'lc';
+ public static RIGHT_COAT_SLEEVE: string = 'rc';
+ public static FIGURE_SETS: string[] = [ AvatarFigurePartType.SHOES, AvatarFigurePartType.LEGS, AvatarFigurePartType.CHEST, AvatarFigurePartType.WAIST_ACCESSORY, AvatarFigurePartType.CHEST_ACCESSORY, AvatarFigurePartType.HEAD, AvatarFigurePartType.HAIR, AvatarFigurePartType.FACE_ACCESSORY, AvatarFigurePartType.EYE_ACCESSORY, AvatarFigurePartType.HEAD_ACCESSORY, AvatarFigurePartType.HEAD_ACCESSORY_EXTRA, AvatarFigurePartType.COAT_CHEST, AvatarFigurePartType.CHEST_PRINT ];
+}
diff --git a/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts b/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts
new file mode 100644
index 0000000..48a5b3c
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarGuideStatus.ts
@@ -0,0 +1,6 @@
+export class AvatarGuideStatus
+{
+ public static NONE: number = 0;
+ public static GUIDE: number = 1;
+ public static REQUESTER: number = 2;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts b/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts
new file mode 100644
index 0000000..5933495
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarScaleType.ts
@@ -0,0 +1,5 @@
+export class AvatarScaleType
+{
+ public static LARGE: string = 'h';
+ public static SMALL: string = 'sh';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/AvatarSetType.ts b/packages/api/src/nitro/avatar/enum/AvatarSetType.ts
new file mode 100644
index 0000000..38df0af
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/AvatarSetType.ts
@@ -0,0 +1,6 @@
+export class AvatarSetType
+{
+ public static FULL: string = 'full';
+ public static HEAD: string = 'head';
+ public static BODY: string = 'body';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/GeometryType.ts b/packages/api/src/nitro/avatar/enum/GeometryType.ts
new file mode 100644
index 0000000..402c05f
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/GeometryType.ts
@@ -0,0 +1,8 @@
+export class GeometryType
+{
+ public static VERTICAL: string = 'vertical';
+ public static SITTING: string = 'sitting';
+ public static HORIZONTAL: string = 'horizontal';
+ public static SWIM: string = 'swim';
+ public static SNOWWARS_HORIZONTAL: string = 'swhorizontal';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/RenderMode.ts b/packages/api/src/nitro/avatar/enum/RenderMode.ts
new file mode 100644
index 0000000..ff9f877
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/RenderMode.ts
@@ -0,0 +1,7 @@
+export class RenderMode
+{
+ public static TOOL: string = 'tool';
+ public static COMPONENT: string = 'component';
+ public static ONLINE_TOOL: string = 'online_tool';
+ public static LOCAL_ONLY: string = 'local_only';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/avatar/enum/index.ts b/packages/api/src/nitro/avatar/enum/index.ts
new file mode 100644
index 0000000..8ea559f
--- /dev/null
+++ b/packages/api/src/nitro/avatar/enum/index.ts
@@ -0,0 +1,11 @@
+export * from './AvatarAction';
+export * from './AvatarDirectionAngle';
+export * from './AvatarEditorFigureCategory';
+export * from './AvatarEditorInstanceId';
+export * from './AvatarEditorSideCategory';
+export * from './AvatarFigurePartType';
+export * from './AvatarGuideStatus';
+export * from './AvatarScaleType';
+export * from './AvatarSetType';
+export * from './GeometryType';
+export * from './RenderMode';
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureData.ts b/packages/api/src/nitro/avatar/figuredata/IFigureData.ts
new file mode 100644
index 0000000..86e7901
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureData.ts
@@ -0,0 +1,8 @@
+import { IFigureDataPalette } from './IFigureDataPalette';
+import { IFigureDataSetType } from './IFigureDataSetType';
+
+export interface IFigureData
+{
+ palettes?: IFigureDataPalette[];
+ setTypes?: IFigureDataSetType[];
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts
new file mode 100644
index 0000000..535dead
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataColor.ts
@@ -0,0 +1,8 @@
+export interface IFigureDataColor
+{
+ id?: number;
+ index?: number;
+ club?: number;
+ selectable?: boolean;
+ hexCode?: string;
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts
new file mode 100644
index 0000000..80f42e6
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts
@@ -0,0 +1,4 @@
+export interface IFigureDataHiddenLayer
+{
+ partType?: string;
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts
new file mode 100644
index 0000000..f83fa06
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataPalette.ts
@@ -0,0 +1,7 @@
+import { IFigureDataColor } from './IFigureDataColor';
+
+export interface IFigureDataPalette
+{
+ id?: number;
+ colors?: IFigureDataColor[];
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts
new file mode 100644
index 0000000..e57ef47
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataPart.ts
@@ -0,0 +1,8 @@
+export interface IFigureDataPart
+{
+ id?: number;
+ type?: string;
+ colorable?: boolean;
+ index?: number;
+ colorindex?: number;
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts
new file mode 100644
index 0000000..f3c89d9
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataSet.ts
@@ -0,0 +1,15 @@
+import { IFigureDataHiddenLayer } from './IFigureDataHiddenLayer';
+import { IFigureDataPart } from './IFigureDataPart';
+
+export interface IFigureDataSet
+{
+ id?: number;
+ gender?: string;
+ club?: number;
+ colorable?: boolean;
+ selectable?: boolean;
+ preselectable?: boolean;
+ sellable?: boolean;
+ parts?: IFigureDataPart[];
+ hiddenLayers?: IFigureDataHiddenLayer[];
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts b/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts
new file mode 100644
index 0000000..d9a2d97
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/IFigureDataSetType.ts
@@ -0,0 +1,12 @@
+import { IFigureDataSet } from './IFigureDataSet';
+
+export interface IFigureDataSetType
+{
+ type?: string;
+ paletteId?: number;
+ mandatory_m_0?: boolean;
+ mandatory_f_0?: boolean;
+ mandatory_m_1?: boolean;
+ mandatory_f_1?: boolean;
+ sets?: IFigureDataSet[];
+}
diff --git a/packages/api/src/nitro/avatar/figuredata/index.ts b/packages/api/src/nitro/avatar/figuredata/index.ts
new file mode 100644
index 0000000..579987b
--- /dev/null
+++ b/packages/api/src/nitro/avatar/figuredata/index.ts
@@ -0,0 +1,7 @@
+export * from './IFigureData';
+export * from './IFigureDataColor';
+export * from './IFigureDataHiddenLayer';
+export * from './IFigureDataPalette';
+export * from './IFigureDataPart';
+export * from './IFigureDataSet';
+export * from './IFigureDataSetType';
diff --git a/packages/api/src/nitro/avatar/index.ts b/packages/api/src/nitro/avatar/index.ts
new file mode 100644
index 0000000..5c3213c
--- /dev/null
+++ b/packages/api/src/nitro/avatar/index.ts
@@ -0,0 +1,13 @@
+export * from './IAvatarAssetDownloadLibrary';
+export * from './IAvatarEffectListener';
+export * from './IAvatarFigureContainer';
+export * from './IAvatarImage';
+export * from './IAvatarImageListener';
+export * from './IAvatarRenderManager';
+export * from './IEffectAssetDownloadLibrary';
+export * from './IOutfit';
+export * from './actions';
+export * from './animation';
+export * from './enum';
+export * from './figuredata';
+export * from './structure';
diff --git a/packages/api/src/nitro/avatar/structure/IFigurePart.ts b/packages/api/src/nitro/avatar/structure/IFigurePart.ts
new file mode 100644
index 0000000..578725b
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IFigurePart.ts
@@ -0,0 +1,9 @@
+export interface IFigurePart
+{
+ id: number;
+ type: string;
+ breed: number;
+ index: number;
+ colorLayerIndex: number;
+ paletteMap: number;
+}
diff --git a/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts b/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts
new file mode 100644
index 0000000..7e1653e
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IFigurePartSet.ts
@@ -0,0 +1,16 @@
+import { IFigurePart } from './IFigurePart';
+
+export interface IFigurePartSet
+{
+ getPart(_arg_1: string, _arg_2: number): IFigurePart;
+ id: number;
+ type: string;
+ gender: string;
+ clubLevel: number;
+ isColorable: boolean;
+ isSelectable: boolean;
+ parts: IFigurePart[];
+ hiddenLayers: string[];
+ isPreSelectable: boolean;
+ isSellable: boolean;
+}
diff --git a/packages/api/src/nitro/avatar/structure/IFigureSetData.ts b/packages/api/src/nitro/avatar/structure/IFigureSetData.ts
new file mode 100644
index 0000000..5ea24a6
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IFigureSetData.ts
@@ -0,0 +1,7 @@
+import { IFigureData } from '../figuredata';
+
+export interface IFigureSetData
+{
+ parse(data: any): boolean;
+ appendJSON(data: IFigureData): boolean;
+}
diff --git a/packages/api/src/nitro/avatar/structure/IPalette.ts b/packages/api/src/nitro/avatar/structure/IPalette.ts
new file mode 100644
index 0000000..8c5c0e2
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IPalette.ts
@@ -0,0 +1,9 @@
+import { IAdvancedMap } from '../../../utils';
+import { IPartColor } from './IPartColor';
+
+export interface IPalette
+{
+ getColor(id: number): IPartColor;
+ id: number;
+ colors: IAdvancedMap;
+}
diff --git a/packages/api/src/nitro/avatar/structure/IPartColor.ts b/packages/api/src/nitro/avatar/structure/IPartColor.ts
new file mode 100644
index 0000000..6978528
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IPartColor.ts
@@ -0,0 +1,8 @@
+export interface IPartColor
+{
+ id: number;
+ index: number;
+ clubLevel: number;
+ isSelectable: boolean;
+ rgb: number;
+}
diff --git a/packages/api/src/nitro/avatar/structure/ISetType.ts b/packages/api/src/nitro/avatar/structure/ISetType.ts
new file mode 100644
index 0000000..9277a47
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/ISetType.ts
@@ -0,0 +1,12 @@
+import { IAdvancedMap } from '../../../utils';
+import { IFigurePartSet } from './IFigurePartSet';
+
+export interface ISetType
+{
+ getPartSet(_arg_1: number): IFigurePartSet;
+ isMandatory(_arg_1: string, _arg_2: number): boolean;
+ optionalFromClubLevel(_arg_1: string): number;
+ type: string;
+ paletteID: number;
+ partSets: IAdvancedMap;
+}
diff --git a/packages/api/src/nitro/avatar/structure/IStructureData.ts b/packages/api/src/nitro/avatar/structure/IStructureData.ts
new file mode 100644
index 0000000..392e885
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/IStructureData.ts
@@ -0,0 +1,12 @@
+import { IFigurePartSet } from './IFigurePartSet';
+import { IPalette } from './IPalette';
+import { ISetType } from './ISetType';
+
+export interface IStructureData
+{
+ parse(data: any): boolean;
+ appendJSON(k: any): boolean;
+ getSetType(_arg_1: string): ISetType;
+ getPalette(_arg_1: number): IPalette;
+ getFigurePartSet(_arg_1: number): IFigurePartSet;
+}
diff --git a/packages/api/src/nitro/avatar/structure/index.ts b/packages/api/src/nitro/avatar/structure/index.ts
new file mode 100644
index 0000000..4c63b05
--- /dev/null
+++ b/packages/api/src/nitro/avatar/structure/index.ts
@@ -0,0 +1,7 @@
+export * from './IFigurePart';
+export * from './IFigurePartSet';
+export * from './IFigureSetData';
+export * from './IPalette';
+export * from './IPartColor';
+export * from './ISetType';
+export * from './IStructureData';
diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts
new file mode 100644
index 0000000..43f29ff
--- /dev/null
+++ b/packages/api/src/nitro/camera/IRoomCameraWidgetEffect.ts
@@ -0,0 +1,10 @@
+import { BLEND_MODES, ColorMatrix, Texture } from 'pixi.js';
+
+export interface IRoomCameraWidgetEffect
+{
+ name: string;
+ minLevel: number;
+ texture: Texture;
+ colorMatrix: ColorMatrix;
+ blendMode: BLEND_MODES;
+}
diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts
new file mode 100644
index 0000000..bf557c0
--- /dev/null
+++ b/packages/api/src/nitro/camera/IRoomCameraWidgetManager.ts
@@ -0,0 +1,11 @@
+import { Texture } from 'pixi.js';
+import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect';
+import { IRoomCameraWidgetSelectedEffect } from './IRoomCameraWidgetSelectedEffect';
+
+export interface IRoomCameraWidgetManager
+{
+ init(): Promise;
+ applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise;
+ effects: Map;
+ isLoaded: boolean;
+}
diff --git a/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts b/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts
new file mode 100644
index 0000000..3bb3b2c
--- /dev/null
+++ b/packages/api/src/nitro/camera/IRoomCameraWidgetSelectedEffect.ts
@@ -0,0 +1,7 @@
+import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect';
+
+export interface IRoomCameraWidgetSelectedEffect
+{
+ effect: IRoomCameraWidgetEffect;
+ alpha: number;
+}
diff --git a/packages/api/src/nitro/camera/index.ts b/packages/api/src/nitro/camera/index.ts
new file mode 100644
index 0000000..7c7db03
--- /dev/null
+++ b/packages/api/src/nitro/camera/index.ts
@@ -0,0 +1,3 @@
+export * from './IRoomCameraWidgetEffect';
+export * from './IRoomCameraWidgetManager';
+export * from './IRoomCameraWidgetSelectedEffect';
diff --git a/packages/api/src/nitro/enums/RelationshipStatusEnum.ts b/packages/api/src/nitro/enums/RelationshipStatusEnum.ts
new file mode 100644
index 0000000..b64873c
--- /dev/null
+++ b/packages/api/src/nitro/enums/RelationshipStatusEnum.ts
@@ -0,0 +1,10 @@
+export class RelationshipStatusEnum
+{
+ public static NONE: number = 0;
+ public static HEART: number = 1;
+ public static SMILE: number = 2;
+ public static BOBBA: number = 3;
+
+ public static RELATIONSHIP_TYPES = [ 0, 1, 2, 3 ];
+ public static RELATIONSHIP_NAMES: string[] = ['None', 'Heart', 'Smile', 'Bobba'];
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/enums/ToolbarIconEnum.ts b/packages/api/src/nitro/enums/ToolbarIconEnum.ts
new file mode 100644
index 0000000..d389a95
--- /dev/null
+++ b/packages/api/src/nitro/enums/ToolbarIconEnum.ts
@@ -0,0 +1,10 @@
+export class ToolbarIconEnum
+{
+ public static HOTEL_VIEW: string = 'hotel_view';
+ public static HOME_ROOM: string = 'home_room';
+ public static NAVIGATOR: string = 'navigator';
+ public static CATALOG: string = 'catalog';
+ public static INVENTORY: string = 'inventory';
+ public static ME_MENU: string = 'me_menu';
+ public static FRIEND_LIST: string = 'friendlist';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/enums/index.ts b/packages/api/src/nitro/enums/index.ts
new file mode 100644
index 0000000..98a436c
--- /dev/null
+++ b/packages/api/src/nitro/enums/index.ts
@@ -0,0 +1,2 @@
+export * from './RelationshipStatusEnum';
+export * from './ToolbarIconEnum';
diff --git a/packages/api/src/nitro/index.ts b/packages/api/src/nitro/index.ts
new file mode 100644
index 0000000..dcbd7f6
--- /dev/null
+++ b/packages/api/src/nitro/index.ts
@@ -0,0 +1,18 @@
+export * from './avatar';
+export * from './avatar/actions';
+export * from './avatar/animation';
+export * from './avatar/enum';
+export * from './avatar/figuredata';
+export * from './avatar/structure';
+export * from './camera';
+export * from './enums';
+export * from './localization';
+export * from './room';
+export * from './room/enums';
+export * from './room/object';
+export * from './room/object/data';
+export * from './room/object/data/type';
+export * from './room/utils';
+export * from './session';
+export * from './session/enum';
+export * from './sound';
diff --git a/packages/api/src/nitro/localization/ILocalizationManager.ts b/packages/api/src/nitro/localization/ILocalizationManager.ts
new file mode 100644
index 0000000..86070d0
--- /dev/null
+++ b/packages/api/src/nitro/localization/ILocalizationManager.ts
@@ -0,0 +1,16 @@
+export interface ILocalizationManager
+{
+ init(): Promise;
+ getRomanNumeral(number: number): string;
+ getPreviousLevelBadgeId(badgeName: string): string;
+ hasValue(key: string): boolean;
+ getValue(key: string, doParams?: boolean): string;
+ getValueWithParameter(key: string, parameter: string, replacement: string): string;
+ getValueWithParameters(key: string, parameters: string[], replacements: string[]): string;
+ setValue(key: string, value: string): void;
+ registerParameter(key: string, parameter: string, value: string): void;
+ getBadgeName(key: string): string;
+ getBadgeDesc(key: string): string;
+ getBadgePointLimit(badge: string): number;
+ setBadgePointLimit(badge: string, point: number): void;
+}
diff --git a/packages/api/src/nitro/localization/index.ts b/packages/api/src/nitro/localization/index.ts
new file mode 100644
index 0000000..3aee8f5
--- /dev/null
+++ b/packages/api/src/nitro/localization/index.ts
@@ -0,0 +1 @@
+export * from './ILocalizationManager';
diff --git a/packages/api/src/nitro/room/IGetImageListener.ts b/packages/api/src/nitro/room/IGetImageListener.ts
new file mode 100644
index 0000000..54b585f
--- /dev/null
+++ b/packages/api/src/nitro/room/IGetImageListener.ts
@@ -0,0 +1,7 @@
+import { Texture } from 'pixi.js';
+
+export interface IGetImageListener
+{
+ imageReady(id: number, texture: Texture, image?: HTMLImageElement): void;
+ imageFailed(id: number): void;
+}
diff --git a/packages/api/src/nitro/room/IImageResult.ts b/packages/api/src/nitro/room/IImageResult.ts
new file mode 100644
index 0000000..2d991a0
--- /dev/null
+++ b/packages/api/src/nitro/room/IImageResult.ts
@@ -0,0 +1,9 @@
+import { Texture } from 'pixi.js';
+
+export interface IImageResult
+{
+ id: number;
+ data: Texture;
+ image: HTMLImageElement;
+ getImage(): Promise;
+}
diff --git a/packages/api/src/nitro/room/IPetColorResult.ts b/packages/api/src/nitro/room/IPetColorResult.ts
new file mode 100644
index 0000000..f66417d
--- /dev/null
+++ b/packages/api/src/nitro/room/IPetColorResult.ts
@@ -0,0 +1,10 @@
+export interface IPetColorResult
+{
+ readonly primaryColor: number;
+ readonly secondaryColor: number;
+ readonly breed: number;
+ readonly tag: string;
+ readonly id: string;
+ readonly isMaster: boolean;
+ readonly layerTags: string[];
+}
diff --git a/packages/api/src/nitro/room/IRoomContentListener.ts b/packages/api/src/nitro/room/IRoomContentListener.ts
new file mode 100644
index 0000000..375b146
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomContentListener.ts
@@ -0,0 +1,4 @@
+export interface IRoomContentListener
+{
+ onRoomContentLoaded(id: number, assetName: string, sucess: boolean): void;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/IRoomContentLoader.ts b/packages/api/src/nitro/room/IRoomContentLoader.ts
new file mode 100644
index 0000000..7e4c956
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomContentLoader.ts
@@ -0,0 +1,33 @@
+import { Texture } from 'pixi.js';
+import { IGraphicAssetCollection } from '../../asset';
+import { IEventDispatcher } from '../../common';
+import { IRoomObject } from '../../room';
+import { IFurnitureData } from '../session';
+import { IPetColorResult } from './IPetColorResult';
+import { IRoomContentListener } from './IRoomContentListener';
+
+export interface IRoomContentLoader
+{
+ init(): Promise;
+ processFurnitureData(furnitureData: IFurnitureData[]): void;
+ downloadAsset(type: string): Promise;
+ isLoaderType(type: string): boolean;
+ getCollection(name: string): IGraphicAssetCollection;
+ getPlaceholderName(type: string): string;
+ getCategoryForType(type: string): number;
+ setRoomObjectRoomId(object: IRoomObject, roomId: string): void;
+ getFurnitureFloorNameForTypeId(typeId: number): string;
+ getFurnitureWallNameForTypeId(typeId: number, extra?: string): string;
+ getFurnitureFloorColorIndex(typeId: number): number;
+ getFurnitureWallColorIndex(typeId: number): number;
+ getImage(name: string): HTMLImageElement;
+ getAssetIconUrl(type: string, colorIndex: string): string;
+ addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override?: boolean): boolean;
+ getPetNameForType(type: number): string;
+ downloadImage(id: number, type: string, param: string, events?: IEventDispatcher): boolean;
+ getRoomObjectAdUrl(type: string): string;
+ getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult;
+ getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[];
+ setIconListener(listener: IRoomContentListener): void;
+ pets: { [index: string]: number };
+}
diff --git a/packages/api/src/nitro/room/IRoomCreator.ts b/packages/api/src/nitro/room/IRoomCreator.ts
new file mode 100644
index 0000000..e342bce
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomCreator.ts
@@ -0,0 +1,51 @@
+import { IRoomInstance, IRoomObjectController } from '../../room';
+import { IVector3D } from '../../utils';
+import { IObjectData, IRoomMapData } from './object';
+import { IFurnitureStackingHeightMap, ILegacyWallGeometry } from './utils';
+
+export interface IRoomCreator
+{
+ destroyRoom(id: number): void;
+ getRoomInstance(roomId: number): IRoomInstance;
+ updateRoomInstancePlaneVisibility(roomId: number, wallVisible: boolean, floorVisible?: boolean): boolean;
+ updateRoomInstancePlaneThickness(roomId: number, wallThickness: number, floorThickness: number): boolean;
+ updateRoomInstancePlaneType(roomId: number, floorType?: string, wallType?: string, landscapeType?: string, _arg_5?: boolean): boolean;
+ removeRoomInstance(roomId: number): void;
+ createRoomInstance(roomId: number, roomMap: IRoomMapData): void;
+ setRoomSessionOwnUser(roomId: number, objectId: number): void;
+ setRoomInstanceModelName(roomId: number, name: string): void;
+ getFurnitureStackingHeightMap(roomId: number): IFurnitureStackingHeightMap;
+ setFurnitureStackingHeightMap(roomId: number, heightMap: IFurnitureStackingHeightMap): void;
+ getLegacyWallGeometry(roomId: number): ILegacyWallGeometry;
+ getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController;
+ getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController;
+ getRoomObjectCursor(roomId: number): IRoomObjectController;
+ getRoomObjectUser(roomId: number, objectId: number): IRoomObjectController;
+ removeRoomObjectUser(roomId: number, objectId: number): void;
+ getRoomObjectFloor(roomId: number, objectId: number): IRoomObjectController;
+ addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean;
+ removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void;
+ removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void;
+ updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean;
+ updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean;
+ updateRoomObjectWallItemData(roomId: number, objectId: number, data: string): boolean;
+ updateRoomObjectFloorHeight(roomId: number, objectId: number, height: number): boolean;
+ updateRoomObjectFloorExpiration(roomId: number, objectId: number, expires: number): boolean;
+ updateRoomObjectWallExpiration(roomId: number, objectId: number, expires: number): boolean;
+ rollRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D): void;
+ addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean;
+ updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number): boolean;
+ updateRoomObjectUserAction(roomId: number, objectId: number, action: string, value: number, parameter?: string): boolean;
+ updateRoomObjectUserFigure(roomId: number, objectId: number, figure: string, gender?: string, subType?: string, isRiding?: boolean): boolean;
+ updateRoomObjectUserFlatControl(roomId: number, objectId: number, level: string): boolean;
+ updateRoomObjectUserEffect(roomId: number, objectId: number, effectId: number, delay?: number): boolean;
+ updateRoomObjectUserGesture(roomId: number, objectId: number, gestureId: number): boolean;
+ updateRoomObjectUserPetGesture(roomId: number, objectId: number, gesture: string): boolean;
+ updateRoomObjectUserPosture(roomId: number, objectId: number, type: string, parameter?: string): boolean;
+ updateRoomObjectUserOwn(roomId: number, objectId: number): void;
+ getPetTypeId(figure: string): number;
+ refreshTileObjectMap(k: number, _arg_2: string): void;
+ setRoomEngineGameMode(roomId: number, isPlaying: boolean): void;
+}
diff --git a/packages/api/src/nitro/room/IRoomEngine.ts b/packages/api/src/nitro/room/IRoomEngine.ts
new file mode 100644
index 0000000..3aa3df4
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomEngine.ts
@@ -0,0 +1,89 @@
+import { Container, Point, Rectangle, RenderTexture, Texture } from 'pixi.js';
+import { IRoomGeometry, IRoomManager, IRoomObject, IRoomObjectController, IRoomRenderingCanvas } from '../../room';
+import { IVector3D } from '../../utils';
+import { IPetCustomPart } from '../session';
+import { IGetImageListener } from './IGetImageListener';
+import { IImageResult } from './IImageResult';
+import { IPetColorResult } from './IPetColorResult';
+import { IRoomObjectEventManager } from './IRoomObjectEventManager';
+import { IObjectData, IRoomMapData } from './object';
+
+export interface IRoomEngine
+{
+ init(): Promise;
+ setActiveRoomId(roomId: number): void;
+ createRoomInstance(roomId: number, roomMap: IRoomMapData): void;
+ getRoomInstanceDisplay(roomId: number, id: number, width: number, height: number, scale: number): Container;
+ setRoomInstanceRenderingCanvasScale(roomId: number, canvasId: number, scale: number, point?: Point, offsetPoint?: Point, override?: boolean, asDelta?: boolean): void;
+ setRoomInstanceRenderingCanvasMask(roomId: number, canvasId: number, flag: boolean): void;
+ getRoomInstanceRenderingCanvas(roomId: number, canvasId?: number): IRoomRenderingCanvas;
+ getRoomInstanceRenderingCanvasOffset(roomId: number, canvasId?: number): Point;
+ setRoomInstanceRenderingCanvasOffset(roomId: number, canvasId: number, point: Point): boolean;
+ getRoomInstanceRenderingCanvasScale(roomId?: number, canvasId?: number): number;
+ initializeRoomInstanceRenderingCanvas(roomId: number, canvasId: number, width: number, height: number): void;
+ updateRoomInstancePlaneVisibility(roomId: number, wallVisible: boolean, floorVisible?: boolean): boolean;
+ updateRoomInstancePlaneThickness(roomId: number, wallThickness: number, floorThickness: number): boolean;
+ updateRoomInstancePlaneType(roomId: number, floorType?: string, wallType?: string, landscapeType?: string, _arg_5?: boolean): boolean;
+ updateObjectRoomColor(k: number, _arg_2: number, _arg_3: number, _arg_4: boolean): boolean;
+ getRoomInstanceGeometry(roomId: number, canvasId?: number): IRoomGeometry;
+ getRoomInstanceVariable(roomId: number, key: string): T;
+ getTotalObjectsForManager(roomId: number, category: number): number;
+ getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController;
+ getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController;
+ removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void;
+ removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void;
+ removeRoomObjectUser(roomId: number, objectId: number): void;
+ getRoomObjects(roomId: number, category: number): IRoomObject[];
+ getRoomObjectCount(roomId: number, categoryId: number): number;
+ getRoomObjectBoundingRectangle(roomId: number, objectId: number, category: number, canvasId: number): Rectangle;
+ getRoomObjectScreenLocation(roomId: number, objectId: number, objectType: number, canvasId?: number): Point;
+ getGenericRoomObjectImage(type: string, value: string, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, objectData?: IObjectData, state?: number, frameCount?: number, posture?: string, originalId?: number): IImageResult;
+ getFurnitureFloorIconUrl(typeId: number): string;
+ getFurnitureFloorIcon(typeId: number, listener: IGetImageListener, extras?: string, objectData?: IObjectData): IImageResult;
+ getFurnitureWallIconUrl(typeId: number, extra?: string): string;
+ getFurnitureWallIcon(typeId: number, listener: IGetImageListener, extras?: string): IImageResult;
+ updateRoomObjectWallLocation(roomId: number, objectId: number, location: IVector3D): boolean;
+ addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean;
+ updateRoomObjectUserLocation(roomId: number, objectId: number, location: IVector3D, targetLocation: IVector3D, canStandUp?: boolean, baseY?: number, direction?: IVector3D, headDirection?: number): boolean;
+ addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean;
+ initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void;
+ updateRoomObjectFloor(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, data: IObjectData, extra?: number): boolean;
+ updateRoomObjectWall(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, state: number, extra?: string): boolean;
+ updateRoomObjectUserAction(roomId: number, objectId: number, action: string, value: number, parameter?: string): boolean;
+ updateRoomObjectUserFigure(roomId: number, objectId: number, figure: string, gender?: string, subType?: string, isRiding?: boolean): boolean;
+ updateRoomObjectUserEffect(roomId: number, objectId: number, effectId: number, delay?: number): boolean;
+ updateRoomObjectUserGesture(roomId: number, objectId: number, gestureId: number): boolean;
+ updateRoomObjectUserPosture(roomId: number, objectId: number, type: string, parameter?: string): boolean;
+ getFurnitureFloorImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, state?: number, frameCount?: number, objectData?: IObjectData): IImageResult;
+ getFurnitureWallImage(typeId: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number, extras?: string, state?: number, frameCount?: number): IImageResult;
+ getRoomObjectImage(roomId: number, objectId: number, category: number, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor?: number): IImageResult;
+ getRoomObjectPetImage(typeId: number, paletteId: number, color: number, direction: IVector3D, scale: number, listener: IGetImageListener, headOnly?: boolean, bgColor?: number, customParts?: IPetCustomPart[], posture?: string): IImageResult;
+ getFurnitureFloorName(typeId: number): string;
+ getFurnitureWallName(typeId: number, extra?: string): string;
+ selectRoomObject(roomId: number, objectId: number, objectCategory: number): void;
+ setSelectedAvatar(roomId: number, objectId: number): void;
+ cancelRoomObjectInsert(): void;
+ getPetColorResult(petIndex: number, paletteIndex: number): IPetColorResult;
+ getPetColorResultsForTag(petIndex: number, tagName: string): IPetColorResult[];
+ cancelRoomObjectPlacement(): void;
+ useRoomObject(objectId: number, category: number): boolean;
+ objectInitialized(roomId: string, objectId: number, category: number): void;
+ changeObjectModelData(roomId: number, objectId: number, category: number, numberKey: string, numberValue: number): boolean;
+ changeObjectState(roomId: number, objectId: number, category: number): void;
+ processRoomObjectOperation(objectId: number, category: number, operation: string): boolean;
+ modifyRoomObjectDataWithMap(objectId: number, category: number, operation: string, data: Map): boolean
+ modifyRoomObjectData(objectId: number, category: number, colorHex: string, data: string): boolean
+ processRoomObjectPlacement(placementSource: string, id: number, category: number, typeId: number, legacyString?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): boolean;
+ dispatchMouseEvent(canvasId: number, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): void;
+ createTextureFromRoom(roomId: number, canvasId?: number, bounds?: Rectangle): Texture;
+ saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail?: boolean): Promise;
+ saveBase64AsScreenshot(base64: string, saveAsThumbnail?: boolean): void;
+ deleteRoomObject(objectId: number, objectCategory: number): boolean;
+ roomManager: IRoomManager;
+ objectEventHandler: IRoomObjectEventManager;
+ activeRoomId: number;
+ selectedAvatarId: number;
+ isDecorating: boolean;
+}
diff --git a/packages/api/src/nitro/room/IRoomEngineServices.ts b/packages/api/src/nitro/room/IRoomEngineServices.ts
new file mode 100644
index 0000000..563467e
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomEngineServices.ts
@@ -0,0 +1,41 @@
+import { IRoomInstance, IRoomObjectController, IRoomRenderingCanvas } from '../../room';
+import { IVector3D } from '../../utils';
+import { ISelectedRoomObjectData } from './ISelectedRoomObjectData';
+import { IObjectData } from './object';
+import { IFurnitureStackingHeightMap, ILegacyWallGeometry, ITileObjectMap } from './utils';
+
+export interface IRoomEngineServices
+{
+ getRoomInstance(roomId: number): IRoomInstance;
+ getActiveRoomInstanceRenderingCanvas(): IRoomRenderingCanvas;
+ addRoomInstanceFloorHole(roomId: number, objectId: number): void;
+ removeRoomInstanceFloorHole(roomId: number, objectId: number): void;
+ getSelectedRoomObjectData(roomId: number): ISelectedRoomObjectData;
+ setSelectedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void;
+ getPlacedRoomObjectData(roomId: number): ISelectedRoomObjectData;
+ setPlacedRoomObjectData(roomId: number, data: ISelectedRoomObjectData): void;
+ getLegacyWallGeometry(roomId: number): ILegacyWallGeometry;
+ getFurnitureStackingHeightMap(roomId: number): IFurnitureStackingHeightMap;
+ getRoomObject(roomId: number, objectId: number, category: number): IRoomObjectController;
+ getRoomObjectByIndex(roomId: number, index: number, category: number): IRoomObjectController;
+ getRoomObjectCategoryForType(type: string): number;
+ getRoomObjectCursor(roomId: number): IRoomObjectController;
+ getRoomObjectSelectionArrow(roomId: number): IRoomObjectController;
+ addRoomObjectUser(roomId: number, objectId: number, location: IVector3D, direction: IVector3D, headDirection: number, type: number, figure: string): boolean;
+ addFurnitureFloor(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureFloorByTypeName(roomId: number, id: number, typeName: string, location: IVector3D, direction: IVector3D, state: number, objectData: IObjectData, extra?: number, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, synchronized?: boolean, realRoomObject?: boolean, sizeZ?: number): boolean;
+ addFurnitureWall(roomId: number, id: number, typeId: number, location: IVector3D, direction: IVector3D, state: number, extra: string, expires?: number, usagePolicy?: number, ownerId?: number, ownerName?: string, realRoomObject?: boolean): boolean;
+ removeRoomObjectFloor(roomId: number, objectId: number, userId?: number, _arg_4?: boolean): void;
+ removeRoomObjectWall(roomId: number, objectId: number, userId?: number): void;
+ removeRoomObjectUser(roomId: number, objectId: number): void;
+ loadRoomObjectBadgeImage(roomId: number, objectId: number, objectCategory: number, badgeId: string, groupBadge?: boolean): void;
+ updateRoomObjectMask(roomId: number, objectId: number, _arg_?: boolean): void;
+ setObjectMoverIconSprite(objectId: number, category: number, _arg_3: boolean, instanceData?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): void;
+ setObjectMoverIconSpriteVisible(k: boolean): void;
+ updateMousePointer(type: string, objectId: number, objectType: string): void;
+ removeObjectMoverIconSprite(): void;
+ getRoomTileObjectMap(k: number): ITileObjectMap;
+ isPlayingGame(): boolean;
+ activeRoomId: number;
+ isDecorating: boolean;
+}
diff --git a/packages/api/src/nitro/room/IRoomObjectEventManager.ts b/packages/api/src/nitro/room/IRoomObjectEventManager.ts
new file mode 100644
index 0000000..4f0cec3
--- /dev/null
+++ b/packages/api/src/nitro/room/IRoomObjectEventManager.ts
@@ -0,0 +1,6 @@
+import { IRoomObjectController } from '../../room';
+
+export interface IRoomObjectEventManager
+{
+ getValidRoomObjectDirection(k: IRoomObjectController, _arg_2: boolean): number;
+}
diff --git a/packages/api/src/nitro/room/ISelectedRoomObjectData.ts b/packages/api/src/nitro/room/ISelectedRoomObjectData.ts
new file mode 100644
index 0000000..bd46883
--- /dev/null
+++ b/packages/api/src/nitro/room/ISelectedRoomObjectData.ts
@@ -0,0 +1,18 @@
+import { IVector3D } from '../../utils';
+import { IObjectData } from './object';
+
+export interface ISelectedRoomObjectData
+{
+ id: number;
+ category: number;
+ operation: string;
+ loc: IVector3D;
+ dir: IVector3D;
+ typeId: number;
+ instanceData: string;
+ stuffData: IObjectData;
+ state: number;
+ animFrame: number;
+ posture: string;
+ dispose: () => void;
+}
diff --git a/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts b/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts
new file mode 100644
index 0000000..47a95f9
--- /dev/null
+++ b/packages/api/src/nitro/room/enums/FriendFurniEngravingWidgetType.ts
@@ -0,0 +1,8 @@
+export class FriendFurniEngravingWidgetType
+{
+ public static readonly LOVE_LOCK: number = 0;
+ public static readonly CARVE_A_TREE: number = 1;
+ public static readonly FRIENDS_PORTRAIT: number = 2;
+ public static readonly WILD_WEST_WANTED: number = 3;
+ public static readonly HABBOWEEN: number = 4;
+}
diff --git a/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts b/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts
new file mode 100644
index 0000000..629bec4
--- /dev/null
+++ b/packages/api/src/nitro/room/enums/RoomObjectPlacementSource.ts
@@ -0,0 +1,5 @@
+export class RoomObjectPlacementSource
+{
+ public static CATALOG: string = 'catalog';
+ public static INVENTORY: string = 'inventory';
+}
diff --git a/packages/api/src/nitro/room/enums/index.ts b/packages/api/src/nitro/room/enums/index.ts
new file mode 100644
index 0000000..0ea238d
--- /dev/null
+++ b/packages/api/src/nitro/room/enums/index.ts
@@ -0,0 +1,2 @@
+export * from './FriendFurniEngravingWidgetType';
+export * from './RoomObjectPlacementSource';
diff --git a/packages/api/src/nitro/room/index.ts b/packages/api/src/nitro/room/index.ts
new file mode 100644
index 0000000..e10262d
--- /dev/null
+++ b/packages/api/src/nitro/room/index.ts
@@ -0,0 +1,15 @@
+export * from './enums';
+export * from './IGetImageListener';
+export * from './IImageResult';
+export * from './IPetColorResult';
+export * from './IRoomContentListener';
+export * from './IRoomContentLoader';
+export * from './IRoomCreator';
+export * from './IRoomEngine';
+export * from './IRoomEngineServices';
+export * from './IRoomObjectEventManager';
+export * from './ISelectedRoomObjectData';
+export * from './object';
+export * from './object/data';
+export * from './object/data/type';
+export * from './utils';
diff --git a/packages/api/src/nitro/room/object/IPetFigureData.ts b/packages/api/src/nitro/room/object/IPetFigureData.ts
new file mode 100644
index 0000000..d10bb50
--- /dev/null
+++ b/packages/api/src/nitro/room/object/IPetFigureData.ts
@@ -0,0 +1,12 @@
+import { IPetCustomPart } from '../../session';
+
+export interface IPetFigureData
+{
+ readonly typeId: number;
+ readonly paletteId: number;
+ readonly color: string;
+ readonly breedId: number;
+ readonly figuredata: string;
+ readonly customParts: IPetCustomPart[];
+ readonly customPartCount: number;
+}
diff --git a/packages/api/src/nitro/room/object/IRoomMapData.ts b/packages/api/src/nitro/room/object/IRoomMapData.ts
new file mode 100644
index 0000000..1ebf36c
--- /dev/null
+++ b/packages/api/src/nitro/room/object/IRoomMapData.ts
@@ -0,0 +1,11 @@
+export interface IRoomMapData
+{
+ width: number;
+ height: number;
+ wallHeight: number;
+ fixedWallsHeight: number;
+ tileMap: { height: number }[][];
+ holeMap: { id: number, x: number, y: number, width: number, height: number }[];
+ doors: { x: number, y: number, z: number, dir: number }[];
+ dimensions: { minX: number, maxX: number, minY: number, maxY: number };
+}
diff --git a/packages/api/src/nitro/room/object/RoomObjectCategory.ts b/packages/api/src/nitro/room/object/RoomObjectCategory.ts
new file mode 100644
index 0000000..6e93273
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectCategory.ts
@@ -0,0 +1,9 @@
+export class RoomObjectCategory
+{
+ public static MINIMUM: number = -2;
+ public static ROOM: number = 0;
+ public static FLOOR: number = 10;
+ public static WALL: number = 20;
+ public static UNIT: number = 100;
+ public static CURSOR: number = 200;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/RoomObjectLogicType.ts b/packages/api/src/nitro/room/object/RoomObjectLogicType.ts
new file mode 100644
index 0000000..bb16bef
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectLogicType.ts
@@ -0,0 +1,74 @@
+export class RoomObjectLogicType
+{
+ public static FURNITURE_BASIC = 'furniture_basic';
+ public static FURNITURE_MULTISTATE = 'furniture_multistate';
+ public static FURNITURE_MULTIHEIGHT = 'furniture_multiheight';
+ public static FURNITURE_RANDOMSTATE = 'furniture_randomstate';
+ public static FURNITURE_PLACEHOLDER = 'furniture_placeholder';
+ public static FURNITURE_CREDIT = 'furniture_credit';
+ public static FURNITURE_STICKIE = 'furniture_stickie';
+ public static FURNITURE_PRESENT = 'furniture_present';
+ public static FURNITURE_TROPHY = 'furniture_trophy';
+ public static FURNITURE_ECOTRON_BOX = 'furniture_ecotron_box';
+ public static FURNITURE_DICE = 'furniture_dice';
+ public static FURNITURE_HOCKEY_SCORE = 'furniture_hockey_score';
+ public static FURNITURE_HABBOWHEEL = 'furniture_habbowheel';
+ public static FURNITURE_ONE_WAY_DOOR = 'furniture_one_way_door';
+ public static FURNITURE_PLANET_SYSTEM = 'furniture_planet_system';
+ public static FURNITURE_WINDOW = 'furniture_window';
+ public static FURNITURE_EXTERNAL_IMAGE_WALLITEM = 'furniture_external_image_wallitem';
+ public static FURNITURE_ROOMDIMMER = 'furniture_roomdimmer';
+ public static FURNITURE_SOUND_MACHINE = 'furniture_sound_machine';
+ public static FURNITURE_JUKEBOX = 'furniture_jukebox';
+ public static FURNITURE_CRACKABLE = 'furniture_crackable';
+ public static FURNITURE_PUSHABLE = 'furniture_pushable';
+ public static FURNITURE_CLOTHING_CHANGE = 'furniture_clothing_change';
+ public static FURNITURE_COUNTER_CLOCK = 'furniture_counter_clock';
+ public static FURNITURE_SCORE = 'furniture_score';
+ public static FURNITURE_ES = 'furniture_es';
+ public static FURNITURE_FIREWORKS = 'furniture_fireworks';
+ public static FURNITURE_SONG_DISK = 'furniture_song_disk';
+ public static FURNITURE_BB = 'furniture_bb';
+ public static FURNITURE_BG = 'furniture_bg';
+ public static FURNITURE_WELCOME_GIFT = 'furniture_welcome_gift';
+ public static FURNITURE_FLOOR_HOLE = 'furniture_floor_hole';
+ public static FURNITURE_MANNEQUIN = 'furniture_mannequin';
+ public static FURNITURE_GUILD_CUSTOMIZED = 'furniture_guild_customized';
+ public static FURNITURE_GROUP_FORUM_TERMINAL = 'furniture_group_forum_terminal';
+ public static FURNITURE_PET_CUSTOMIZATION = 'furniture_pet_customization';
+ public static FURNITURE_CUCKOO_CLOCK = 'furniture_cuckoo_clock';
+ public static FURNITURE_VOTE_COUNTER = 'furniture_vote_counter';
+ public static FURNITURE_VOTE_MAJORITY = 'furniture_vote_majority';
+ public static FURNITURE_SOUNDBLOCK = 'furniture_soundblock';
+ public static FURNITURE_RANDOM_TELEPORT = 'furniture_random_teleport';
+ public static FURNITURE_MONSTERPLANT_SEED = 'furniture_monsterplant_seed';
+ public static FURNITURE_PURCHASABLE_CLOTHING = 'furniture_purchasable_clothing';
+ public static FURNITURE_BACKGROUND_COLOR = 'furniture_background_color';
+ public static FURNITURE_MYSTERYBOX = 'furniture_mysterybox';
+ public static FURNITURE_EFFECTBOX = 'furniture_effectbox';
+ public static FURNITURE_MYSTERYTROPHY = 'furniture_mysterytrophy';
+ public static FURNITURE_ACHIEVEMENT_RESOLUTION = 'furniture_achievement_resolution';
+ public static FURNITURE_LOVELOCK = 'furniture_lovelock';
+ public static FURNITURE_WILDWEST_WANTED = 'furniture_wildwest_wanted';
+ public static FURNITURE_HWEEN_LOVELOCK = 'furniture_hween_lovelock';
+ public static FURNITURE_BADGE_DISPLAY = 'furniture_badge_display';
+ public static FURNITURE_HIGH_SCORE = 'furniture_high_score';
+ public static FURNITURE_INTERNAL_LINK = 'furniture_internal_link';
+ public static FURNITURE_CUSTOM_STACK_HEIGHT = 'furniture_custom_stack_height';
+ public static FURNITURE_YOUTUBE = 'furniture_youtube';
+ public static FURNITURE_RENTABLE_SPACE = 'furniture_rentable_space';
+ public static FURNITURE_CHANGE_STATE_WHEN_STEP_ON = 'furniture_change_state_when_step_on';
+ public static FURNITURE_VIMEO = 'furniture_vimeo';
+ public static FURNITURE_EDITABLE_INTERNAL_LINK = 'furniture_editable_internal_link';
+ public static FURNITURE_EDITABLE_ROOM_LINK = 'furniture_editable_room_link';
+ public static FURNITURE_CRAFTING_GIZMO = 'furniture_crafting_gizmo';
+ public static ROOM = 'room';
+ public static USER = 'user';
+ public static BOT = 'bot';
+ public static RENTABLE_BOT = 'rentable_bot';
+ public static PET = 'pet';
+ public static TILE_CURSOR = 'tile_cursor';
+ public static SELECTION_ARROW = 'selection_arrow';
+ public static GAME_SNOWBALL = 'game_snowball';
+ public static GAME_SNOWSPLASH = 'game_snowsplash';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/RoomObjectOperationType.ts b/packages/api/src/nitro/room/object/RoomObjectOperationType.ts
new file mode 100644
index 0000000..61b8b83
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectOperationType.ts
@@ -0,0 +1,15 @@
+export class RoomObjectOperationType
+{
+ public static OBJECT_UNDEFINED: string = 'OBJECT_UNDEFINED';
+ public static OBJECT_MOVE: string = 'OBJECT_MOVE';
+ public static OBJECT_PLACE: string = 'OBJECT_PLACE';
+ public static OBJECT_ROTATE_POSITIVE: string = 'OBJECT_ROTATE_POSITIVE';
+ public static OBJECT_ROTATE_NEGATIVE: string = 'OBJECT_ROTATE_NEGATIVE';
+ public static OBJECT_MOVE_TO: string = 'OBJECT_MOVE_TO';
+ public static OBJECT_PLACE_TO: string = 'OBJECT_PLACE_TO';
+ public static OBJECT_PICKUP: string = 'OBJECT_PICKUP';
+ public static OBJECT_PICKUP_BOT: string = 'OBJECT_PICKUP_BOT';
+ public static OBJECT_PICKUP_PET: string = 'OBJECT_PICKUP_PET';
+ public static OBJECT_EJECT: string = 'OBJECT_EJECT';
+ public static OBJECT_SAVE_STUFF_DATA: string = 'OBJECT_SAVE_STUFF_DATA';
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/RoomObjectType.ts b/packages/api/src/nitro/room/object/RoomObjectType.ts
new file mode 100644
index 0000000..dbfc3c7
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectType.ts
@@ -0,0 +1,7 @@
+export class RoomObjectType
+{
+ public static USER: number = 1;
+ public static PET: number = 2;
+ public static BOT: number = 3;
+ public static RENTABLE_BOT: number = 4;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/RoomObjectUserType.ts b/packages/api/src/nitro/room/object/RoomObjectUserType.ts
new file mode 100644
index 0000000..e476a24
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectUserType.ts
@@ -0,0 +1,40 @@
+export class RoomObjectUserType
+{
+ public static USER: string = 'user';
+ public static PET: string = 'pet';
+ public static BOT: string = 'bot';
+ public static RENTABLE_BOT: string = 'rentable_bot';
+ public static MONSTER_PLANT: string = 'monsterplant';
+ public static AVATAR_TYPES: { [key: string]: number } = { 'user': 1, 'pet': 2, 'bot': 3, 'rentable_bot': 4 };
+
+ public static getTypeNumber(type: string): number
+ {
+ return RoomObjectUserType.AVATAR_TYPES[type];
+ }
+
+ public static getTypeString(type: number): string
+ {
+ for(const key in RoomObjectUserType.AVATAR_TYPES)
+ {
+ if(!key) continue;
+
+ if(RoomObjectUserType.AVATAR_TYPES[key] !== type) continue;
+
+ return key;
+ }
+
+ return null;
+ }
+
+ public static getRealType(type: string): string
+ {
+ switch(type)
+ {
+ case RoomObjectUserType.BOT:
+ case RoomObjectUserType.RENTABLE_BOT:
+ return RoomObjectUserType.USER;
+ default:
+ return type;
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/RoomObjectVariable.ts b/packages/api/src/nitro/room/object/RoomObjectVariable.ts
new file mode 100644
index 0000000..3819ca5
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectVariable.ts
@@ -0,0 +1,144 @@
+export class RoomObjectVariable
+{
+ public static OBJECT_ROOM_ID: string = 'object_room_id';
+ public static OBJECT_ACCURATE_Z_VALUE: string = 'object_accurate_z_value';
+ public static TILE_CURSOR_HEIGHT: string = 'tile_cursor_height';
+ public static FIGURE: string = 'figure';
+ public static GENDER: string = 'gender';
+ public static OWN_USER: string = 'own_user';
+ public static FIGURE_CAN_STAND_UP: string = 'figure_can_stand_up';
+ public static FIGURE_VERTICAL_OFFSET: string = 'figure_vertical_offset';
+ public static FIGURE_TALK: string = 'figure_talk';
+ public static FIGURE_DANCE: string = 'figure_dance';
+ public static FIGURE_SLEEP: string = 'figure_sleep';
+ public static FIGURE_BLINK: string = 'figure_blink';
+ public static FIGURE_EFFECT: string = 'figure_effect';
+ public static FIGURE_CARRY_OBJECT: string = 'figure_carry_object';
+ public static FIGURE_USE_OBJECT: string = 'figure_use_object';
+ public static FIGURE_GESTURE: string = 'figure_gesture';
+ public static FIGURE_POSTURE: string = 'figure_posture';
+ public static FIGURE_POSTURE_PARAMETER: string = 'figure_posture_parameter';
+ public static FIGURE_HIGHLIGHT_ENABLE: string = 'figure_highlight_enable';
+ public static FIGURE_HIGHLIGHT: string = 'figure_highlight';
+ public static FURNITURE_PURCHASER_NAME: string = 'furniture_purchaser_name';
+ public static FURNITURE_PURCHASER_FIGURE: string = 'furniture_purchaser_figure';
+ public static STD: string = 'std';
+ public static FIGURE_SIGN: string = 'figure_sign';
+ public static FIGURE_FLAT_CONTROL: string = 'figure_flat_control';
+ public static FIGURE_IS_TYPING: string = 'figure_is_typing';
+ public static FIGURE_IS_MUTED: string = 'figure_is_muted';
+ public static FIGURE_GAINED_EXPERIENCE: string = 'figure_gained_experience';
+ public static FIGURE_EXPERIENCE_TIMESTAMP: string = 'figure_experience_timestamp';
+ public static FIGURE_NUMBER_VALUE: string = 'figure_number_value';
+ public static FIGURE_IS_PLAYING_GAME: string = 'figure_is_playing_game';
+ public static FIGURE_GUIDE_STATUS: string = 'figure_guide_status';
+ public static FIGURE_EXPRESSION: string = 'figure_expression';
+ public static HEAD_DIRECTION: string = 'head_direction';
+ public static FURNITURE_CUSTOM_VARIABLES: string = 'furniture_custom_variables';
+ public static FURNITURE_AUTOMATIC_STATE_INDEX: string = 'furniture_automatic_state_index';
+ public static FURNITURE_ALWAYS_STACKABLE: string = 'furniture_always_stackable';
+ public static FURNITURE_DISABLE_PICKING_ANIMATION: string = 'furniture_disable_picking_animation';
+ public static FURNITURE_DATA_FORMAT: string = 'furniture_data_format';
+ public static FURNITURE_UNIQUE_SERIAL_NUMBER: string = 'furniture_unique_serial_number';
+ public static FURNITURE_UNIQUE_EDITION_SIZE: string = 'furniture_unique_edition_size';
+ public static FURNITURE_CRACKABLE_STATE: string = 'furniture_crackable_state';
+ public static FURNITURE_CRACKABLE_HITS: string = 'furniture_crackable_hits';
+ public static FURNITURE_CRACKABLE_TARGET: string = 'furniture_crackable_target';
+ public static FURNITURE_CREDIT_VALUE: string = 'furniture_credit_value';
+ public static FURNITURE_DATA: string = 'furniture_data';
+ public static FURNITURE_ITEMDATA: string = 'furniture_itemdata';
+ public static FURNITURE_COLOR: string = 'furniture_color';
+ public static FURNITURE_LIFT_AMOUNT: string = 'furniure_lift_amount';
+ public static FURNITURE_GUILD_CUSTOMIZED_GUILD_ID: string = 'furniture_guild_customized_guild_id';
+ public static FURNITURE_GUILD_CUSTOMIZED_ASSET_NAME: string = 'furniture_guild_customized_asset_name';
+ public static FURNITURE_GUILD_CUSTOMIZED_COLOR_1: string = 'furniture_guild_customized_color_1';
+ public static FURNITURE_GUILD_CUSTOMIZED_COLOR_2: string = 'furniture_guild_customized_color_2';
+ public static FURNITURE_STATE_UPDATE_TIME: string = 'furniture_state_update_time';
+ public static FURNITURE_SELECTION_DISABLED: string = 'furniture_selection_disabled';
+ public static FURNITURE_SIZE_X: string = 'furniture_size_x';
+ public static FURNITURE_SIZE_Y: string = 'furniture_size_y';
+ public static FURNITURE_SIZE_Z: string = 'furniture_size_z';
+ public static FURNITURE_CENTER_X: string = 'furniture_center_x';
+ public static FURNITURE_CENTER_Y: string = 'furniture_center_y';
+ public static FURNITURE_CENTER_Z: string = 'furniture_center_z';
+ public static FURNITURE_ALLOWED_DIRECTIONS: string = 'furniture_allowed_directions';
+ public static FURNITURE_AD_URL: string = 'furniture_ad_url';
+ public static FURNITURE_TYPE_ID: string = 'furniture_type_id';
+ public static FURNITURE_EXTRAS: string = 'furniture_extras';
+ public static FURNITURE_EXPIRY_TIME: string = 'furniture_expiry_time';
+ public static FURNITURE_EXPIRTY_TIMESTAMP: string = 'furniture_expiry_timestamp';
+ public static FURNITURE_REAL_ROOM_OBJECT: string = 'furniture_real_room_object';
+ public static FURNITURE_IS_STICKIE: string = 'furniture_is_stickie';
+ public static FURNITURE_BRANDING_IMAGE_STATUS: string = 'furniture_branding_image_status';
+ public static FURNITURE_BRANDING_IMAGE_URL: string = 'furniture_branding_image_url';
+ public static FURNITURE_BRANDING_URL: string = 'furniture_branding_url';
+ public static FURNITURE_BRANDING_OFFSET_X: string = 'furniture_branding_offset_x';
+ public static FURNITURE_BRANDING_OFFSET_Y: string = 'furniture_branding_offset_y';
+ public static FURNITURE_BRANDING_OFFSET_Z: string = 'furniture_branding_offset_z';
+ public static FURNITURE_BADGE_IMAGE_STATUS: string = 'furniture_badge_image_status';
+ public static FURNITURE_BADGE_ASSET_NAME: string = 'furniture_badge_asset_name';
+ public static FURNITURE_BADGE_VISIBLE_IN_STATE: string = 'furniture_badge_visible_in_state';
+ public static FURNITURE_ALPHA_MULTIPLIER: string = 'furniture_alpha_multiplier';
+ public static FURNITURE_USAGE_POLICY: string = 'furniture_usage_policy';
+ public static FURNITURE_OWNER_ID: string = 'furniture_owner_id';
+ public static FURNITURE_OWNER_NAME: string = 'furniture_owner_name';
+ public static FURNITURE_ROOM_BACKGROUND_COLOR_HUE: string = 'furniture_room_background_color_hue';
+ public static FURNITURE_ROOM_BACKGROUND_COLOR_SATURATION: string = 'furniture_room_background_color_saturation';
+ public static FURNITURE_ROOM_BACKGROUND_COLOR_LIGHTNESS: string = 'furniture_room_background_color_lightness';
+ public static FURNITURE_USES_PLANE_MASK: string = 'furniture_uses_plane_mask';
+ public static FURNITURE_PLANE_MASK_TYPE: string = 'furniture_plane_mask_type';
+ public static FURNITURE_IS_VARIABLE_HEIGHT: string = 'furniture_is_variable_height';
+ public static FURNITURE_VOTE_MAJORITY_RESULT: string = 'furniture_vote_majority_result';
+ public static FURNITURE_VOTE_COUNTER_COUNT: string = 'furniture_vote_counter_count';
+ public static FURNITURE_SOUNDBLOCK_RELATIVE_ANIMATION_SPEED: string = 'furniture_soundblock_relative_animation_speed';
+ public static FURNITURE_MANNEQUIN_NAME: string = 'furniture_mannequin_name';
+ public static FURNITURE_MANNEQUIN_GENDER: string = 'furniture_mannequin_gender';
+ public static FURNITURE_MANNEQUIN_FIGURE: string = 'furniture_mannequin_figure';
+ public static FURNITURE_HIGHSCORE_SCORE_TYPE: string = 'furniture_highscore_score_type';
+ public static FURNITURE_HIGHSCORE_CLEAR_TYPE: string = 'furniture_highscore_clear_type';
+ public static FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT: string = 'furniture_highscore_data_entry_count';
+ public static FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_: string = 'furniture_highscore_data_entry_base_users_';
+ public static FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_: string = 'furniture_highscore_data_entry_base_score_';
+ public static FURNITURE_INTERNAL_LINK: string = 'furniture_internal_link';
+ public static FURNITURE_CLOTHING_BOY: string = 'furniture_clothing_boy';
+ public static FURNITURE_CLOTHING_GIRL: string = 'furniture_clothing_girl';
+ public static FURNITURE_PLANETSYSTEM_DATA: string = 'furniture_planetsystem_data';
+ public static FURNITURE_FIREWORKS_DATA: string = 'furniture_fireworks_data';
+ public static PET_PALETTE_INDEX: string = 'pet_palette_index';
+ public static PET_COLOR: string = 'pet_color';
+ public static PET_HEAD_ONLY: string = 'pet_head_only';
+ public static PET_CUSTOM_LAYER_IDS: string = 'pet_custom_layer_ids';
+ public static PET_CUSTOM_PARTS_IDS: string = 'pet_custom_part_ids';
+ public static PET_CUSTOM_PALETTE_IDS: string = 'pet_custom_palette_ids';
+ public static PET_IS_RIDING: string = 'pet_is_riding';
+ public static PET_TYPE: string = 'pet_type';
+ public static PET_ALLOWED_DIRECTIONS: string = 'pet_allowed_directions';
+ public static RACE: string = 'race';
+ public static ROOM_MAP_DATA: string = 'room_map_data';
+ public static ROOM_PLANE_MASK_XML: string = 'room_plane_mask_xml';
+ public static ROOM_FLOOR_TYPE: string = 'room_floor_type';
+ public static ROOM_WALL_TYPE: string = 'room_wall_type';
+ public static ROOM_LANDSCAPE_TYPE: string = 'room_landscape_type';
+ public static ROOM_WALL_THICKNESS: string = 'room_wall_thickness';
+ public static ROOM_FLOOR_THICKNESS: string = 'room_floor_thickness';
+ public static ROOM_FLOOR_HOLE_UPDATE_TIME: string = 'room_floor_hole_update_time';
+ public static ROOM_FLOOR_VISIBILITY: string = 'room_floor_visibility';
+ public static ROOM_WALL_VISIBILITY: string = 'room_wall_visibility';
+ public static ROOM_LANDSCAPE_VISIBILITY: string = 'room_landscape_visibility';
+ public static ROOM_DOOR_X: string = 'room_door_x';
+ public static ROOM_DOOR_Y: string = 'room_door_y';
+ public static ROOM_DOOR_Z: string = 'room_door_z';
+ public static ROOM_DOOR_DIR: string = 'room_door_dir';
+ public static ROOM_BACKGROUND_COLOR: string = 'room_background_color';
+ public static ROOM_COLORIZE_BG_ONLY: string = 'room_colorize_bg_only';
+ public static ROOM_RANDOM_SEED: string = 'room_random_seed';
+ public static ROOM_WORLD_TYPE: string = 'room_world_type';
+ public static ROOM_SELECTED_X: string = 'room_selected_x';
+ public static ROOM_SELECTED_Y: string = 'room_selected_y';
+ public static ROOM_SELECTED_Z: string = 'room_selected_z';
+ public static ROOM_SELECTED_PLANE: string = 'room_selected_plane';
+ public static IMAGE_QUERY_SCALE: string = 'image_query_scale';
+ public static FURNITURE_FRIENDFURNI_ENGRAVING: string = 'furniture_friendfurni_engraving_type';
+ public static SESSION_URL_PREFIX: string = 'session_url_prefix';
+ public static SESSION_CURRENT_USER_ID: string = 'session_current_user_id';
+}
diff --git a/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts b/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts
new file mode 100644
index 0000000..0af0485
--- /dev/null
+++ b/packages/api/src/nitro/room/object/RoomObjectVisualizationType.ts
@@ -0,0 +1,40 @@
+export class RoomObjectVisualizationType
+{
+ public static FURNITURE_STATIC = 'furniture_static';
+ public static FURNITURE_ANIMATED = 'furniture_animated';
+ public static FURNITURE_RESETTING_ANIMATED = 'furniture_resetting_animated';
+ public static FURNITURE_POSTER = 'furniture_poster';
+ public static FURNITURE_EXTERNAL_IMAGE = 'furniture_external_image';
+ public static FURNITURE_HABBOWHEEL = 'furniture_habbowheel';
+ public static FURNITURE_VAL_RANDOMIZER = 'furniture_val_randomizer';
+ public static FURNITURE_BOTTLE = 'furniture_bottle';
+ public static FURNITURE_PLANET_SYSTEM = 'furniture_planet_system';
+ public static FURNITURE_QUEUE_TILE = 'furniture_queue_tile';
+ public static FURNITURE_PARTY_BEAMER = 'furniture_party_beamer';
+ public static FURNITURE_CUBOID = 'furniture_cuboid';
+ public static FURNITURE_GIFT_WRAPPED = 'furniture_gift_wrapped';
+ public static FURNITURE_GIFT_WRAPPED_FIREWORKS = 'furniture_gift_wrapped_fireworks';
+ public static FURNITURE_COUNTER_CLOCK = 'furniture_counter_clock';
+ public static FURNITURE_WATER_AREA = 'furniture_water_area';
+ public static FURNITURE_SCORE_BOARD = 'furniture_score_board';
+ public static FURNITURE_FIREWORKS = 'furniture_fireworks';
+ public static FURNITURE_BB = 'furniture_bb';
+ public static FURNITURE_ISOMETRIC_BB = 'furniture_isometric_bb';
+ public static FURNITURE_BG = 'furniture_bg';
+ public static FURNITURE_STICKIE = 'furniture_stickie';
+ public static FURNITURE_MANNEQUIN = 'furniture_mannequin';
+ public static FURNITURE_GUILD_CUSTOMIZED = 'furniture_guild_customized';
+ public static FURNITURE_GUILD_ISOMETRIC_BADGE = 'furniture_guild_isometric_badge';
+ public static FURNITURE_VOTE_COUNTER = 'furniture_vote_counter';
+ public static FURNITURE_VOTE_MAJORITY = 'furniture_vote_majority';
+ public static FURNITURE_SOUNDBLOCK = 'furniture_soundblock';
+ public static FURNITURE_BADGE_DISPLAY = 'furniture_badge_display';
+ public static FURNITURE_YOUTUBE = 'furniture_youtube';
+ public static FURNITURE_BUILDER_PLACEHOLDER = 'furniture_builder_placeholder';
+ public static ROOM = 'room';
+ public static USER = 'user';
+ public static PET_ANIMATED = 'pet_animated';
+ public static BOT = 'bot';
+ public static RENTABLE_BOT = 'rentable_bot';
+ public static TILE_CURSOR = 'tile_cursor';
+}
diff --git a/packages/api/src/nitro/room/object/data/IObjectData.ts b/packages/api/src/nitro/room/object/data/IObjectData.ts
new file mode 100644
index 0000000..be56f1c
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/IObjectData.ts
@@ -0,0 +1,17 @@
+import { IMessageDataWrapper } from '../../../../communication';
+import { IRoomObjectModel } from '../../../../room';
+
+export interface IObjectData
+{
+ state: number;
+ isUnique: boolean;
+ uniqueNumber: number;
+ uniqueSeries: number;
+ rarityLevel: number;
+ flags: number;
+ parseWrapper(wrapper: IMessageDataWrapper): void;
+ initializeFromRoomObjectModel(model: IRoomObjectModel): void;
+ writeRoomObjectModel(model: IRoomObjectModel): void;
+ getLegacyString(): string;
+ compare(data: IObjectData): boolean;
+}
diff --git a/packages/api/src/nitro/room/object/data/ObjectDataBase.ts b/packages/api/src/nitro/room/object/data/ObjectDataBase.ts
new file mode 100644
index 0000000..25ddfcc
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/ObjectDataBase.ts
@@ -0,0 +1,99 @@
+import { IMessageDataWrapper } from '../../../../communication';
+import { IRoomObjectModel } from '../../../../room';
+import { RoomObjectVariable } from '../RoomObjectVariable';
+import { IObjectData } from './IObjectData';
+import { ObjectDataFlags } from './ObjectDataFlags';
+
+export class ObjectDataBase implements IObjectData
+{
+ private _flags: number;
+ private _uniqueNumber: number;
+ private _uniqueSeries: number;
+
+ constructor()
+ {
+ this._flags = 0;
+ this._uniqueNumber = 0;
+ this._uniqueSeries = 0;
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if((this._flags & ObjectDataFlags.UNIQUE_SET) > 0)
+ {
+ this._uniqueNumber = wrapper.readInt();
+ this._uniqueSeries = wrapper.readInt();
+ }
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ this._uniqueNumber = model.getValue(RoomObjectVariable.FURNITURE_UNIQUE_SERIAL_NUMBER);
+ this._uniqueSeries = model.getValue(RoomObjectVariable.FURNITURE_UNIQUE_EDITION_SIZE);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ if(!model) return;
+
+ model.setValue(RoomObjectVariable.FURNITURE_UNIQUE_SERIAL_NUMBER, this._uniqueNumber);
+ model.setValue(RoomObjectVariable.FURNITURE_UNIQUE_EDITION_SIZE, this._uniqueSeries);
+ }
+
+ public getLegacyString(): string
+ {
+ return '';
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return false;
+ }
+
+ public get state(): number
+ {
+ const state = parseInt(this.getLegacyString());
+
+ return isNaN(state) ? 0 : state;
+ }
+
+ public get isUnique(): boolean
+ {
+ return this._uniqueSeries > 0;
+ }
+
+ public get uniqueNumber(): number
+ {
+ return this._uniqueNumber;
+ }
+
+ public set uniqueNumber(number: number)
+ {
+ this._uniqueNumber = number;
+ }
+
+ public get uniqueSeries(): number
+ {
+ return this._uniqueSeries;
+ }
+
+ public set uniqueSeries(series: number)
+ {
+ this._uniqueSeries = series;
+ }
+
+ public get rarityLevel(): number
+ {
+ return -1;
+ }
+
+ public get flags(): number
+ {
+ return this._flags;
+ }
+
+ public set flags(flags: number)
+ {
+ this._flags = flags;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts b/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts
new file mode 100644
index 0000000..b6f3e5d
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/ObjectDataFactory.ts
@@ -0,0 +1,44 @@
+import { IObjectData } from './IObjectData';
+import { CrackableDataType, EmptyDataType, HighScoreDataType, LegacyDataType, MapDataType, NumberDataType, StringDataType, VoteDataType } from './type';
+
+export class ObjectDataFactory
+{
+ public static getData(flags: number): IObjectData
+ {
+ let objectData: IObjectData = null;
+
+ switch(flags & 0xFF)
+ {
+ case CrackableDataType.FORMAT_KEY:
+ objectData = new CrackableDataType();
+ break;
+ case EmptyDataType.FORMAT_KEY:
+ objectData = new EmptyDataType();
+ break;
+ case HighScoreDataType.FORMAT_KEY:
+ objectData = new HighScoreDataType();
+ break;
+ case LegacyDataType.FORMAT_KEY:
+ objectData = new LegacyDataType();
+ break;
+ case MapDataType.FORMAT_KEY:
+ objectData = new MapDataType();
+ break;
+ case NumberDataType.FORMAT_KEY:
+ objectData = new NumberDataType();
+ break;
+ case StringDataType.FORMAT_KEY:
+ objectData = new StringDataType();
+ break;
+ case VoteDataType.FORMAT_KEY:
+ objectData = new VoteDataType();
+ break;
+ }
+
+ if(!objectData) return null;
+
+ objectData.flags = (flags & 0xFF00);
+
+ return objectData;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts b/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts
new file mode 100644
index 0000000..5d5a119
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/ObjectDataFlags.ts
@@ -0,0 +1,4 @@
+export class ObjectDataFlags
+{
+ public static UNIQUE_SET = 256;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/data/ObjectDataKey.ts b/packages/api/src/nitro/room/object/data/ObjectDataKey.ts
new file mode 100644
index 0000000..eff1160
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/ObjectDataKey.ts
@@ -0,0 +1,11 @@
+export class ObjectDataKey
+{
+ public static LEGACY_KEY: number = 0;
+ public static MAP_KEY: number = 1;
+ public static STRING_KEY: number = 2;
+ public static VOTE_KEY: number = 3;
+ public static EMPTY_KEY: number = 4;
+ public static NUMBER_KEY: number = 5;
+ public static HIGHSCORE_KEY: number = 6;
+ public static CRACKABLE_KEY: number = 7;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/data/index.ts b/packages/api/src/nitro/room/object/data/index.ts
new file mode 100644
index 0000000..64993e4
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/index.ts
@@ -0,0 +1,6 @@
+export * from './IObjectData';
+export * from './ObjectDataBase';
+export * from './ObjectDataFactory';
+export * from './ObjectDataFlags';
+export * from './ObjectDataKey';
+export * from './type';
diff --git a/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts b/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts
new file mode 100644
index 0000000..8fd96fd
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/CrackableDataType.ts
@@ -0,0 +1,74 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class CrackableDataType extends ObjectDataBase implements IObjectData
+{
+ public static FORMAT_KEY = ObjectDataKey.CRACKABLE_KEY;
+
+ private _state: string;
+ private _hits: number;
+ private _target: number;
+
+ constructor()
+ {
+ super();
+
+ this._state = '';
+ this._hits = 0;
+ this._target = 0;
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._state = wrapper.readString();
+ this._hits = wrapper.readInt();
+ this._target = wrapper.readInt();
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.initializeFromRoomObjectModel(model);
+
+ this._state = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_STATE);
+ this._hits = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_HITS);
+ this._target = model.getValue(RoomObjectVariable.FURNITURE_CRACKABLE_TARGET);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, CrackableDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_STATE, this._state);
+ model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_HITS, this._hits);
+ model.setValue(RoomObjectVariable.FURNITURE_CRACKABLE_TARGET, this._target);
+ }
+
+ public getLegacyString(): string
+ {
+ return this._state;
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return true;
+ }
+
+ public get hits(): number
+ {
+ return this._hits;
+ }
+
+ public get target(): number
+ {
+ return this._target;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts b/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts
new file mode 100644
index 0000000..62d9d03
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/EmptyDataType.ts
@@ -0,0 +1,39 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class EmptyDataType extends ObjectDataBase implements IObjectData
+{
+ public static FORMAT_KEY = ObjectDataKey.EMPTY_KEY;
+
+ private _state: string;
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._state = '';
+
+ super.parseWrapper(wrapper);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, EmptyDataType.FORMAT_KEY);
+ }
+
+ public getLegacyString(): string
+ {
+ return this._state;
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return super.compare(data);
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/HighScoreData.ts b/packages/api/src/nitro/room/object/data/type/HighScoreData.ts
new file mode 100644
index 0000000..cb18b33
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/HighScoreData.ts
@@ -0,0 +1,36 @@
+export class HighScoreData
+{
+ private _score: number;
+ private _users: string[];
+
+ constructor()
+ {
+ this._score = -1;
+ this._users = [];
+ }
+
+ public get score(): number
+ {
+ return this._score;
+ }
+
+ public set score(k: number)
+ {
+ this._score = k;
+ }
+
+ public get users(): string[]
+ {
+ return this._users;
+ }
+
+ public set users(k: string[])
+ {
+ this._users = k;
+ }
+
+ public addUsername(k: string): void
+ {
+ this._users.push(k);
+ }
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts b/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts
new file mode 100644
index 0000000..205c2e8
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/HighScoreDataType.ts
@@ -0,0 +1,131 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+import { HighScoreData } from './HighScoreData';
+
+export class HighScoreDataType extends ObjectDataBase implements IObjectData
+{
+ public static FORMAT_KEY = ObjectDataKey.HIGHSCORE_KEY;
+
+ private _state: string;
+ private _scoreType: number;
+ private _clearType: number;
+ private _entries: HighScoreData[];
+
+ constructor()
+ {
+ super();
+
+ this._state = '';
+ this._scoreType = -1;
+ this._clearType = -1;
+ this._entries = [];
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._state = wrapper.readString();
+ this._scoreType = wrapper.readInt();
+ this._clearType = wrapper.readInt();
+
+ let totalScores = wrapper.readInt();
+
+ while(totalScores > 0)
+ {
+ const data = new HighScoreData();
+
+ data.score = wrapper.readInt();
+
+ let totalUsers = wrapper.readInt();
+
+ while(totalUsers > 0)
+ {
+ data.addUsername(wrapper.readString());
+
+ totalUsers--;
+ }
+
+ this._entries.push(data);
+
+ totalScores--;
+ }
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ this._scoreType = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_SCORE_TYPE);
+ this._clearType = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_CLEAR_TYPE);
+ this._entries = [];
+
+ const totalEntries = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT);
+
+ let i = 0;
+
+ while(i < totalEntries)
+ {
+ const data = new HighScoreData();
+
+ data.score = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_ + i);
+ data.users = model.getValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_ + i);
+
+ this._entries.push(data);
+
+ i++;
+ }
+
+ super.initializeFromRoomObjectModel(model);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, HighScoreDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_SCORE_TYPE, this._scoreType);
+ model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_CLEAR_TYPE, this._clearType);
+
+ if(this._entries)
+ {
+ model.setValue(RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_COUNT, this._entries.length);
+
+ let i = 0;
+
+ while(i < this._entries.length)
+ {
+ const entry = this._entries[i];
+
+ model.setValue((RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_SCORE_ + i), entry.score);
+ model.setValue((RoomObjectVariable.FURNITURE_HIGHSCORE_DATA_ENTRY_BASE_USERS_ + i), entry.users);
+
+ i++;
+ }
+ }
+ }
+
+ public getLegacyString(): string
+ {
+ return this._state;
+ }
+
+ public get entries(): HighScoreData[]
+ {
+ return this._entries;
+ }
+
+ public get clearType(): number
+ {
+ return this._clearType;
+ }
+
+ public get scoreType(): number
+ {
+ return this._scoreType;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts b/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts
new file mode 100644
index 0000000..29eb592
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/LegacyDataType.ts
@@ -0,0 +1,59 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class LegacyDataType extends ObjectDataBase implements IObjectData
+{
+ public static FORMAT_KEY = ObjectDataKey.LEGACY_KEY;
+
+ private _data: string;
+
+ constructor()
+ {
+ super();
+
+ this._data = '';
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._data = wrapper.readString();
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.initializeFromRoomObjectModel(model);
+
+ this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, LegacyDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data);
+ }
+
+ public getLegacyString(): string
+ {
+ return this._data;
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return (this._data === data.getLegacyString());
+ }
+
+ public setString(data: string): void
+ {
+ this._data = data;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/MapDataType.ts b/packages/api/src/nitro/room/object/data/type/MapDataType.ts
new file mode 100644
index 0000000..4d45794
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/MapDataType.ts
@@ -0,0 +1,90 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class MapDataType extends ObjectDataBase
+{
+ public static FORMAT_KEY = ObjectDataKey.MAP_KEY;
+
+ private static STATE: string = 'state';
+ private static RARITY: string = 'rarity';
+
+ private _data: { [index: string]: string };
+
+ constructor()
+ {
+ super();
+
+ this._data = {};
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._data = {};
+
+ const totalSets = wrapper.readInt();
+
+ if(totalSets) for(let i = 0; i < totalSets; i++) this._data[wrapper.readString()] = wrapper.readString();
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.initializeFromRoomObjectModel(model);
+
+ this._data = model.getValue<{ [index: string]: string }>(RoomObjectVariable.FURNITURE_DATA) || {};
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, MapDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data);
+ }
+
+ public getLegacyString(): string
+ {
+ if(!this._data) return '';
+
+ const state = this._data[MapDataType.STATE];
+
+ if(state === undefined || state === null) return '';
+
+ return state;
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return false;
+ }
+
+ public getValue(key: string): string
+ {
+ return this._data[key];
+ }
+
+ public get rarityLevel(): number
+ {
+ if(!this._data) return -1;
+
+ const state = this._data[MapDataType.RARITY];
+
+ if(state === undefined || state === null) return -1;
+
+ return parseInt(state);
+ }
+
+ // TODO: How to get the keys?
+ public get data()
+ {
+ return this._data;
+ }
+
+}
diff --git a/packages/api/src/nitro/room/object/data/type/NumberDataType.ts b/packages/api/src/nitro/room/object/data/type/NumberDataType.ts
new file mode 100644
index 0000000..2790189
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/NumberDataType.ts
@@ -0,0 +1,91 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class NumberDataType extends ObjectDataBase
+{
+ public static FORMAT_KEY = ObjectDataKey.NUMBER_KEY;
+
+ private static STATE: number = 0;
+
+ private _data: number[];
+
+ constructor()
+ {
+ super();
+
+ this._data = [];
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._data = [];
+
+ const totalNumbers = wrapper.readInt();
+
+ if(totalNumbers) for(let i = 0; i < totalNumbers; i++) this._data.push(wrapper.readInt());
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.initializeFromRoomObjectModel(model);
+
+ this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, NumberDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data);
+ }
+
+ public getLegacyString(): string
+ {
+ if(!this._data || !this._data.length) return '';
+
+ return this._data[NumberDataType.STATE].toString();
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ if(!(data instanceof NumberDataType)) return false;
+
+ let i = 0;
+
+ while(i < this._data.length)
+ {
+ if(i === 0)
+ {
+ //
+ }
+ else
+ {
+ if(this._data[i] !== data.getValue(i)) return false;
+ }
+
+ i++;
+ }
+
+ return true;
+ }
+
+ public getValue(index: number): number
+ {
+ if(!this._data || !this._data.length) return -1;
+
+ const value = this._data[index];
+
+ if(value === undefined || value === null) return -1;
+
+ return value;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/StringDataType.ts b/packages/api/src/nitro/room/object/data/type/StringDataType.ts
new file mode 100644
index 0000000..7101854
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/StringDataType.ts
@@ -0,0 +1,90 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class StringDataType extends ObjectDataBase
+{
+ public static FORMAT_KEY = ObjectDataKey.STRING_KEY;
+
+ private static STATE: number = 0;
+
+ private _data: string[];
+
+ constructor()
+ {
+ super();
+
+ this._data = [];
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._data = [];
+
+ const totalStrings = wrapper.readInt();
+
+ if(totalStrings) for(let i = 0; i < totalStrings; i++) this._data.push(wrapper.readString());
+
+ super.parseWrapper(wrapper);
+ }
+
+ public initializeFromRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.initializeFromRoomObjectModel(model);
+
+ this._data = model.getValue(RoomObjectVariable.FURNITURE_DATA);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, StringDataType.FORMAT_KEY);
+ model.setValue(RoomObjectVariable.FURNITURE_DATA, this._data);
+ }
+
+ public getLegacyString(): string
+ {
+ if(!this._data || !this._data.length) return '';
+
+ return this._data[StringDataType.STATE];
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ if(!(data instanceof StringDataType)) return false;
+
+ let i = 0;
+
+ while(i < this._data.length)
+ {
+ if(i === 0)
+ {
+ //
+ }
+ else
+ {
+ if(this._data[i] !== data.getValue(i)) return false;
+ }
+
+ i++;
+ }
+
+ return true;
+ }
+
+ public getValue(index: number): string
+ {
+ return this._data[index] || '';
+ }
+
+ public setValue(data: string[]): void
+ {
+ this._data = data;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/VoteDataType.ts b/packages/api/src/nitro/room/object/data/type/VoteDataType.ts
new file mode 100644
index 0000000..5650361
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/VoteDataType.ts
@@ -0,0 +1,66 @@
+import { IMessageDataWrapper } from '../../../../../communication';
+import { IRoomObjectModel } from '../../../../../room';
+import { RoomObjectVariable } from '../../RoomObjectVariable';
+import { IObjectData } from '../IObjectData';
+import { ObjectDataBase } from '../ObjectDataBase';
+import { ObjectDataKey } from '../ObjectDataKey';
+
+export class VoteDataType extends ObjectDataBase
+{
+ public static FORMAT_KEY = ObjectDataKey.VOTE_KEY;
+
+ private _state: string;
+ private _result: number;
+
+ constructor()
+ {
+ super();
+
+ this._state = '';
+ this._result = 0;
+ }
+
+ public parseWrapper(wrapper: IMessageDataWrapper): void
+ {
+ if(!wrapper) return;
+
+ this._state = wrapper.readString();
+ this._result = wrapper.readInt();
+
+ super.parseWrapper(wrapper);
+ }
+
+ public writeRoomObjectModel(model: IRoomObjectModel): void
+ {
+ super.writeRoomObjectModel(model);
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA_FORMAT, VoteDataType.FORMAT_KEY);
+
+ const data: { [index: string]: string } = {};
+
+ data['S'] = this._state;
+ data['R'] = this._result.toString();
+
+ model.setValue(RoomObjectVariable.FURNITURE_DATA, data);
+ }
+
+ public getLegacyString(): string
+ {
+ return this._state;
+ }
+
+ public compare(data: IObjectData): boolean
+ {
+ return true;
+ }
+
+ public setString(state: string): void
+ {
+ this._state = state;
+ }
+
+ public get result(): number
+ {
+ return this._result;
+ }
+}
diff --git a/packages/api/src/nitro/room/object/data/type/index.ts b/packages/api/src/nitro/room/object/data/type/index.ts
new file mode 100644
index 0000000..6f81bc5
--- /dev/null
+++ b/packages/api/src/nitro/room/object/data/type/index.ts
@@ -0,0 +1,9 @@
+export * from './CrackableDataType';
+export * from './EmptyDataType';
+export * from './HighScoreData';
+export * from './HighScoreDataType';
+export * from './LegacyDataType';
+export * from './MapDataType';
+export * from './NumberDataType';
+export * from './StringDataType';
+export * from './VoteDataType';
diff --git a/packages/api/src/nitro/room/object/index.ts b/packages/api/src/nitro/room/object/index.ts
new file mode 100644
index 0000000..b2bff00
--- /dev/null
+++ b/packages/api/src/nitro/room/object/index.ts
@@ -0,0 +1,11 @@
+export * from './data';
+export * from './data/type';
+export * from './IPetFigureData';
+export * from './IRoomMapData';
+export * from './RoomObjectCategory';
+export * from './RoomObjectLogicType';
+export * from './RoomObjectOperationType';
+export * from './RoomObjectType';
+export * from './RoomObjectUserType';
+export * from './RoomObjectVariable';
+export * from './RoomObjectVisualizationType';
diff --git a/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts b/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts
new file mode 100644
index 0000000..5427932
--- /dev/null
+++ b/packages/api/src/nitro/room/utils/IFurnitureStackingHeightMap.ts
@@ -0,0 +1,11 @@
+export interface IFurnitureStackingHeightMap
+{
+ dispose: () => void;
+ getTileHeight(x: number, y: number): number;
+ setTileHeight(x: number, y: number, height: number): void;
+ setStackingBlocked(x: number, y: number, isNotStackable: boolean): void;
+ setIsRoomTile(x: number, y: number, isRoomTile: boolean): void;
+ validateLocation(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: number, _arg_6: number, _arg_7: number, _arg_8: number, _arg_9: boolean, _arg_10?: number): boolean;
+ readonly width: number;
+ readonly height: number;
+}
diff --git a/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts b/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts
new file mode 100644
index 0000000..e3aab44
--- /dev/null
+++ b/packages/api/src/nitro/room/utils/ILegacyWallGeometry.ts
@@ -0,0 +1,18 @@
+import { IVector3D } from '../../../utils';
+
+export interface ILegacyWallGeometry
+{
+ dispose: () => void;
+ readonly disposed: boolean;
+ scale: number;
+ initialize(width: number, height: number, floorHeight: number): void;
+ setHeight(x: number, y: number, height: number): boolean;
+ getHeight(x: number, y: number): number;
+ getLocation(k: number, _arg_2: number, _arg_3: number, _arg_4: number, _arg_5: string): IVector3D;
+ getLocationOldFormat(k: number, _arg_2: number, _arg_3: string): IVector3D;
+ getOldLocation(k: IVector3D, _arg_2: number): [number, number, number, number, string];
+ getOldLocationString(k: IVector3D, _arg_2: number): string;
+ getDirection(k: string): number;
+ getFloorAltitude(k: number, _arg_2: number): number;
+ isRoomTile(k: number, _arg_2: number): boolean;
+}
diff --git a/packages/api/src/nitro/room/utils/ITileObjectMap.ts b/packages/api/src/nitro/room/utils/ITileObjectMap.ts
new file mode 100644
index 0000000..b7fda05
--- /dev/null
+++ b/packages/api/src/nitro/room/utils/ITileObjectMap.ts
@@ -0,0 +1,11 @@
+import { IRoomObject } from '../../../room';
+
+export interface ITileObjectMap
+{
+ clear(): void;
+ populate(k: IRoomObject[]): void;
+ dispose(): void;
+ getObjectIntTile(k: number, _arg_2: number): IRoomObject;
+ setObjectInTile(k: number, _arg_2: number, _arg_3: IRoomObject): void;
+ addRoomObject(k: IRoomObject): void;
+}
diff --git a/packages/api/src/nitro/room/utils/ObjectRolling.ts b/packages/api/src/nitro/room/utils/ObjectRolling.ts
new file mode 100644
index 0000000..93d2ca3
--- /dev/null
+++ b/packages/api/src/nitro/room/utils/ObjectRolling.ts
@@ -0,0 +1,40 @@
+import { IVector3D } from '../../../utils';
+
+export class ObjectRolling
+{
+ public static MOVE: string = 'mv';
+ public static SLIDE: string = 'sld';
+
+ private _id: number;
+ private _location: IVector3D;
+ private _targetLocation: IVector3D;
+ private _movementType: string;
+
+ constructor(id: number, location: IVector3D, targetLocation: IVector3D, movementType: string = null)
+ {
+ this._id = id;
+ this._location = location;
+ this._targetLocation = targetLocation;
+ this._movementType = movementType;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get location(): IVector3D
+ {
+ return this._location;
+ }
+
+ public get targetLocation(): IVector3D
+ {
+ return this._targetLocation;
+ }
+
+ public get movementType(): string
+ {
+ return this._movementType;
+ }
+}
diff --git a/packages/api/src/nitro/room/utils/index.ts b/packages/api/src/nitro/room/utils/index.ts
new file mode 100644
index 0000000..e8d1668
--- /dev/null
+++ b/packages/api/src/nitro/room/utils/index.ts
@@ -0,0 +1,4 @@
+export * from './IFurnitureStackingHeightMap';
+export * from './ILegacyWallGeometry';
+export * from './ITileObjectMap';
+export * from './ObjectRolling';
diff --git a/packages/api/src/nitro/session/BreedingPetInfo.ts b/packages/api/src/nitro/session/BreedingPetInfo.ts
new file mode 100644
index 0000000..c3ff6c4
--- /dev/null
+++ b/packages/api/src/nitro/session/BreedingPetInfo.ts
@@ -0,0 +1,55 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+
+export class BreedingPetInfo
+{
+ private _webId: number;
+ private _name: string;
+ private _level: number;
+ private _figure: string;
+ private _owner: string;
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ if(!wrapper) throw new Error('invalid_wrapper');
+
+ this._webId = wrapper.readInt();
+ this._name = wrapper.readString();
+ this._level = wrapper.readInt();
+ this._figure = wrapper.readString();
+ this._owner = wrapper.readString();
+ }
+
+ public dispose(): void
+ {
+ this._webId = 0;
+ this._name = '';
+ this._level = 0;
+ this._figure = '';
+ this._owner = '';
+ }
+
+ public get webId(): number
+ {
+ return this._webId;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get level(): number
+ {
+ return this._level;
+ }
+
+ public get figure(): string
+ {
+ return this._figure;
+ }
+
+ public get owner(): string
+ {
+ return this._owner;
+ }
+}
diff --git a/packages/api/src/nitro/session/FurnitureType.ts b/packages/api/src/nitro/session/FurnitureType.ts
new file mode 100644
index 0000000..7f8aff0
--- /dev/null
+++ b/packages/api/src/nitro/session/FurnitureType.ts
@@ -0,0 +1,10 @@
+export enum FurnitureType
+{
+ FLOOR = 'S',
+ WALL = 'I',
+ EFFECT = 'E',
+ BADGE = 'B',
+ ROBOT = 'R',
+ HABBO_CLUB = 'H',
+ PET = 'P'
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/session/IFurnitureData.ts b/packages/api/src/nitro/session/IFurnitureData.ts
new file mode 100644
index 0000000..0ebc9c7
--- /dev/null
+++ b/packages/api/src/nitro/session/IFurnitureData.ts
@@ -0,0 +1,33 @@
+export interface IFurnitureData
+{
+ type: string;
+ id: number;
+ className: string;
+ fullName: string;
+ category: string;
+ hasIndexedColor: boolean;
+ colorIndex: number;
+ revision: number;
+ tileSizeX: number;
+ tileSizeY: number;
+ tileSizeZ: number;
+ colors: number[];
+ name: string;
+ description: string;
+ adUrl: string;
+ purchaseOfferId: number;
+ rentOfferId: number;
+ customParams: string;
+ specialType: number;
+ purchaseCouldBeUsedForBuyout: boolean;
+ rentCouldBeUsedForBuyout: boolean;
+ availableForBuildersClub: boolean;
+ canStandOn: boolean;
+ canSitOn: boolean;
+ canLayOn: boolean;
+ isExternalImage: boolean;
+ excludeDynamic: boolean;
+ furniLine: string;
+ environment: string;
+ rare: boolean;
+}
diff --git a/packages/api/src/nitro/session/IFurnitureDataListener.ts b/packages/api/src/nitro/session/IFurnitureDataListener.ts
new file mode 100644
index 0000000..e94ec16
--- /dev/null
+++ b/packages/api/src/nitro/session/IFurnitureDataListener.ts
@@ -0,0 +1,4 @@
+export interface IFurnitureDataListener
+{
+ loadFurnitureData(): void;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/session/IGroupInformationManager.ts b/packages/api/src/nitro/session/IGroupInformationManager.ts
new file mode 100644
index 0000000..4304483
--- /dev/null
+++ b/packages/api/src/nitro/session/IGroupInformationManager.ts
@@ -0,0 +1,5 @@
+export interface IGroupInformationManager
+{
+ init(): void;
+ getGroupBadge(groupId: number): string;
+}
diff --git a/packages/api/src/nitro/session/IIgnoredUsersManager.ts b/packages/api/src/nitro/session/IIgnoredUsersManager.ts
new file mode 100644
index 0000000..aa065b3
--- /dev/null
+++ b/packages/api/src/nitro/session/IIgnoredUsersManager.ts
@@ -0,0 +1,9 @@
+export interface IIgnoredUsersManager
+{
+ init(): void;
+ requestIgnoredUsers(username: string): void;
+ ignoreUserId(id: number): void;
+ ignoreUser(name: string): void;
+ unignoreUser(name: string): void;
+ isIgnored(name: string): boolean;
+}
diff --git a/packages/api/src/nitro/session/IPetCustomPart.ts b/packages/api/src/nitro/session/IPetCustomPart.ts
new file mode 100644
index 0000000..8d4f968
--- /dev/null
+++ b/packages/api/src/nitro/session/IPetCustomPart.ts
@@ -0,0 +1,6 @@
+export interface IPetCustomPart
+{
+ layerId: number;
+ partId: number;
+ paletteId: number;
+}
diff --git a/packages/api/src/nitro/session/IPollChoice.ts b/packages/api/src/nitro/session/IPollChoice.ts
new file mode 100644
index 0000000..e645676
--- /dev/null
+++ b/packages/api/src/nitro/session/IPollChoice.ts
@@ -0,0 +1,6 @@
+export interface IPollChoice
+{
+ value: string;
+ choiceText: string;
+ choiceType: number;
+}
diff --git a/packages/api/src/nitro/session/IPollQuestion.ts b/packages/api/src/nitro/session/IPollQuestion.ts
new file mode 100644
index 0000000..d85fd9f
--- /dev/null
+++ b/packages/api/src/nitro/session/IPollQuestion.ts
@@ -0,0 +1,14 @@
+import { IPollChoice } from './IPollChoice';
+
+export interface IPollQuestion
+{
+ questionId: number;
+ questionType: number;
+ sortOrder: number;
+ questionText: string;
+ questionCategory: number;
+ questionAnswerType: number;
+ questionAnswerCount: number;
+ children: IPollQuestion[];
+ questionChoices: IPollChoice[];
+}
diff --git a/packages/api/src/nitro/session/IProductData.ts b/packages/api/src/nitro/session/IProductData.ts
new file mode 100644
index 0000000..95cf4d1
--- /dev/null
+++ b/packages/api/src/nitro/session/IProductData.ts
@@ -0,0 +1,6 @@
+export interface IProductData
+{
+ type: string;
+ name: string;
+ description: string;
+}
diff --git a/packages/api/src/nitro/session/IProductDataListener.ts b/packages/api/src/nitro/session/IProductDataListener.ts
new file mode 100644
index 0000000..2d0c4eb
--- /dev/null
+++ b/packages/api/src/nitro/session/IProductDataListener.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from '../../common';
+
+export interface IProductDataListener extends IDisposable
+{
+ loadProductData(): void;
+}
diff --git a/packages/api/src/nitro/session/IQuestion.ts b/packages/api/src/nitro/session/IQuestion.ts
new file mode 100644
index 0000000..fdd1b3f
--- /dev/null
+++ b/packages/api/src/nitro/session/IQuestion.ts
@@ -0,0 +1,12 @@
+export interface IQuestion
+{
+ id: number;
+ number: number;
+ type: number;
+ content: string;
+ selection_min?: number;
+ selections?: string[];
+ selection_values?: string[];
+ selection_count?: number;
+ selection_max?: number;
+}
diff --git a/packages/api/src/nitro/session/IRoomHandlerListener.ts b/packages/api/src/nitro/session/IRoomHandlerListener.ts
new file mode 100644
index 0000000..affd923
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomHandlerListener.ts
@@ -0,0 +1,8 @@
+import { IRoomSession } from './IRoomSession';
+
+export interface IRoomHandlerListener
+{
+ getSession(id: number): IRoomSession;
+ sessionUpdate(id: number, type: string): void;
+ sessionReinitialize(fromRoomId: number, toRoomId: number): void;
+}
diff --git a/packages/api/src/nitro/session/IRoomModerationSettings.ts b/packages/api/src/nitro/session/IRoomModerationSettings.ts
new file mode 100644
index 0000000..bf9428c
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomModerationSettings.ts
@@ -0,0 +1,6 @@
+export interface IRoomModerationSettings
+{
+ readonly allowMute: number;
+ readonly allowKick: number;
+ readonly allowBan: number;
+}
diff --git a/packages/api/src/nitro/session/IRoomPetData.ts b/packages/api/src/nitro/session/IRoomPetData.ts
new file mode 100644
index 0000000..70dfbbc
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomPetData.ts
@@ -0,0 +1,30 @@
+export interface IRoomPetData
+{
+ id: number;
+ level: number;
+ maximumLevel: number;
+ experience: number;
+ levelExperienceGoal: number;
+ energy: number;
+ maximumEnergy: number;
+ happyness: number;
+ maximumHappyness: number;
+ ownerId: number;
+ ownerName: string;
+ respect: number;
+ age: number;
+ unknownRarity: number;
+ saddle: boolean;
+ rider: boolean;
+ skillTresholds: number[];
+ publiclyRideable: number;
+ breedable: boolean;
+ fullyGrown: boolean;
+ dead: boolean;
+ rarityLevel: number;
+ maximumTimeToLive: number;
+ remainingTimeToLive: number;
+ remainingGrowTime: number;
+ publiclyBreedable: boolean;
+ readonly adultLevel: number;
+}
diff --git a/packages/api/src/nitro/session/IRoomSession.ts b/packages/api/src/nitro/session/IRoomSession.ts
new file mode 100644
index 0000000..371ac1e
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomSession.ts
@@ -0,0 +1,64 @@
+import { IRoomModerationSettings } from './IRoomModerationSettings';
+import { IUserDataManager } from './IUserDataManager';
+
+export interface IRoomSession
+{
+ openGift(objectId: number): void;
+ setControllerLevel(level: number): void;
+ setOwnRoomIndex(roomIndex: number): void;
+ setRoomOwner(): void;
+ start(): boolean;
+ reset(roomId: number): void;
+ sendChatMessage(text: string, styleId: number): void;
+ sendShoutMessage(text: string, styleId: number): void;
+ sendWhisperMessage(recipientName: string, text: string, styleId: number): void;
+ sendChatTypingMessage(isTyping: boolean): void;
+ sendMottoMessage(motto: string): void;
+ sendDanceMessage(danceId: number): void;
+ sendExpressionMessage(expression: number): void;
+ sendSignMessage(sign: number): void;
+ sendPostureMessage(posture: number): void;
+ sendDoorbellApprovalMessage(userName: string, flag: boolean): void;
+ sendAmbassadorAlertMessage(userId: number): void;
+ sendKickMessage(userId: number): void;
+ sendMuteMessage(userId: number, minutes: number): void;
+ sendBanMessage(userId: number, type: string): void;
+ sendGiveRightsMessage(userId: number): void;
+ sendTakeRightsMessage(userId: number): void;
+ sendPollStartMessage(pollId: number): void;
+ sendPollRejectMessage(pollId: number): void;
+ sendPollAnswerMessage(pollId: number, questionId: number, answers: string[]): void;
+ votePoll(counter: number): void;
+ sendPeerUsersClassificationMessage(userClassType: string): void;
+ sendRoomUsersClassificationMessage(userClassType: string): void;
+ updateMoodlightData(id: number, effectId: number, color: number, brightness: number, apply: boolean): void;
+ toggleMoodlightState(): void;
+ pickupPet(id: number): void;
+ pickupBot(id: number): void;
+ requestMoodlightSettings(): void;
+ mountPet(id: number): void;
+ dismountPet(id: number): void;
+ usePetProduct(itemId: number, petId: number): void;
+ removePetSaddle(id: number): void;
+ togglePetBreeding(id: number): void;
+ togglePetRiding(id: number): void;
+ useMultistateItem(id: number): void;
+ harvestPet(id: number): void;
+ compostPlant(id: number): void;
+ requestPetCommands(id: number): void;
+ sendScriptProceed(): void;
+ userDataManager: IUserDataManager;
+ roomId: number;
+ state: string;
+ tradeMode: number;
+ isPrivateRoom: boolean;
+ doorMode: number;
+ allowPets: boolean;
+ controllerLevel: number;
+ ownRoomIndex: number;
+ isGuildRoom: boolean;
+ isRoomOwner: boolean;
+ isDecorating: boolean;
+ isSpectator: boolean;
+ moderationSettings: IRoomModerationSettings;
+}
diff --git a/packages/api/src/nitro/session/IRoomSessionManager.ts b/packages/api/src/nitro/session/IRoomSessionManager.ts
new file mode 100644
index 0000000..546df80
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomSessionManager.ts
@@ -0,0 +1,11 @@
+import { IRoomSession } from './IRoomSession';
+
+export interface IRoomSessionManager
+{
+ init(): Promise;
+ getSession(id: number): IRoomSession;
+ createSession(roomId: number, password?: string): boolean;
+ startSession(session: IRoomSession): boolean;
+ removeSession(id: number, openLandingView?: boolean): void;
+ viewerSession: IRoomSession;
+}
diff --git a/packages/api/src/nitro/session/IRoomUserData.ts b/packages/api/src/nitro/session/IRoomUserData.ts
new file mode 100644
index 0000000..09eaa57
--- /dev/null
+++ b/packages/api/src/nitro/session/IRoomUserData.ts
@@ -0,0 +1,26 @@
+export interface IRoomUserData
+{
+ readonly roomIndex: number;
+ activityPoints: number;
+ name: string;
+ type: number;
+ sex: string;
+ figure: string;
+ custom: string;
+ webID: number;
+ groupId: number;
+ groupName: string;
+ groupStatus: number;
+ ownerId: number;
+ ownerName: string;
+ rarityLevel: number;
+ hasSaddle: boolean;
+ isRiding: boolean;
+ canBreed: boolean;
+ canHarvest: boolean;
+ canRevive: boolean;
+ hasBreedingPermission: boolean;
+ petLevel: number;
+ botSkills: number[];
+ isModerator: boolean;
+}
diff --git a/packages/api/src/nitro/session/ISessionDataManager.ts b/packages/api/src/nitro/session/ISessionDataManager.ts
new file mode 100644
index 0000000..f9079c8
--- /dev/null
+++ b/packages/api/src/nitro/session/ISessionDataManager.ts
@@ -0,0 +1,56 @@
+import { Texture } from 'pixi.js';
+import { ICommunicationManager } from '../../communication';
+import { IFurnitureData } from './IFurnitureData';
+import { IGroupInformationManager } from './IGroupInformationManager';
+import { IIgnoredUsersManager } from './IIgnoredUsersManager';
+import { IProductData } from './IProductData';
+
+export interface ISessionDataManager
+{
+ init(): Promise;
+ getAllFurnitureData(): IFurnitureData[];
+ getFloorItemData(id: number): IFurnitureData;
+ getFloorItemDataByName(name: string): IFurnitureData;
+ getWallItemData(id: number): IFurnitureData;
+ getWallItemDataByName(name: string): IFurnitureData;
+ getProductData(type: string): IProductData;
+ getBadgeUrl(name: string): string;
+ getGroupBadgeUrl(name: string): string;
+ getBadgeImage(name: string): Texture;
+ getUserTags(roomUnitId: number): string[];
+ loadBadgeImage(name: string): string;
+ getGroupBadgeImage(name: string): Texture;
+ loadGroupBadgeImage(name: string): string;
+ hasSecurity(level: number): boolean;
+ giveRespect(userId: number): void;
+ givePetRespect(petId: number): void;
+ sendSpecialCommandMessage(text: string, styleId?: number): void;
+ ignoreUser(name: string): void;
+ unignoreUser(name: string): void;
+ isUserIgnored(name: string): boolean;
+ getGroupBadge(groupId: number): string;
+ communication: ICommunicationManager;
+ userId: number;
+ userName: string;
+ figure: string;
+ gender: string;
+ realName: string;
+ ignoredUsersManager: IIgnoredUsersManager;
+ groupInformationManager: IGroupInformationManager;
+ respectsReceived: number;
+ respectsLeft: number;
+ respectsPetLeft: number;
+ canChangeName: boolean;
+ clubLevel: number;
+ securityLevel: number;
+ isAmbassador: boolean;
+ isNoob: boolean;
+ isRealNoob: boolean;
+ isSystemOpen: boolean;
+ isSystemShutdown: boolean;
+ isAuthenticHabbo: boolean;
+ isModerator: boolean;
+ isCameraFollowDisabled: boolean;
+ uiFlags: number;
+ tags: string[];
+}
diff --git a/packages/api/src/nitro/session/IUserDataManager.ts b/packages/api/src/nitro/session/IUserDataManager.ts
new file mode 100644
index 0000000..a16e793
--- /dev/null
+++ b/packages/api/src/nitro/session/IUserDataManager.ts
@@ -0,0 +1,23 @@
+import { IRoomUserData } from './IRoomUserData';
+
+export interface IUserDataManager
+{
+ getUserData(webID: number): IRoomUserData;
+ getPetData(webID: number): IRoomUserData;
+ getBotData(webID: number): IRoomUserData;
+ getRentableBotData(webID: number): IRoomUserData;
+ getDataByType(webID: number, type: number): IRoomUserData;
+ getUserDataByIndex(roomIndex: number): IRoomUserData;
+ getUserDataByName(name: string): IRoomUserData;
+ updateUserData(data: IRoomUserData): void;
+ removeUserData(roomIndex: number): void;
+ getUserBadges(userId: number): string[];
+ setUserBadges(userId: number, badges: string[]): void;
+ updateFigure(roomIndex: number, figure: string, sex: string, hasSaddle: boolean, isRiding: boolean): void;
+ updateName(roomIndex: number, name: string): void;
+ updateMotto(roomIndex: number, custom: string): void;
+ updateAchievementScore(roomIndex: number, score: number): void;
+ updatePetLevel(roomIndex: number, level: number): void;
+ updatePetBreedingStatus(roomIndex: number, canBreed: boolean, canHarvest: boolean, canRevive: boolean, hasBreedingPermission: boolean): void;
+ requestPetInfo(id: number): void;
+}
diff --git a/packages/api/src/nitro/session/PetBreedingResultData.ts b/packages/api/src/nitro/session/PetBreedingResultData.ts
new file mode 100644
index 0000000..5b9514a
--- /dev/null
+++ b/packages/api/src/nitro/session/PetBreedingResultData.ts
@@ -0,0 +1,58 @@
+import { IMessageDataWrapper, IPetBreedingResultData } from '@nitrots/api';
+
+export class PetBreedingResultData implements IPetBreedingResultData
+{
+ private _stuffId: number;
+ private _classId: number;
+ private _productCode: string;
+ private _userId: number;
+ private _userName: string;
+ private _rarityLevel: number;
+ private _hasMutation: boolean;
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ this._stuffId = wrapper.readInt();
+ this._classId = wrapper.readInt();
+ this._productCode = wrapper.readString();
+ this._userId = wrapper.readInt();
+ this._userName = wrapper.readString();
+ this._rarityLevel = wrapper.readInt();
+ this._hasMutation = wrapper.readBoolean();
+ }
+
+ public get stuffId(): number
+ {
+ return this._stuffId;
+ }
+
+ public get classId(): number
+ {
+ return this._classId;
+ }
+
+ public get productCode(): string
+ {
+ return this._productCode;
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public get userName(): string
+ {
+ return this._userName;
+ }
+
+ public get rarityLevel(): number
+ {
+ return this._rarityLevel;
+ }
+
+ public get hasMutation(): boolean
+ {
+ return this._hasMutation;
+ }
+}
diff --git a/packages/api/src/nitro/session/PetCustomPart.ts b/packages/api/src/nitro/session/PetCustomPart.ts
new file mode 100644
index 0000000..9498e12
--- /dev/null
+++ b/packages/api/src/nitro/session/PetCustomPart.ts
@@ -0,0 +1,45 @@
+import { IPetCustomPart } from './IPetCustomPart';
+
+export class PetCustomPart implements IPetCustomPart
+{
+ private _layerId: number;
+ private _partId: number;
+ private _paletteId: number;
+
+ constructor(layerId: number, partId: number, paletteId: number)
+ {
+ this._layerId = layerId;
+ this._partId = partId;
+ this._paletteId = paletteId;
+ }
+
+ public get layerId(): number
+ {
+ return this._layerId;
+ }
+
+ public set layerId(layerId: number)
+ {
+ this._layerId = layerId;
+ }
+
+ public get partId(): number
+ {
+ return this._partId;
+ }
+
+ public set partId(partId: number)
+ {
+ this._partId = partId;
+ }
+
+ public get paletteId(): number
+ {
+ return this._paletteId;
+ }
+
+ public set paletteId(paletteId: number)
+ {
+ this._paletteId = paletteId;
+ }
+}
diff --git a/packages/api/src/nitro/session/PetFigureData.ts b/packages/api/src/nitro/session/PetFigureData.ts
new file mode 100644
index 0000000..ff586be
--- /dev/null
+++ b/packages/api/src/nitro/session/PetFigureData.ts
@@ -0,0 +1,229 @@
+import { IPetCustomPart } from './IPetCustomPart';
+import { PetCustomPart } from './PetCustomPart';
+
+export class PetFigureData
+{
+ private _typeId: number;
+ private _paletteId: number;
+ private _color: number;
+ private _headOnly: boolean;
+
+ private _customParts: IPetCustomPart[];
+ private _customLayerIds: number[];
+ private _customPartIds: number[];
+ private _customPaletteIds: number[];
+
+ constructor(k: string)
+ {
+ this._typeId = this.getTypeId(k);
+ this._paletteId = this.getPaletteId(k);
+ this._color = this.getColor(k);
+ this._headOnly = this.getHeadOnly(k);
+
+ const _local_2 = this.getCustomData(k);
+
+ this._customLayerIds = this.getCustomLayerIds(_local_2);
+ this._customPartIds = this.getCustomPartIds(_local_2);
+ this._customPaletteIds = this.getCustomPaletteIds(_local_2);
+ this._customParts = [];
+
+ let i = 0;
+
+ while(i < this._customLayerIds.length)
+ {
+ this._customParts.push(new PetCustomPart(this._customLayerIds[i], this._customPartIds[i], this._customPaletteIds[i]));
+
+ i++;
+ }
+ }
+
+ public get typeId(): number
+ {
+ return this._typeId;
+ }
+
+ public get paletteId(): number
+ {
+ return this._paletteId;
+ }
+
+ public get color(): number
+ {
+ return this._color;
+ }
+
+ public get customLayerIds(): number[]
+ {
+ return this._customLayerIds;
+ }
+
+ public get customPartIds(): number[]
+ {
+ return this._customPartIds;
+ }
+
+ public get customPaletteIds(): number[]
+ {
+ return this._customPaletteIds;
+ }
+
+ public get customParts(): IPetCustomPart[]
+ {
+ return this._customParts;
+ }
+
+ public getCustomPart(k: number): IPetCustomPart
+ {
+ if(this._customParts)
+ {
+ for(const _local_2 of this._customParts)
+ {
+ if(_local_2.layerId === k) return _local_2;
+ }
+ }
+
+ return null;
+ }
+
+ public get hasCustomParts(): boolean
+ {
+ return (!(this._customLayerIds == null)) && (this._customLayerIds.length > 0);
+ }
+
+ public get headOnly(): boolean
+ {
+ return this._headOnly;
+ }
+
+ public get figureString(): string
+ {
+ let figure = ((((this.typeId + ' ') + this.paletteId) + ' ') + this.color.toString(16));
+
+ figure = (figure + (' ' + this.customParts.length));
+
+ for(const _local_2 of this.customParts)
+ {
+ figure = (figure + (((((' ' + _local_2.layerId) + ' ') + _local_2.partId) + ' ') + _local_2.paletteId));
+ }
+
+ return figure;
+ }
+
+ private getCustomData(k: string): string[]
+ {
+ let _local_2: string[] = [];
+
+ if(k)
+ {
+ const _local_3 = k.split(' ');
+ const _local_4 = ((this._headOnly) ? 1 : 0);
+ const _local_5 = (4 + _local_4);
+
+ if(_local_3.length > _local_5)
+ {
+ const _local_6 = (3 + _local_4);
+ const _local_7 = parseInt(_local_3[_local_6]);
+
+ _local_2 = _local_3.slice(_local_5, (_local_5 + (_local_7 * 3)));
+ }
+ }
+
+ return _local_2;
+ }
+
+ private getCustomLayerIds(data: string[]): number[]
+ {
+ const layerIds: number[] = [];
+
+ let i = 0;
+
+ while(i < data.length)
+ {
+ layerIds.push(parseInt(data[(i + 0)]));
+
+ i = (i + 3);
+ }
+
+ return layerIds;
+ }
+
+ private getCustomPartIds(data: string[]): number[]
+ {
+ const partIds: number[] = [];
+
+ let i = 0;
+
+ while(i < data.length)
+ {
+ partIds.push(parseInt(data[(i + 1)]));
+
+ i = (i + 3);
+ }
+
+ return partIds;
+ }
+
+ private getCustomPaletteIds(data: string[]): number[]
+ {
+ const paletteIds: number[] = [];
+
+ let i = 0;
+
+ while(i < data.length)
+ {
+ paletteIds.push(parseInt(data[(i + 2)]));
+
+ i = (i + 3);
+ }
+
+ return paletteIds;
+ }
+
+ private getTypeId(data: string): number
+ {
+ if(data)
+ {
+ const parts = data.split(' ');
+
+ if(parts.length >= 1) return parseInt(parts[0]);
+ }
+
+ return 0;
+ }
+
+ private getPaletteId(data: string): number
+ {
+ if(data)
+ {
+ const parts = data.split(' ');
+
+ if(parts.length >= 2) return parseInt(parts[1]);
+ }
+
+ return 0;
+ }
+
+ private getColor(data: string): number
+ {
+ if(data)
+ {
+ const parts = data.split(' ');
+
+ if(parts.length >= 3) return parseInt(parts[2], 16);
+ }
+
+ return 0xFFFFFF;
+ }
+
+ private getHeadOnly(data: string): boolean
+ {
+ if(data)
+ {
+ const parts = data.split(' ');
+
+ if(parts.length >= 4) return parts[3] === 'head';
+ }
+
+ return false;
+ }
+}
diff --git a/packages/api/src/nitro/session/RarityCategoryData.ts b/packages/api/src/nitro/session/RarityCategoryData.ts
new file mode 100644
index 0000000..f9eb994
--- /dev/null
+++ b/packages/api/src/nitro/session/RarityCategoryData.ts
@@ -0,0 +1,40 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+
+export class RarityCategoryData
+{
+ private _chance: number;
+ private _breeds: number[];
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ if(!wrapper) throw new Error('invalid_wrapper');
+
+ this._chance = wrapper.readInt();
+ this._breeds = [];
+
+ let totalCount = wrapper.readInt();
+
+ while(totalCount > 0)
+ {
+ this._breeds.push(wrapper.readInt());
+
+ totalCount--;
+ }
+ }
+
+ public dispose(): void
+ {
+ this._chance = -1;
+ this._breeds = [];
+ }
+
+ public get chance(): number
+ {
+ return this._chance;
+ }
+
+ public get breeds(): number[]
+ {
+ return this._breeds;
+ }
+}
diff --git a/packages/api/src/nitro/session/enum/GenericErrorEnum.ts b/packages/api/src/nitro/session/enum/GenericErrorEnum.ts
new file mode 100644
index 0000000..611139b
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/GenericErrorEnum.ts
@@ -0,0 +1,5 @@
+export class GenericErrorEnum
+{
+ public static KICKED_OUT_OF_ROOM: number = 4008;
+ public static STRIP_LOCKED_FOR_TRADING: number = -13001;
+}
diff --git a/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts b/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts
new file mode 100644
index 0000000..c9aecaf
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/NoobnessLevelEnum.ts
@@ -0,0 +1,6 @@
+export class NoobnessLevelEnum
+{
+ public static OLD_IDENTITY: number = 0;
+ public static NEW_IDENTITY: number = 1;
+ public static REAL_NOOB: number = 2;
+}
diff --git a/packages/api/src/nitro/session/enum/PetType.ts b/packages/api/src/nitro/session/enum/PetType.ts
new file mode 100644
index 0000000..9058b7b
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/PetType.ts
@@ -0,0 +1,38 @@
+export class PetType
+{
+ public static DOG: number = 0;
+ public static CAT: number = 1;
+ public static CROCODILE: number = 2;
+ public static TERRIER: number = 3;
+ public static BEAR: number = 4;
+ public static PIG: number = 5;
+ public static LION: number = 6;
+ public static RHINO: number = 7;
+ public static SPIDER: number = 8;
+ public static TURTLE: number = 9;
+ public static CHICKEN: number = 10;
+ public static FROG: number = 11;
+ public static DRAGON: number = 12;
+ public static MONSTER: number = 13;
+ public static MONKEY: number = 14;
+ public static HORSE: number = 15;
+ public static MONSTERPLANT: number = 16;
+ public static BUNNY: number = 17;
+ public static BUNNYEVIL: number = 18;
+ public static BUNNYDEPRESSED: number = 19;
+ public static BUNNYLOVE: number = 20;
+ public static PIGEONGOOD: number = 21;
+ public static PIGEONEVIL: number = 22;
+ public static DEMONMONKEY: number = 23;
+ public static BABYBEAR: number = 24;
+ public static BABYTERRIER: number = 25;
+ public static GNOME: number = 26;
+ public static LEPRECHAUN: number = 27;
+ public static KITTENBABY: number = 28;
+ public static PUPPYBABY: number = 29;
+ public static PIGLETNBABY: number = 30;
+ public static HALOOMPA: number = 31;
+ public static FOOLS: number = 32;
+ public static PTEROSAUR: number = 33;
+ public static VELOCIRAPTOR: number = 34;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/session/enum/RoomControllerLevel.ts b/packages/api/src/nitro/session/enum/RoomControllerLevel.ts
new file mode 100644
index 0000000..ecd6309
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/RoomControllerLevel.ts
@@ -0,0 +1,9 @@
+export class RoomControllerLevel
+{
+ public static NONE: number = 0;
+ public static GUEST: number = 1;
+ public static GUILD_MEMBER: number = 2;
+ public static GUILD_ADMIN: number = 3;
+ public static ROOM_OWNER: number = 4;
+ public static MODERATOR: number = 5;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts b/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts
new file mode 100644
index 0000000..be0b1e4
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/RoomTradingLevelEnum.ts
@@ -0,0 +1,22 @@
+export class RoomTradingLevelEnum
+{
+ public static NO_TRADING: number = 0;
+ public static ROOM_CONTROLLER_REQUIRED: number = 1;
+ public static FREE_TRADING: number = 2;
+
+
+ public static getLocalizationKey(k: number): string
+ {
+ switch(k)
+ {
+ case RoomTradingLevelEnum.FREE_TRADING:
+ return '${trading.mode.free}';
+ case RoomTradingLevelEnum.ROOM_CONTROLLER_REQUIRED:
+ return '${trading.mode.controller}';
+ case RoomTradingLevelEnum.NO_TRADING:
+ return '${trading.mode.not.allowed}';
+ }
+
+ return '';
+ }
+}
diff --git a/packages/api/src/nitro/session/enum/SecurityLevel.ts b/packages/api/src/nitro/session/enum/SecurityLevel.ts
new file mode 100644
index 0000000..9b3011e
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/SecurityLevel.ts
@@ -0,0 +1,13 @@
+export class SecurityLevel
+{
+ public static SUPER_USER: number = 9;
+ public static ADMINISTRATOR: number = 8;
+ public static COMMUNITY: number = 7;
+ public static PLAYER_SUPPORT: number = 6;
+ public static MODERATOR: number = 5;
+ public static EMPLOYEE: number = 4;
+ public static BUS_PARTNER: number = 3;
+ public static PARTNER: number = 2;
+ public static CELEBRITY: number = 1;
+ public static NONE: number = 0;
+}
\ No newline at end of file
diff --git a/packages/api/src/nitro/session/enum/index.ts b/packages/api/src/nitro/session/enum/index.ts
new file mode 100644
index 0000000..4d97ae9
--- /dev/null
+++ b/packages/api/src/nitro/session/enum/index.ts
@@ -0,0 +1,6 @@
+export * from './GenericErrorEnum';
+export * from './NoobnessLevelEnum';
+export * from './PetType';
+export * from './RoomControllerLevel';
+export * from './RoomTradingLevelEnum';
+export * from './SecurityLevel';
diff --git a/packages/api/src/nitro/session/index.ts b/packages/api/src/nitro/session/index.ts
new file mode 100644
index 0000000..1fe774d
--- /dev/null
+++ b/packages/api/src/nitro/session/index.ts
@@ -0,0 +1,25 @@
+export * from './BreedingPetInfo';
+export * from './FurnitureType';
+export * from './IFurnitureData';
+export * from './IFurnitureDataListener';
+export * from './IGroupInformationManager';
+export * from './IIgnoredUsersManager';
+export * from './IPetCustomPart';
+export * from './IPollChoice';
+export * from './IPollQuestion';
+export * from './IProductData';
+export * from './IProductDataListener';
+export * from './IQuestion';
+export * from './IRoomHandlerListener';
+export * from './IRoomModerationSettings';
+export * from './IRoomPetData';
+export * from './IRoomSession';
+export * from './IRoomSessionManager';
+export * from './IRoomUserData';
+export * from './ISessionDataManager';
+export * from './IUserDataManager';
+export * from './PetBreedingResultData';
+export * from './PetCustomPart';
+export * from './PetFigureData';
+export * from './RarityCategoryData';
+export * from './enum';
diff --git a/packages/api/src/nitro/sound/IMusicController.ts b/packages/api/src/nitro/sound/IMusicController.ts
new file mode 100644
index 0000000..8166f15
--- /dev/null
+++ b/packages/api/src/nitro/sound/IMusicController.ts
@@ -0,0 +1,25 @@
+import { IAdvancedMap } from '../../utils';
+import { IPlaylistController } from './IPlaylistController';
+import { ISongInfo } from './ISongInfo';
+
+export interface IMusicController
+{
+ getRoomItemPlaylist(_arg_1?: number): IPlaylistController;
+ getSongDiskInventorySize(): number;
+ getSongDiskInventoryDiskId(_arg_1: number): number;
+ getSongDiskInventorySongId(_arg_1: number): number;
+ getSongInfo(songId: number): ISongInfo;
+ getSongIdPlayingAtPriority(_arg_1: number): number;
+ playSong(songId: number, priority: number, startPos?: number, playLength?: number, fadeInSeconds?: number, fadeOutSeconds?: number): boolean;
+ stop(priority: number): void;
+ addSongInfoRequest(_arg_1: number): void;
+ requestSongInfoWithoutSamples(_arg_1: number): void;
+ requestUserSongDisks(): void;
+ onSongLoaded(_arg_1: number): void;
+ updateVolume(_arg_1: number): void;
+ samplesUnloaded(_arg_1: number[]): void;
+ get samplesIdsInUse(): number[];
+ get songDiskInventory(): IAdvancedMap
+ init(): void;
+ dispose(): void;
+}
diff --git a/packages/api/src/nitro/sound/IPlaylistController.ts b/packages/api/src/nitro/sound/IPlaylistController.ts
new file mode 100644
index 0000000..3466544
--- /dev/null
+++ b/packages/api/src/nitro/sound/IPlaylistController.ts
@@ -0,0 +1,16 @@
+import { ISongInfo } from './ISongInfo';
+
+export interface IPlaylistController
+{
+ init(): void;
+ dispose(): void;
+ stopPlaying(): void;
+ getEntry(index: number): ISongInfo;
+ requestPlayList(): void;
+ get priority(): number;
+ get length(): number;
+ get playPosition(): number;
+ get currentSongId(): number;
+ get isPlaying(): boolean;
+ get entries(): ISongInfo[];
+}
diff --git a/packages/api/src/nitro/sound/ISongInfo.ts b/packages/api/src/nitro/sound/ISongInfo.ts
new file mode 100644
index 0000000..475b75d
--- /dev/null
+++ b/packages/api/src/nitro/sound/ISongInfo.ts
@@ -0,0 +1,12 @@
+export interface ISongInfo
+{
+ //get loaded():boolean;
+ get id():number;
+ get diskId():number;
+ set diskId(id: number);
+ get length():number;
+ get name():string;
+ get creator():string;
+ get songData():string;
+ //get soundObject():IHabboSound;
+}
diff --git a/packages/api/src/nitro/sound/ISoundManager.ts b/packages/api/src/nitro/sound/ISoundManager.ts
new file mode 100644
index 0000000..87714b5
--- /dev/null
+++ b/packages/api/src/nitro/sound/ISoundManager.ts
@@ -0,0 +1,8 @@
+import { IMusicController } from './IMusicController';
+
+export interface ISoundManager
+{
+ init(): Promise;
+ musicController: IMusicController;
+ traxVolume: number;
+}
diff --git a/packages/api/src/nitro/sound/index.ts b/packages/api/src/nitro/sound/index.ts
new file mode 100644
index 0000000..be4bfe4
--- /dev/null
+++ b/packages/api/src/nitro/sound/index.ts
@@ -0,0 +1,4 @@
+export * from './IMusicController';
+export * from './IPlaylistController';
+export * from './ISongInfo';
+export * from './ISoundManager';
diff --git a/packages/api/src/room/IPetBreedingResultData.ts b/packages/api/src/room/IPetBreedingResultData.ts
new file mode 100644
index 0000000..b3f8985
--- /dev/null
+++ b/packages/api/src/room/IPetBreedingResultData.ts
@@ -0,0 +1,10 @@
+export interface IPetBreedingResultData
+{
+ readonly stuffId: number;
+ readonly classId: number;
+ readonly productCode: string;
+ readonly userId: number;
+ readonly userName: string;
+ readonly rarityLevel: number;
+ readonly hasMutation: boolean;
+}
diff --git a/packages/api/src/room/IRoomGeometry.ts b/packages/api/src/room/IRoomGeometry.ts
new file mode 100644
index 0000000..c4e32c8
--- /dev/null
+++ b/packages/api/src/room/IRoomGeometry.ts
@@ -0,0 +1,21 @@
+import { Point } from 'pixi.js';
+import { IVector3D } from '../utils';
+
+export interface IRoomGeometry
+{
+ getCoordinatePosition(_arg_1: IVector3D): IVector3D;
+ getScreenPoint(_arg_1: IVector3D): Point;
+ getScreenPosition(_arg_1: IVector3D): IVector3D;
+ getPlanePosition(_arg_1: Point, _arg_2: IVector3D, _arg_3: IVector3D, _arg_4: IVector3D): Point;
+ setDisplacement(_arg_1: IVector3D, _arg_2: IVector3D): void;
+ adjustLocation(_arg_1: IVector3D, _arg_2: number): void;
+ performZoom(): void;
+ performZoomOut(): void;
+ performZoomIn(): void;
+ isZoomedIn(): boolean;
+ updateId: number;
+ z_scale: number;
+ scale: number;
+ directionAxis: IVector3D;
+ direction: IVector3D;
+}
diff --git a/packages/api/src/room/IRoomInstance.ts b/packages/api/src/room/IRoomInstance.ts
new file mode 100644
index 0000000..367ccef
--- /dev/null
+++ b/packages/api/src/room/IRoomInstance.ts
@@ -0,0 +1,27 @@
+import { IRoomInstanceContainer } from './IRoomInstanceContainer';
+import { IRoomObjectManager } from './IRoomObjectManager';
+import { IRoomObject, IRoomObjectModel } from './object';
+import { IRoomRendererBase } from './renderer';
+
+export interface IRoomInstance
+{
+ dispose(): void;
+ setRenderer(renderer: IRoomRendererBase): void;
+ getManager(category: number): IRoomObjectManager;
+ getTotalObjectsForManager(category: number): number;
+ getRoomObject(id: number, category: number): IRoomObject;
+ getRoomObjectsForCategory(category: number): IRoomObject[];
+ getRoomObjectByIndex(index: number, category: number): IRoomObject;
+ createRoomObject(id: number, stateCount: number, type: string, category: number): IRoomObject;
+ createRoomObjectAndInitalize(objectId: number, type: string, category: number): IRoomObject;
+ removeRoomObject(id: number, category: number): void;
+ removeAllManagers(): void;
+ addUpdateCategory(category: number): void;
+ removeUpdateCategory(category: number): void;
+ update(time: number, update?: boolean): void;
+ id: string;
+ container: IRoomInstanceContainer;
+ renderer: IRoomRendererBase;
+ managers: Map;
+ model: IRoomObjectModel;
+}
diff --git a/packages/api/src/room/IRoomInstanceContainer.ts b/packages/api/src/room/IRoomInstanceContainer.ts
new file mode 100644
index 0000000..efe5184
--- /dev/null
+++ b/packages/api/src/room/IRoomInstanceContainer.ts
@@ -0,0 +1,8 @@
+import { IRoomObjectManager } from './IRoomObjectManager';
+import { IRoomObject } from './object';
+
+export interface IRoomInstanceContainer
+{
+ createRoomObjectAndInitalize(roomId: string, objectId: number, type: string, category: number): IRoomObject;
+ createRoomObjectManager(category: number): IRoomObjectManager;
+}
diff --git a/packages/api/src/room/IRoomManager.ts b/packages/api/src/room/IRoomManager.ts
new file mode 100644
index 0000000..019a1a2
--- /dev/null
+++ b/packages/api/src/room/IRoomManager.ts
@@ -0,0 +1,16 @@
+import { IRoomInstance } from './IRoomInstance';
+import { IRoomManagerListener } from './IRoomManagerListener';
+import { IRoomObject } from './object';
+
+export interface IRoomManager
+{
+ init(listener: IRoomManagerListener): Promise;
+ getRoomInstance(roomId: string): IRoomInstance;
+ createRoomInstance(roomId: string): IRoomInstance;
+ removeRoomInstance(roomId: string): boolean;
+ addUpdateCategory(category: number): void;
+ removeUpdateCategory(category: number): void;
+ createRoomObjectAndInitalize(roomId: string, objectId: number, type: string, category: number): IRoomObject;
+ update(time: number, update?: boolean): void;
+ rooms: Map;
+}
diff --git a/packages/api/src/room/IRoomManagerListener.ts b/packages/api/src/room/IRoomManagerListener.ts
new file mode 100644
index 0000000..aa46e8d
--- /dev/null
+++ b/packages/api/src/room/IRoomManagerListener.ts
@@ -0,0 +1,5 @@
+export interface IRoomManagerListener
+{
+ objectInitialized(roomId: string, objectId: number, category: number): void;
+ initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void;
+}
diff --git a/packages/api/src/room/IRoomObjectManager.ts b/packages/api/src/room/IRoomObjectManager.ts
new file mode 100644
index 0000000..9e0ea3b
--- /dev/null
+++ b/packages/api/src/room/IRoomObjectManager.ts
@@ -0,0 +1,14 @@
+import { IAdvancedMap } from '../utils';
+import { IRoomObjectController } from './object';
+
+export interface IRoomObjectManager
+{
+ dispose(): void;
+ getObject(id: number): IRoomObjectController;
+ getObjectByIndex(index: number): IRoomObjectController;
+ createObject(id: number, stateCount: number, type: string): IRoomObjectController;
+ removeObject(id: number): void;
+ removeAllObjects(): void;
+ objects: IAdvancedMap;
+ totalObjects: number;
+}
diff --git a/packages/api/src/room/IRoomObjectUpdateMessage.ts b/packages/api/src/room/IRoomObjectUpdateMessage.ts
new file mode 100644
index 0000000..2125e30
--- /dev/null
+++ b/packages/api/src/room/IRoomObjectUpdateMessage.ts
@@ -0,0 +1,7 @@
+import { IVector3D } from '../utils/IVector3D';
+
+export interface IRoomObjectUpdateMessage
+{
+ readonly location: IVector3D;
+ readonly direction: IVector3D;
+}
diff --git a/packages/api/src/room/IRoomSpriteMouseEvent.ts b/packages/api/src/room/IRoomSpriteMouseEvent.ts
new file mode 100644
index 0000000..c942d6c
--- /dev/null
+++ b/packages/api/src/room/IRoomSpriteMouseEvent.ts
@@ -0,0 +1,17 @@
+export interface IRoomSpriteMouseEvent
+{
+ readonly type: string;
+ readonly eventId: string;
+ readonly canvasId: string;
+ readonly spriteTag: string;
+ readonly screenX: number;
+ readonly screenY: number;
+ readonly localX: number;
+ readonly localY: number;
+ readonly ctrlKey: boolean;
+ readonly altKey: boolean;
+ readonly shiftKey: boolean;
+ readonly buttonDown: boolean;
+ spriteOffsetX: number;
+ spriteOffsetY: number;
+}
diff --git a/packages/api/src/room/RoomObjectSpriteData.ts b/packages/api/src/room/RoomObjectSpriteData.ts
new file mode 100644
index 0000000..768cae2
--- /dev/null
+++ b/packages/api/src/room/RoomObjectSpriteData.ts
@@ -0,0 +1,18 @@
+export class RoomObjectSpriteData
+{
+ public objectId: number;
+ public x: number;
+ public y: number;
+ public z: number;
+ public name: string;
+ public blendMode: string;
+ public flipH: boolean;
+ public skew: number;
+ public frame: boolean;
+ public color: string;
+ public alpha: number;
+ public width: number;
+ public height: number;
+ public type: string;
+ public posture: string;
+}
diff --git a/packages/api/src/room/index.ts b/packages/api/src/room/index.ts
new file mode 100644
index 0000000..31d8d76
--- /dev/null
+++ b/packages/api/src/room/index.ts
@@ -0,0 +1,15 @@
+export * from './IPetBreedingResultData';
+export * from './IRoomGeometry';
+export * from './IRoomInstance';
+export * from './IRoomInstanceContainer';
+export * from './IRoomManager';
+export * from './IRoomManagerListener';
+export * from './IRoomObjectManager';
+export * from './IRoomObjectUpdateMessage';
+export * from './IRoomSpriteMouseEvent';
+export * from './RoomObjectSpriteData';
+export * from './object';
+export * from './object/enum';
+export * from './object/logic';
+export * from './object/visualization';
+export * from './renderer';
diff --git a/packages/api/src/room/object/IRoomObject.ts b/packages/api/src/room/object/IRoomObject.ts
new file mode 100644
index 0000000..de5674d
--- /dev/null
+++ b/packages/api/src/room/object/IRoomObject.ts
@@ -0,0 +1,22 @@
+import { IVector3D } from '../../utils';
+import { IRoomObjectModel } from './IRoomObjectModel';
+import { IRoomObjectMouseHandler } from './logic';
+import { IRoomObjectVisualization } from './visualization';
+
+export interface IRoomObject
+{
+ dispose(): void;
+ getLocation(): IVector3D;
+ getDirection(): IVector3D;
+ getState(index?: number): number;
+ id: number;
+ instanceId: number;
+ type: string;
+ model: IRoomObjectModel;
+ visualization: IRoomObjectVisualization;
+ mouseHandler: IRoomObjectMouseHandler;
+ location: IVector3D;
+ direction: IVector3D;
+ updateCounter: number;
+ isReady: boolean;
+}
diff --git a/packages/api/src/room/object/IRoomObjectController.ts b/packages/api/src/room/object/IRoomObjectController.ts
new file mode 100644
index 0000000..c522a26
--- /dev/null
+++ b/packages/api/src/room/object/IRoomObjectController.ts
@@ -0,0 +1,18 @@
+import { IVector3D } from '../../utils';
+import { IRoomObjectUpdateMessage } from '../IRoomObjectUpdateMessage';
+import { IRoomObject } from './IRoomObject';
+import { IRoomObjectEventHandler } from './logic';
+import { IRoomObjectGraphicVisualization } from './visualization';
+
+export interface IRoomObjectController extends IRoomObject
+{
+ setLocation(vector: IVector3D): void;
+ setDirection(vector: IVector3D): void;
+ setState(state: number, index?: number): boolean;
+ setVisualization(visualization: IRoomObjectGraphicVisualization): void;
+ setLogic(logic: IRoomObjectEventHandler): void;
+ processUpdateMessage(message: IRoomObjectUpdateMessage): void;
+ tearDown(): void;
+ isReady: boolean;
+ logic: IRoomObjectEventHandler;
+}
diff --git a/packages/api/src/room/object/IRoomObjectModel.ts b/packages/api/src/room/object/IRoomObjectModel.ts
new file mode 100644
index 0000000..64291ed
--- /dev/null
+++ b/packages/api/src/room/object/IRoomObjectModel.ts
@@ -0,0 +1,8 @@
+export interface IRoomObjectModel
+{
+ dispose(): void;
+ getValue(key: string): T;
+ setValue(key: string, value: T): void;
+ removeKey(key: string): void;
+ updateCounter: number;
+}
\ No newline at end of file
diff --git a/packages/api/src/room/object/IRoomObjectModelController.ts b/packages/api/src/room/object/IRoomObjectModelController.ts
new file mode 100644
index 0000000..2dc6fbc
--- /dev/null
+++ b/packages/api/src/room/object/IRoomObjectModelController.ts
@@ -0,0 +1,11 @@
+import { IAdvancedMap } from '../../utils';
+import { IRoomObjectModel } from './IRoomObjectModel';
+
+export interface IRoomObjectModelController extends IRoomObjectModel
+{
+ setNumber(_arg_1: string, _arg_2: number, _arg_3: boolean): void;
+ setString(_arg_1: string, _arg_2: string, _arg_3: boolean): void;
+ setNumberArray(_arg_1: string, _arg_2: [], _arg_3: boolean): void;
+ setStringArray(_arg_1: string, _arg_2: [], _arg_3: boolean): void;
+ setStringToStringMap(_arg_1: string, _arg_2: IAdvancedMap, _arg_3: boolean): void;
+}
diff --git a/packages/api/src/room/object/enum/AlphaTolerance.ts b/packages/api/src/room/object/enum/AlphaTolerance.ts
new file mode 100644
index 0000000..94b695e
--- /dev/null
+++ b/packages/api/src/room/object/enum/AlphaTolerance.ts
@@ -0,0 +1,6 @@
+export class AlphaTolerance
+{
+ public static MATCH_ALL_PIXELS: number = -1;
+ public static MATCH_OPAQUE_PIXELS: number = 128;
+ public static MATCH_NOTHING: number = 256;
+}
diff --git a/packages/api/src/room/object/enum/RoomObjectSpriteType.ts b/packages/api/src/room/object/enum/RoomObjectSpriteType.ts
new file mode 100644
index 0000000..ec4f953
--- /dev/null
+++ b/packages/api/src/room/object/enum/RoomObjectSpriteType.ts
@@ -0,0 +1,7 @@
+export class RoomObjectSpriteType
+{
+ public static DEFAULT: number = 1;
+ public static ROOM_PLANE: number = 2;
+ public static AVATAR: number = 3;
+ public static AVATAR_OWN: number = 4;
+}
diff --git a/packages/api/src/room/object/enum/index.ts b/packages/api/src/room/object/enum/index.ts
new file mode 100644
index 0000000..b648257
--- /dev/null
+++ b/packages/api/src/room/object/enum/index.ts
@@ -0,0 +1,2 @@
+export * from './AlphaTolerance';
+export * from './RoomObjectSpriteType';
diff --git a/packages/api/src/room/object/index.ts b/packages/api/src/room/object/index.ts
new file mode 100644
index 0000000..7d028eb
--- /dev/null
+++ b/packages/api/src/room/object/index.ts
@@ -0,0 +1,7 @@
+export * from './enum';
+export * from './IRoomObject';
+export * from './IRoomObjectController';
+export * from './IRoomObjectModel';
+export * from './IRoomObjectModelController';
+export * from './logic';
+export * from './visualization';
diff --git a/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts b/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts
new file mode 100644
index 0000000..8fab317
--- /dev/null
+++ b/packages/api/src/room/object/logic/IRoomObjectEventHandler.ts
@@ -0,0 +1,20 @@
+import { IEventDispatcher } from '../../../common';
+import { IRoomObjectUpdateMessage } from '../../IRoomObjectUpdateMessage';
+import { IRoomObjectController } from '../IRoomObjectController';
+import { IRoomObjectMouseHandler } from './IRoomObjectMouseHandler';
+
+export interface IRoomObjectEventHandler extends IRoomObjectMouseHandler
+{
+ initialize(data: unknown): void;
+ dispose(): void;
+ update(totalTimeRunning: number): void;
+ processUpdateMessage(message: IRoomObjectUpdateMessage): void;
+ getEventTypes(): string[];
+ useObject(): void;
+ setObject(object: IRoomObjectController): void;
+ tearDown(): void;
+ object: IRoomObjectController;
+ eventDispatcher: IEventDispatcher;
+ widget: string;
+ contextMenu: string;
+}
diff --git a/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts b/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts
new file mode 100644
index 0000000..d65ed55
--- /dev/null
+++ b/packages/api/src/room/object/logic/IRoomObjectLogicFactory.ts
@@ -0,0 +1,10 @@
+import { IEventDispatcher, INitroEvent } from '../../../common';
+import { IRoomObjectEventHandler } from './IRoomObjectEventHandler';
+
+export interface IRoomObjectLogicFactory
+{
+ getLogic(type: string): IRoomObjectEventHandler;
+ registerEventFunction(func: (event: INitroEvent) => void): void;
+ removeEventFunction(func: (event: INitroEvent) => void): void;
+ events: IEventDispatcher;
+}
diff --git a/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts b/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts
new file mode 100644
index 0000000..4240c56
--- /dev/null
+++ b/packages/api/src/room/object/logic/IRoomObjectMouseHandler.ts
@@ -0,0 +1,7 @@
+import { IRoomGeometry } from '../../IRoomGeometry';
+import { IRoomSpriteMouseEvent } from '../../IRoomSpriteMouseEvent';
+
+export interface IRoomObjectMouseHandler
+{
+ mouseEvent(event: IRoomSpriteMouseEvent, geometry: IRoomGeometry): void;
+}
diff --git a/packages/api/src/room/object/logic/index.ts b/packages/api/src/room/object/logic/index.ts
new file mode 100644
index 0000000..5892efe
--- /dev/null
+++ b/packages/api/src/room/object/logic/index.ts
@@ -0,0 +1,3 @@
+export * from './IRoomObjectEventHandler';
+export * from './IRoomObjectLogicFactory';
+export * from './IRoomObjectMouseHandler';
diff --git a/packages/api/src/room/object/visualization/IPlaneDrawingData.ts b/packages/api/src/room/object/visualization/IPlaneDrawingData.ts
new file mode 100644
index 0000000..8a67219
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IPlaneDrawingData.ts
@@ -0,0 +1,14 @@
+import { Point } from 'pixi.js';
+
+export interface IPlaneDrawingData
+{
+ isBottomAligned(): boolean;
+ z: number;
+ cornerPoints: Point[];
+ color: number;
+ maskAssetNames: string[];
+ maskAssetLocations: Point[];
+ maskAssetFlipHs: boolean[];
+ maskAssetFlipVs: boolean[];
+ assetNameColumns: string[][];
+}
diff --git a/packages/api/src/room/object/visualization/IPlaneVisualization.ts b/packages/api/src/room/object/visualization/IPlaneVisualization.ts
new file mode 100644
index 0000000..65b5de2
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IPlaneVisualization.ts
@@ -0,0 +1,6 @@
+import { IRoomPlane } from './IRoomPlane';
+
+export interface IPlaneVisualization
+{
+ planes: IRoomPlane[];
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts
new file mode 100644
index 0000000..8fb20d2
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectGraphicVisualization.ts
@@ -0,0 +1,7 @@
+import { IGraphicAssetCollection } from '../../../asset';
+import { IRoomObjectVisualization } from './IRoomObjectVisualization';
+
+export interface IRoomObjectGraphicVisualization extends IRoomObjectVisualization
+{
+ asset: IGraphicAssetCollection;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectSprite.ts b/packages/api/src/room/object/visualization/IRoomObjectSprite.ts
new file mode 100644
index 0000000..6490044
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectSprite.ts
@@ -0,0 +1,32 @@
+import { BLEND_MODES, Filter, Texture } from 'pixi.js';
+
+export interface IRoomObjectSprite
+{
+ dispose(): void;
+ increaseUpdateCounter(): void;
+ id: number;
+ name: string;
+ type: string;
+ spriteType: number;
+ texture: Texture;
+ width: number;
+ height: number;
+ offsetX: number;
+ offsetY: number;
+ flipH: boolean;
+ flipV: boolean;
+ direction: number;
+ alpha: number;
+ blendMode: BLEND_MODES;
+ color: number;
+ relativeDepth: number;
+ varyingDepth: boolean;
+ libraryAssetName: string;
+ clickHandling: boolean;
+ visible: boolean;
+ tag: string;
+ posture: string;
+ alphaTolerance: number;
+ filters: Filter[];
+ updateCounter: number;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts
new file mode 100644
index 0000000..e3dd4cd
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectSpriteVisualization.ts
@@ -0,0 +1,12 @@
+import { RoomObjectSpriteData } from '../../RoomObjectSpriteData';
+import { IRoomObjectGraphicVisualization } from './IRoomObjectGraphicVisualization';
+import { IRoomObjectSprite } from './IRoomObjectSprite';
+
+export interface IRoomObjectSpriteVisualization extends IRoomObjectGraphicVisualization
+{
+ getSprite(index: number): IRoomObjectSprite;
+ getSpriteList(): RoomObjectSpriteData[];
+ sprites: IRoomObjectSprite[];
+ updateObjectCounter: number;
+ updateModelCounter: number;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts
new file mode 100644
index 0000000..9ea0228
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectVisualization.ts
@@ -0,0 +1,17 @@
+import { Rectangle, Texture } from 'pixi.js';
+import { IRoomGeometry } from '../../IRoomGeometry';
+import { IRoomObject } from '../IRoomObject';
+import { IObjectVisualizationData } from './IRoomObjectVisualizationData';
+
+export interface IRoomObjectVisualization
+{
+ initialize(data: IObjectVisualizationData): boolean;
+ dispose(): void;
+ update(geometry: IRoomGeometry, time: number, update: boolean, skipUpdate: boolean): void;
+ getBoundingRectangle(): Rectangle;
+ getImage(): Texture;
+ instanceId: number;
+ object: IRoomObject;
+ image: Texture;
+ updateSpriteCounter: number;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts
new file mode 100644
index 0000000..4337029
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectVisualizationData.ts
@@ -0,0 +1,7 @@
+import { IAssetData } from '../../../asset';
+
+export interface IObjectVisualizationData
+{
+ initialize(asset: IAssetData): boolean;
+ dispose(): void;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts b/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts
new file mode 100644
index 0000000..a28adae
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomObjectVisualizationFactory.ts
@@ -0,0 +1,9 @@
+import { IAssetData } from '../../../asset';
+import { IRoomObjectGraphicVisualization } from './IRoomObjectGraphicVisualization';
+import { IObjectVisualizationData } from './IRoomObjectVisualizationData';
+
+export interface IRoomObjectVisualizationFactory
+{
+ getVisualization(type: string): IRoomObjectGraphicVisualization;
+ getVisualizationData(type: string, visualization: string, asset: IAssetData): IObjectVisualizationData;
+}
diff --git a/packages/api/src/room/object/visualization/IRoomPlane.ts b/packages/api/src/room/object/visualization/IRoomPlane.ts
new file mode 100644
index 0000000..1cc6bc6
--- /dev/null
+++ b/packages/api/src/room/object/visualization/IRoomPlane.ts
@@ -0,0 +1,10 @@
+import { IVector3D } from '../../../utils';
+
+export interface IRoomPlane
+{
+ uniqueId: number;
+ location: IVector3D;
+ leftSide: IVector3D;
+ rightSide: IVector3D;
+ color: number;
+}
diff --git a/packages/api/src/room/object/visualization/ISortableSprite.ts b/packages/api/src/room/object/visualization/ISortableSprite.ts
new file mode 100644
index 0000000..b4c0e75
--- /dev/null
+++ b/packages/api/src/room/object/visualization/ISortableSprite.ts
@@ -0,0 +1,9 @@
+import { IRoomObjectSprite } from './IRoomObjectSprite';
+
+export interface ISortableSprite
+{
+ x: number;
+ y: number;
+ z: number;
+ sprite: IRoomObjectSprite;
+}
\ No newline at end of file
diff --git a/packages/api/src/room/object/visualization/index.ts b/packages/api/src/room/object/visualization/index.ts
new file mode 100644
index 0000000..681f37e
--- /dev/null
+++ b/packages/api/src/room/object/visualization/index.ts
@@ -0,0 +1,10 @@
+export * from './IPlaneDrawingData';
+export * from './IPlaneVisualization';
+export * from './IRoomObjectGraphicVisualization';
+export * from './IRoomObjectSprite';
+export * from './IRoomObjectSpriteVisualization';
+export * from './IRoomObjectVisualization';
+export * from './IRoomObjectVisualizationData';
+export * from './IRoomObjectVisualizationFactory';
+export * from './IRoomPlane';
+export * from './ISortableSprite';
diff --git a/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts b/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts
new file mode 100644
index 0000000..bcd97ff
--- /dev/null
+++ b/packages/api/src/room/renderer/IRoomCanvasMouseListener.ts
@@ -0,0 +1,8 @@
+import { IRoomGeometry } from '../IRoomGeometry';
+import { IRoomSpriteMouseEvent } from '../IRoomSpriteMouseEvent';
+import { IRoomObject } from '../object';
+
+export interface IRoomCanvasMouseListener
+{
+ processRoomCanvasMouseEvent(event: IRoomSpriteMouseEvent, object: IRoomObject, geometry: IRoomGeometry): void
+}
diff --git a/packages/api/src/room/renderer/IRoomRenderer.ts b/packages/api/src/room/renderer/IRoomRenderer.ts
new file mode 100644
index 0000000..4477917
--- /dev/null
+++ b/packages/api/src/room/renderer/IRoomRenderer.ts
@@ -0,0 +1,9 @@
+import { IRoomRendererBase } from './IRoomRendererBase';
+import { IRoomRenderingCanvas } from './IRoomRenderingCanvas';
+
+export interface IRoomRenderer extends IRoomRendererBase
+{
+ getCanvas(id: number): IRoomRenderingCanvas;
+ createCanvas(id: number, width: number, height: number, scale: number): IRoomRenderingCanvas;
+ roomObjectVariableAccurateZ: string;
+}
\ No newline at end of file
diff --git a/packages/api/src/room/renderer/IRoomRendererBase.ts b/packages/api/src/room/renderer/IRoomRendererBase.ts
new file mode 100644
index 0000000..2c00706
--- /dev/null
+++ b/packages/api/src/room/renderer/IRoomRendererBase.ts
@@ -0,0 +1,10 @@
+import { IRoomObject } from '../object';
+
+export interface IRoomRendererBase
+{
+ addObject(object: IRoomObject): void;
+ removeObject(object: IRoomObject): void;
+ dispose(): void;
+ reset(): void;
+ update(time: number, update?: boolean): void;
+}
diff --git a/packages/api/src/room/renderer/IRoomRenderingCanvas.ts b/packages/api/src/room/renderer/IRoomRenderingCanvas.ts
new file mode 100644
index 0000000..65a24b6
--- /dev/null
+++ b/packages/api/src/room/renderer/IRoomRenderingCanvas.ts
@@ -0,0 +1,36 @@
+import { Container, Point, Texture } from 'pixi.js';
+import { IRoomGeometry } from '../IRoomGeometry';
+import { RoomObjectSpriteData } from '../RoomObjectSpriteData';
+import { ISortableSprite } from '../object';
+import { IRoomCanvasMouseListener } from './IRoomCanvasMouseListener';
+
+export interface IRoomRenderingCanvas
+{
+ dispose(): void;
+ initialize(width: number, height: number): void;
+ setMask(flag: boolean): void;
+ setScale(scale: number, point?: Point, offsetPoint?: Point, override?: boolean, asDelta?: boolean): void;
+ render(time: number, update?: boolean): void;
+ update(): void;
+ setMouseListener(listener: IRoomCanvasMouseListener): void;
+ skipSpriteVisibilityChecking(): void;
+ resumeSpriteVisibilityChecking(): void;
+ getPlaneSortableSprites(): ISortableSprite[];
+ handleMouseEvent(x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): boolean;
+ getSortableSpriteList(): RoomObjectSpriteData[];
+ getDisplayAsTexture(): Texture;
+ moveLeft(): void;
+ moveRight(): void;
+ moveUp(): void;
+ moveDown(): void;
+ id: number;
+ geometry: IRoomGeometry;
+ master: Container;
+ display: Container;
+ screenOffsetX: number;
+ screenOffsetY: number;
+ scale: number;
+ width: number;
+ height: number;
+ canvasUpdated: boolean;
+}
diff --git a/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts b/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts
new file mode 100644
index 0000000..be65859
--- /dev/null
+++ b/packages/api/src/room/renderer/IRoomSpriteCanvasContainer.ts
@@ -0,0 +1,8 @@
+import { IRoomObject } from '../object';
+
+export interface IRoomSpriteCanvasContainer
+{
+ getRoomObject(instanceId: number): IRoomObject;
+ objects: Map;
+ roomObjectVariableAccurateZ: string;
+}
diff --git a/packages/api/src/room/renderer/index.ts b/packages/api/src/room/renderer/index.ts
new file mode 100644
index 0000000..82ea268
--- /dev/null
+++ b/packages/api/src/room/renderer/index.ts
@@ -0,0 +1,5 @@
+export * from './IRoomCanvasMouseListener';
+export * from './IRoomRenderer';
+export * from './IRoomRendererBase';
+export * from './IRoomRenderingCanvas';
+export * from './IRoomSpriteCanvasContainer';
diff --git a/packages/api/src/ui/MouseEventType.ts b/packages/api/src/ui/MouseEventType.ts
new file mode 100644
index 0000000..b5c5f84
--- /dev/null
+++ b/packages/api/src/ui/MouseEventType.ts
@@ -0,0 +1,12 @@
+export class MouseEventType
+{
+ public static MOUSE_CLICK: string = 'click';
+ public static DOUBLE_CLICK: string = 'double_click';
+ public static MOUSE_MOVE: string = 'mousemove';
+ public static MOUSE_DOWN: string = 'mousedown';
+ public static MOUSE_DOWN_LONG: string = 'mousedown_long';
+ public static MOUSE_UP: string = 'mouseup';
+ public static ROLL_OVER: string = 'mouseover';
+ public static ROLL_OUT: string = 'mouseout';
+ public static RIGHT_CLICK: string = 'contextmenu';
+}
diff --git a/packages/api/src/ui/TouchEventType.ts b/packages/api/src/ui/TouchEventType.ts
new file mode 100644
index 0000000..3f6eec9
--- /dev/null
+++ b/packages/api/src/ui/TouchEventType.ts
@@ -0,0 +1,8 @@
+export class TouchEventType
+{
+ public static TOUCH_START: string = 'touchstart';
+ public static TOUCH_MOVE: string = 'touchmove';
+ public static TOUCH_CANCEL: string = 'touchcancel';
+ public static TOUCH_END: string = 'touchend';
+ public static TOUCH_LONG: string = 'touchlong';
+}
diff --git a/packages/api/src/ui/enums/AvatarExpressionEnum.ts b/packages/api/src/ui/enums/AvatarExpressionEnum.ts
new file mode 100644
index 0000000..389f8d4
--- /dev/null
+++ b/packages/api/src/ui/enums/AvatarExpressionEnum.ts
@@ -0,0 +1,28 @@
+export class AvatarExpressionEnum
+{
+ public static NONE: AvatarExpressionEnum = new AvatarExpressionEnum(0);
+ public static WAVE: AvatarExpressionEnum = new AvatarExpressionEnum(1);
+ public static BLOW: AvatarExpressionEnum = new AvatarExpressionEnum(2);
+ public static LAUGH: AvatarExpressionEnum = new AvatarExpressionEnum(3);
+ public static CRY: AvatarExpressionEnum = new AvatarExpressionEnum(4);
+ public static IDLE: AvatarExpressionEnum = new AvatarExpressionEnum(5);
+ public static JUMP: AvatarExpressionEnum = new AvatarExpressionEnum(6);
+ public static RESPECT: AvatarExpressionEnum = new AvatarExpressionEnum(7);
+
+ private _ordinal: number;
+
+ constructor(k: number)
+ {
+ this._ordinal = k;
+ }
+
+ public get ordinal(): number
+ {
+ return this._ordinal;
+ }
+
+ public equals(k: AvatarExpressionEnum): boolean
+ {
+ return (k) && (k._ordinal == this._ordinal);
+ }
+}
diff --git a/packages/api/src/ui/enums/ContextMenuEnum.ts b/packages/api/src/ui/enums/ContextMenuEnum.ts
new file mode 100644
index 0000000..7c53378
--- /dev/null
+++ b/packages/api/src/ui/enums/ContextMenuEnum.ts
@@ -0,0 +1,12 @@
+export class ContextMenuEnum
+{
+ public static DUMMY: string = 'DUMMY';
+ public static FRIEND_FURNITURE: string = 'FRIEND_FURNITURE';
+ public static MONSTERPLANT_SEED: string = 'MONSTERPLANT_SEED';
+ public static MYSTERY_BOX: string = 'MYSTERY_BOX';
+ public static EFFECT_BOX: string = 'EFFECT_BOX';
+ public static MYSTERY_TROPHY: string = 'MYSTERY_TROPHY';
+ public static RANDOM_TELEPORT: string = 'RANDOM_TELEPORT';
+ public static PURCHASABLE_CLOTHING: string = 'PURCHASABLE_CLOTHING';
+ public static GENERIC_USABLE: string = 'GENERIC_USABLE';
+}
diff --git a/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts b/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts
new file mode 100644
index 0000000..4417687
--- /dev/null
+++ b/packages/api/src/ui/enums/FriendWidgetEngravingWidgetTypeEnum.ts
@@ -0,0 +1,8 @@
+export class FriendWidgetEngravingWidgetTypeEnum
+{
+ public static LOVE_LOCK: number = 0;
+ public static CARVE_A_TREE: number = 1;
+ public static FRIENDS_PORTRAIT: number = 2;
+ public static WILD_WEST_WANTED: number = 3;
+ public static HABBOWEEN: number = 4;
+}
diff --git a/packages/api/src/ui/enums/RoomWidgetEnum.ts b/packages/api/src/ui/enums/RoomWidgetEnum.ts
new file mode 100644
index 0000000..4b746b5
--- /dev/null
+++ b/packages/api/src/ui/enums/RoomWidgetEnum.ts
@@ -0,0 +1,57 @@
+export class RoomWidgetEnum
+{
+ public static CHAT_WIDGET: string = 'RWE_CHAT_WIDGET';
+ public static INFOSTAND: string = 'RWE_INFOSTAND';
+ public static ME_MENU: string = 'RWE_ME_MENU';
+ public static CHAT_INPUT_WIDGET: string = 'RWE_CHAT_INPUT_WIDGET';
+ public static FURNI_PLACEHOLDER: string = 'RWE_FURNI_PLACEHOLDER';
+ public static FURNI_CREDIT_WIDGET: string = 'RWE_FURNI_CREDIT_WIDGET';
+ public static FURNI_STICKIE_WIDGET: string = 'RWE_FURNI_STICKIE_WIDGET';
+ public static FURNI_TROPHY_WIDGET: string = 'RWE_FURNI_TROPHY_WIDGET';
+ public static FURNI_LOVELOCK_WIDGET: string = 'RWE_FURNI_LOVELOCK_WIDGET';
+ public static FURNI_PRESENT_WIDGET: string = 'RWE_FURNI_PRESENT_WIDGET';
+ public static FURNI_ECOTRONBOX_WIDGET: string = 'RWE_FURNI_ECOTRONBOX_WIDGET';
+ public static FURNI_PET_PACKAGE_WIDGET: string = 'RWE_FURNI_PET_PACKAGE_WIDGET';
+ public static PLAYLIST_EDITOR_WIDGET: string = 'RWE_PLAYLIST_EDITOR_WIDGET';
+ public static DOORBELL: string = 'RWE_DOORBELL';
+ public static LOADINGBAR: string = 'RWE_LOADINGBAR';
+ public static ROOM_QUEUE: string = 'RWE_ROOM_QUEUE';
+ public static ROOM_POLL: string = 'RWE_ROOM_POLL';
+ public static ROOM_VOTE: string = 'RWE_ROOM_VOTE';
+ public static USER_CHOOSER: string = 'RWE_USER_CHOOSER';
+ public static FURNI_CHOOSER: string = 'RWE_FURNI_CHOOSER';
+ public static ROOM_DIMMER: string = 'RWE_ROOM_DIMMER';
+ public static FRIEND_REQUEST: string = 'RWE_FRIEND_REQUEST';
+ public static CLOTHING_CHANGE: string = 'RWE_CLOTHING_CHANGE';
+ public static CONVERSION_TRACKING: string = 'RWE_CONVERSION_TRACKING';
+ public static USER_NOTIFICATION: string = 'RWE_USER_NOTIFICATION';
+ public static FRIENDS_BAR: string = 'RWE_FRIENDS_BAR';
+ public static PURSE_WIDGET: string = 'RWE_PURSE_WIDGET';
+ public static AVATAR_INFO: string = 'RWE_AVATAR_INFO';
+ public static WELCOME_GIFT: string = 'RWE_WELCOME_GIFT';
+ public static SPAMWALL_POSTIT_WIDGET: string = 'RWE_SPAMWALL_POSTIT_WIDGET';
+ public static EFFECTS: string = 'RWE_EFFECTS';
+ public static MANNEQUIN: string = 'RWE_MANNEQUIN';
+ public static FURNITURE_CONTEXT_MENU: string = 'RWE_FURNITURE_CONTEXT_MENU';
+ public static LOCATION_WIDGET: string = 'RWE_LOCATION_WIDGET';
+ public static CAMERA: string = 'RWE_CAMERA';
+ public static ROOM_THUMBNAIL_CAMERA: string = 'RWE_ROOM_THUMBNAIL_CAMERA';
+ public static ROOM_BACKGROUND_COLOR: string = 'RWE_ROOM_BACKGROUND_COLOR';
+ public static CUSTOM_USER_NOTIFICATION: string = 'RWE_CUSTOM_USER_NOTIFICATION';
+ public static FURNI_ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'RWE_FURNI_ACHIEVEMENT_RESOLUTION_ENGRAVING';
+ public static FRIEND_FURNI_CONFIRM: string = 'RWE_FRIEND_FURNI_CONFIRM';
+ public static FRIEND_FURNI_ENGRAVING: string = 'RWE_FRIEND_FURNI_ENGRAVING';
+ public static HIGH_SCORE_DISPLAY: string = 'RWE_HIGH_SCORE_DISPLAY';
+ public static INTERNAL_LINK: string = 'RWE_INTERNAL_LINK';
+ public static CUSTOM_STACK_HEIGHT: string = 'RWE_CUSTOM_STACK_HEIGHT';
+ public static YOUTUBE: string = 'RWE_YOUTUBE';
+ public static RENTABLESPACE: string = 'RWE_RENTABLESPACE';
+ public static VIMEO: string = 'RWE_VIMEO';
+ public static ROOM_TOOLS: string = 'RWE_ROOM_TOOLS';
+ public static EXTERNAL_IMAGE: string = 'RWE_EXTERNAL_IMAGE';
+ public static WORD_QUIZZ: string = 'RWE_WORD_QUIZZ';
+ public static UI_HELP_BUBBLE: string = 'RWE_UI_HELP_BUBBLE';
+ public static ROOM_LINK: string = 'RWE_ROOM_LINK';
+ public static CRAFTING: string = 'RWE_CRAFTING';
+ public static ROOMGAME_CHECKERS: string = 'RWE_GAME_CHECKERS';
+}
diff --git a/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts b/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts
new file mode 100644
index 0000000..d252e69
--- /dev/null
+++ b/packages/api/src/ui/enums/RoomWidgetEnumItemExtradataParameter.ts
@@ -0,0 +1,10 @@
+export class RoomWidgetEnumItemExtradataParameter
+{
+ public static INFOSTAND_EXTRA_PARAM: string = 'RWEIEP_INFOSTAND_EXTRA_PARAM';
+ public static JUKEBOX: string = 'RWEIEP_JUKEBOX';
+ public static USABLE_PRODUCT: string = 'RWEIEP_USABLE_PRODUCT';
+ public static SONGDISK: string = 'RWEIEP_SONGDISK';
+ public static CRACKABLE_FURNI: string = 'RWEIEP_CRACKABLE_FURNI';
+ public static BRANDING_OPTIONS: string = 'RWEIEP_BRANDING_OPTIONS';
+ public static USABLE: string = 'RWEIEP_USABLE';
+}
diff --git a/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts b/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts
new file mode 100644
index 0000000..523205c
--- /dev/null
+++ b/packages/api/src/ui/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts
@@ -0,0 +1,6 @@
+export class RoomWidgetFurniInfoUsagePolicyEnum
+{
+ public static NOBODY: number = 0;
+ public static CONTROLLER: number = 1;
+ public static EVERYBODY: number = 2;
+}
diff --git a/packages/api/src/ui/enums/SystemChatStyleEnum.ts b/packages/api/src/ui/enums/SystemChatStyleEnum.ts
new file mode 100644
index 0000000..15e3428
--- /dev/null
+++ b/packages/api/src/ui/enums/SystemChatStyleEnum.ts
@@ -0,0 +1,6 @@
+export class SystemChatStyleEnum
+{
+ public static NORMAL: number = 0;
+ public static GENERIC: number = 1;
+ public static BOT: number = 2;
+}
\ No newline at end of file
diff --git a/packages/api/src/ui/enums/index.ts b/packages/api/src/ui/enums/index.ts
new file mode 100644
index 0000000..48f242d
--- /dev/null
+++ b/packages/api/src/ui/enums/index.ts
@@ -0,0 +1,7 @@
+export * from './AvatarExpressionEnum';
+export * from './ContextMenuEnum';
+export * from './FriendWidgetEngravingWidgetTypeEnum';
+export * from './RoomWidgetEnum';
+export * from './RoomWidgetEnumItemExtradataParameter';
+export * from './RoomWidgetFurniInfoUsagePolicyEnum';
+export * from './SystemChatStyleEnum';
diff --git a/packages/api/src/ui/index.ts b/packages/api/src/ui/index.ts
new file mode 100644
index 0000000..d803ec8
--- /dev/null
+++ b/packages/api/src/ui/index.ts
@@ -0,0 +1,3 @@
+export * from './MouseEventType';
+export * from './TouchEventType';
+export * from './enums';
diff --git a/packages/api/src/utils/IAdvancedMap.ts b/packages/api/src/utils/IAdvancedMap.ts
new file mode 100644
index 0000000..f10c570
--- /dev/null
+++ b/packages/api/src/utils/IAdvancedMap.ts
@@ -0,0 +1,22 @@
+import { IDisposable } from '../common';
+
+export interface IAdvancedMap extends IDisposable
+{
+ dispose(): void;
+ reset(): void;
+ unshift(key: T, value: U): boolean;
+ add(key: T, value: U): boolean;
+ remove(key: T): U;
+ getWithIndex(index: number): U;
+ getKey(index: number): T;
+ getKeys(): T[];
+ hasKey(key: T): boolean;
+ getValue(key: T): U;
+ getValues(): U[];
+ hasValue(value: U): boolean;
+ indexOf(value: U): number;
+ concatenate(newValues: IAdvancedMap): void;
+ clone(): IAdvancedMap;
+ readonly length: number;
+ readonly disposed: boolean
+}
diff --git a/packages/api/src/utils/IBinaryReader.ts b/packages/api/src/utils/IBinaryReader.ts
new file mode 100644
index 0000000..6ad2657
--- /dev/null
+++ b/packages/api/src/utils/IBinaryReader.ts
@@ -0,0 +1,12 @@
+export interface IBinaryReader
+{
+ readBytes(length: number): IBinaryReader;
+ readByte(): number;
+ readShort(): number;
+ readInt(): number;
+ readFloat(): number;
+ readDouble(): number;
+ remaining(): number;
+ toString(encoding?: string): string;
+ toArrayBuffer(): ArrayBuffer;
+}
diff --git a/packages/api/src/utils/IBinaryWriter.ts b/packages/api/src/utils/IBinaryWriter.ts
new file mode 100644
index 0000000..f3135c0
--- /dev/null
+++ b/packages/api/src/utils/IBinaryWriter.ts
@@ -0,0 +1,11 @@
+export interface IBinaryWriter
+{
+ writeByte(byte: number): IBinaryWriter;
+ writeBytes(bytes: ArrayBuffer | number[]): IBinaryWriter;
+ writeShort(short: number): IBinaryWriter;
+ writeInt(integer: number): IBinaryWriter;
+ writeString(string: string, includeLength?: boolean): IBinaryWriter;
+ getBuffer(): ArrayBuffer;
+ position: number;
+ toString(encoding?: string): string;
+}
diff --git a/packages/api/src/utils/IVector3D.ts b/packages/api/src/utils/IVector3D.ts
new file mode 100644
index 0000000..467e26e
--- /dev/null
+++ b/packages/api/src/utils/IVector3D.ts
@@ -0,0 +1,16 @@
+export interface IVector3D
+{
+ assign(vector: IVector3D): void;
+ add(vector: IVector3D): void;
+ subtract(vector: IVector3D): void;
+ multiply(amount: number): void;
+ divide(amount: number): void;
+ negate(): void;
+ dotProduct(vector: IVector3D): number;
+ crossProduct(vector: IVector3D): IVector3D;
+ normalize(): void;
+ x: number;
+ y: number;
+ z: number;
+ length: number;
+}
diff --git a/packages/api/src/utils/index.ts b/packages/api/src/utils/index.ts
new file mode 100644
index 0000000..15828e4
--- /dev/null
+++ b/packages/api/src/utils/index.ts
@@ -0,0 +1,4 @@
+export * from './IAdvancedMap';
+export * from './IBinaryReader';
+export * from './IBinaryWriter';
+export * from './IVector3D';
diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json
new file mode 100644
index 0000000..5e8757d
--- /dev/null
+++ b/packages/api/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./src",
+ "outDir": "./dist",
+ "sourceMap": false,
+ "declaration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "Node",
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ "downlevelIteration": true,
+ "allowSyntheticDefaultImports": true,
+ "allowJs": true,
+ "skipLibCheck": true,
+ "noEmit": true,
+ "strict": false,
+ "strictNullChecks": false,
+ "target": "ES6",
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "module": "ES6"
+ },
+ "include": [
+ "src" ]
+}
diff --git a/packages/assets/.eslintrc.json b/packages/assets/.eslintrc.json
new file mode 100644
index 0000000..ad92133
--- /dev/null
+++ b/packages/assets/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": [ "@nitrots/eslint-config" ]
+}
diff --git a/packages/assets/.gitignore b/packages/assets/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/packages/assets/.gitignore
@@ -0,0 +1,51 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
+/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+.git
+
+# System Files
+.DS_Store
+Thumbs.db
+
+*.zip
+*.as
+*.bin
diff --git a/packages/assets/index.ts b/packages/assets/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/packages/assets/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/assets/package.json b/packages/assets/package.json
new file mode 100644
index 0000000..586612d
--- /dev/null
+++ b/packages/assets/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "@nitrots/assets",
+ "description": "Nitro assets module",
+ "version": "1.0.0",
+ "type": "module",
+ "publishConfig": {
+ "access": "public"
+ },
+ "license": "GPL-3.0",
+ "scripts": {
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "@nitrots/api": "1.0.0",
+ "@nitrots/eslint-config": "1.0.0",
+ "@nitrots/utils": "1.0.0",
+ "pixi.js": "^8.0.4",
+ "@pixi/gif": "^3.0.0"
+ },
+ "devDependencies": {
+ "typescript": "~5.4.2"
+ }
+}
diff --git a/packages/assets/src/AssetManager.ts b/packages/assets/src/AssetManager.ts
new file mode 100644
index 0000000..06953fe
--- /dev/null
+++ b/packages/assets/src/AssetManager.ts
@@ -0,0 +1,151 @@
+import { IAssetData, IAssetManager, IGraphicAsset, IGraphicAssetCollection } from '@nitrots/api';
+import { NitroBundle, NitroLogger } from '@nitrots/utils';
+import '@pixi/gif';
+import { Assets, Spritesheet, SpritesheetData, Texture } from 'pixi.js';
+import { GraphicAssetCollection } from './GraphicAssetCollection';
+
+export class AssetManager implements IAssetManager
+{
+ private _textures: Map = new Map();
+ private _collections: Map = new Map();
+
+ public getTexture(name: string): Texture
+ {
+ if(!name) return null;
+
+ return this._textures.get(name);
+ }
+
+ public setTexture(name: string, texture: Texture): void
+ {
+ if(!name || !texture) return;
+
+ texture.label = name;
+
+ this._textures.set(name, texture);
+ }
+
+ public getAsset(name: string): IGraphicAsset
+ {
+ if(!name) return null;
+
+ for(const collection of this._collections.values())
+ {
+ if(!collection) continue;
+
+ const existing = collection.getAsset(name);
+
+ if(!existing) continue;
+
+ return existing;
+ }
+
+ NitroLogger.warn(`AssetManager: Asset not found: ${name}`);
+
+ return null;
+ }
+
+ public addAssetToCollection(collectionName: string, assetName: string, texture: Texture, override: boolean = true): boolean
+ {
+ const collection = this.getCollection(collectionName);
+
+ if(!collection) return false;
+
+ return collection.addAsset(assetName, texture, override, 0, 0, false, false);
+ }
+
+ public getCollection(name: string): IGraphicAssetCollection
+ {
+ if(!name) return null;
+
+ return this._collections.get(name);
+ }
+
+ public createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection
+ {
+ if(!data) return null;
+
+ const collection = new GraphicAssetCollection(data, spritesheet);
+
+ for(const [name, texture] of collection.textures.entries()) this.setTexture(name, texture);
+
+ this._collections.set(collection.name, collection);
+
+ return collection;
+ }
+
+ public async downloadAssets(urls: string[]): Promise
+ {
+ if(!urls || !urls.length) return Promise.resolve(true);
+
+ try
+ {
+ await Promise.all(urls.map(url => this.downloadAsset(url)));
+
+ return true;
+ }
+
+ catch (err)
+ {
+ NitroLogger.error(err);
+ }
+
+ return false;
+ }
+
+ public async downloadAsset(url: string): Promise
+ {
+ try
+ {
+ if(!url || !url.length) return false;
+
+ if(url.endsWith('.png') || url.endsWith('.jpg') || url.endsWith('.jpeg') || url.endsWith('.gif'))
+ {
+ const texture = await Assets.load(url);
+
+ this.setTexture(url, texture);
+
+ return true;
+ }
+
+ const response = await fetch(url);
+
+ if(response.status !== 200 || !response.headers.has('Content-Type') || response.headers.get('Content-Type') !== 'application/octet-stream') return false;
+
+ const buffer = await response.arrayBuffer();
+ const nitroBundle = await NitroBundle.from(buffer);
+
+ await this.processAsset(nitroBundle.texture, nitroBundle.jsonFile as IAssetData);
+
+ return true;
+ }
+
+ catch (err)
+ {
+ NitroLogger.error(err);
+
+ return false;
+ }
+ }
+
+ private async processAsset(texture: Texture, data: IAssetData): Promise
+ {
+ let spritesheet: Spritesheet = null;
+
+ if(texture && data?.spritesheet && Object.keys(data.spritesheet).length)
+ {
+ spritesheet = new Spritesheet(texture, data.spritesheet);
+
+ await spritesheet.parse();
+
+ spritesheet.textureSource.label = data.name ?? null;
+ }
+
+ this.createCollection(data, spritesheet);
+ }
+
+ public get collections(): Map
+ {
+ return this._collections;
+ }
+}
diff --git a/packages/assets/src/GetAssetManager.ts b/packages/assets/src/GetAssetManager.ts
new file mode 100644
index 0000000..257ceea
--- /dev/null
+++ b/packages/assets/src/GetAssetManager.ts
@@ -0,0 +1,5 @@
+import { AssetManager } from './AssetManager';
+
+const assetManager = new AssetManager();
+
+export const GetAssetManager = () => assetManager;
diff --git a/packages/assets/src/GraphicAsset.ts b/packages/assets/src/GraphicAsset.ts
new file mode 100644
index 0000000..1b6aa18
--- /dev/null
+++ b/packages/assets/src/GraphicAsset.ts
@@ -0,0 +1,140 @@
+import { Rectangle, Texture } from 'pixi.js';
+import { IGraphicAsset } from '../../api/src/asset/IGraphicAsset';
+
+export class GraphicAsset implements IGraphicAsset
+{
+ private static GRAPHIC_POOL: GraphicAsset[] = [];
+
+ private _name: string;
+ private _source: string;
+ private _texture: Texture;
+ private _usesPalette: boolean;
+ private _x: number;
+ private _y: number;
+ private _width: number;
+ private _height: number;
+ private _flipH: boolean;
+ private _flipV: boolean;
+ private _rectangle: Rectangle;
+ private _initialized: boolean;
+
+ public static createAsset(name: string, source: string, texture: Texture, x: number, y: number, flipH: boolean = false, flipV: boolean = false, usesPalette: boolean = false): GraphicAsset
+ {
+ const graphicAsset = (GraphicAsset.GRAPHIC_POOL.length ? GraphicAsset.GRAPHIC_POOL.pop() : new GraphicAsset());
+
+ graphicAsset._name = name;
+ graphicAsset._source = source || null;
+
+ if(texture)
+ {
+ graphicAsset._texture = texture;
+ graphicAsset._initialized = false;
+ }
+ else
+ {
+ graphicAsset._texture = null;
+ graphicAsset._initialized = true;
+ }
+
+ graphicAsset._usesPalette = usesPalette;
+ graphicAsset._x = x;
+ graphicAsset._y = y;
+ graphicAsset._flipH = flipH;
+ graphicAsset._flipV = flipV;
+ graphicAsset._rectangle = null;
+
+ return graphicAsset;
+ }
+
+ public recycle(): void
+ {
+ this._texture = null;
+
+ GraphicAsset.GRAPHIC_POOL.push(this);
+ }
+
+ private initialize(): void
+ {
+ if(this._initialized || !this._texture) return;
+
+ this._width = this._texture.width;
+ this._height = this._texture.height;
+
+ this._initialized = true;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get source(): string
+ {
+ return this._source;
+ }
+
+ public get texture(): Texture
+ {
+ return this._texture;
+ }
+
+ public get usesPalette(): boolean
+ {
+ return this._usesPalette;
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+
+ public get width(): number
+ {
+ this.initialize();
+
+ return this._width;
+ }
+
+ public get height(): number
+ {
+ this.initialize();
+
+ return this._height;
+ }
+
+ public get offsetX(): number
+ {
+ if(!this._flipH) return this._x;
+
+ return (-(this._x));
+ }
+
+ public get offsetY(): number
+ {
+ if(!this._flipV) return this._y;
+
+ return (-(this._y));
+ }
+
+ public get flipH(): boolean
+ {
+ return this._flipH;
+ }
+
+ public get flipV(): boolean
+ {
+ return this._flipV;
+ }
+
+ public get rectangle(): Rectangle
+ {
+ if(!this._rectangle) this._rectangle = new Rectangle(0, 0, this.width, this.height);
+
+ return this._rectangle;
+ }
+}
diff --git a/packages/assets/src/GraphicAssetCollection.ts b/packages/assets/src/GraphicAssetCollection.ts
new file mode 100644
index 0000000..e38dc97
--- /dev/null
+++ b/packages/assets/src/GraphicAssetCollection.ts
@@ -0,0 +1,372 @@
+import { IAsset, IAssetData, IAssetPalette, IGraphicAsset, IGraphicAssetCollection, IGraphicAssetPalette } from '@nitrots/api';
+import { Dict, Spritesheet, Texture, TextureSource } from 'pixi.js';
+import { GraphicAsset } from './GraphicAsset';
+import { GraphicAssetPalette } from './GraphicAssetPalette';
+
+export class GraphicAssetCollection implements IGraphicAssetCollection
+{
+ private static PALETTE_ASSET_DISPOSE_THRESHOLD: number = 10;
+
+ private _referenceCount: number;
+
+ private _name: string;
+ private _textureSource: TextureSource;
+ private _data: IAssetData;
+ private _textures: Map;
+ private _assets: Map;
+ private _palettes: Map;
+ private _paletteAssetNames: string[];
+
+ constructor(data: IAssetData, spritesheet: Spritesheet)
+ {
+ if(!data) throw new Error('invalid_collection');
+
+ this._name = data.name;
+ this._textureSource = ((spritesheet && spritesheet.textureSource) || null);
+ this._data = data;
+ this._textures = new Map();
+ this._assets = new Map();
+ this._palettes = new Map();
+ this._paletteAssetNames = [];
+
+ if(spritesheet) this.addLibraryAsset(spritesheet.textures);
+
+ this.define(data);
+ }
+
+ public static removeFileExtension(name: string): string
+ {
+ return (name.substring(0, name.lastIndexOf('.')) || name);
+ }
+
+ public dispose(): void
+ {
+ if(this._palettes) this._palettes.clear();
+
+ if(this._paletteAssetNames)
+ {
+ this.disposePaletteAssets();
+
+ this._paletteAssetNames = null;
+ }
+
+ if(this._assets)
+ {
+ for(const asset of this._assets.values()) asset.recycle();
+
+ this._assets.clear();
+ }
+ }
+
+ public addReference(): void
+ {
+ this._referenceCount++;
+ }
+
+ public removeReference(): void
+ {
+ this._referenceCount--;
+
+ if(this._referenceCount <= 0)
+ {
+ this._referenceCount = 0;
+
+ this.disposePaletteAssets(false);
+ }
+ }
+
+ public define(data: IAssetData): void
+ {
+ const assets = data.assets;
+ const palettes = data.palettes;
+
+ if(assets) this.defineAssets(assets);
+
+ if(palettes) this.definePalettes(palettes);
+ }
+
+ private defineAssets(assets: { [index: string]: IAsset }): void
+ {
+ if(!assets) return;
+
+ for(const name in assets)
+ {
+ const asset = assets[name];
+
+ if(!asset) continue;
+
+ const x = (-(asset.x) || 0);
+ const y = (-(asset.y) || 0);
+ let flipH = false;
+ const flipV = false;
+ const usesPalette = (asset.usesPalette || false);
+ let source = (asset.source || '');
+
+ if(asset.flipH && source.length) flipH = true;
+
+ // if(asset.flipV && source.length) flipV = true;
+
+ if(!source.length) source = name;
+
+ const texture = this.getLibraryAsset(source);
+
+ if(!texture) continue;
+
+ let didAddAsset = this.createAsset(name, source, texture, flipH, flipV, x, y, usesPalette);
+
+ if(!didAddAsset)
+ {
+ const existingAsset = this.getAsset(name);
+
+ if(existingAsset && (existingAsset.name !== existingAsset.source))
+ {
+ didAddAsset = this.replaceAsset(name, source, texture, flipH, flipV, x, y, usesPalette);
+ }
+ }
+ }
+ }
+
+ private definePalettes(palettes: { [index: string]: IAssetPalette }): void
+ {
+ if(!palettes) return;
+
+ for(const name in palettes)
+ {
+ const palette = palettes[name];
+
+ if(!palette) continue;
+
+ const id = palette.id.toString();
+
+ if(this._palettes.get(id)) continue;
+
+ let colorOne = 0xFFFFFF;
+ let colorTwo = 0xFFFFFF;
+
+ let color = palette.color1;
+
+ if(color && color.length > 0) colorOne = parseInt(color, 16);
+
+ color = palette.color2;
+
+ if(color && color.length > 0) colorTwo = parseInt(color, 16);
+
+ this._palettes.set(id, new GraphicAssetPalette(palette.rgb, colorOne, colorTwo));
+ }
+ }
+
+ private createAsset(name: string, source: string, texture: Texture, flipH: boolean, flipV: boolean, x: number, y: number, usesPalette: boolean): boolean
+ {
+ if(this._assets.get(name)) return false;
+
+ const graphicAsset = GraphicAsset.createAsset(name, source, texture, x, y, flipH, flipV, usesPalette);
+
+ this._assets.set(name, graphicAsset);
+
+ return true;
+ }
+
+ private replaceAsset(name: string, source: string, texture: Texture, flipH: boolean, flipV: boolean, x: number, y: number, usesPalette: boolean): boolean
+ {
+ const existing = this._assets.get(name);
+
+ if(existing)
+ {
+ this._assets.delete(name);
+
+ existing.recycle();
+ }
+
+ return this.createAsset(name, source, texture, flipH, flipV, x, y, usesPalette);
+ }
+
+ public getAsset(name: string): IGraphicAsset
+ {
+ if(!name) return null;
+
+ const existing = this._assets.get(name);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getAssetWithPalette(name: string, paletteName: string): IGraphicAsset
+ {
+ const saveName = (name + '@' + paletteName);
+
+ let asset = this.getAsset(saveName);
+
+ if(!asset)
+ {
+ asset = this.getAsset(name);
+
+ if(!asset || !asset.usesPalette) return asset;
+
+ const palette = this.getPalette(paletteName);
+
+ if(palette)
+ {
+ const texture = palette.applyPalette(asset.texture);
+
+ if(texture)
+ {
+ this._paletteAssetNames.push(saveName);
+
+ this.createAsset(saveName, (asset.source + '@' + paletteName), texture, asset.flipH, asset.flipV, asset.x, asset.y, false);
+
+ asset = this.getAsset(saveName);
+ }
+ }
+ }
+
+ return asset;
+ }
+
+ public getTexture(name: string): Texture
+ {
+ return this._textures.get(name);
+ }
+
+ public getPaletteNames(): string[]
+ {
+ return Array.from(this._palettes.keys());
+ }
+
+ public getPaletteColors(paletteName: string): number[]
+ {
+ const palette = this.getPalette(paletteName);
+
+ if(palette) return [palette.primaryColor, palette.secondaryColor];
+
+ return null;
+ }
+
+ public getPalette(name: string): IGraphicAssetPalette
+ {
+ if(!name) return null;
+
+ return this._palettes.get(name);
+ }
+
+ public addAsset(name: string, texture: Texture, override: boolean, x: number = 0, y: number = 0, flipH: boolean = false, flipV: boolean = false): boolean
+ {
+ if(!name || !texture) return false;
+
+ const existingTexture = this.getLibraryAsset(name);
+
+ if(!existingTexture)
+ {
+ this._textures.set(name, texture);
+
+ return this.createAsset(name, name, texture, flipH, flipV, x, y, false);
+ }
+
+ if(override)
+ {
+ existingTexture.source = texture.source;
+
+ //@ts-ignore
+ existingTexture.frame = texture.frame;
+
+ //@ts-ignore
+ existingTexture.trim = texture.trim;
+
+ existingTexture.updateUvs();
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public disposeAsset(name: string): void
+ {
+ const existing = this._assets.get(name);
+
+ if(!existing) return;
+
+ this._assets.delete(name);
+
+ const texture = this.getLibraryAsset(existing.source);
+
+ if(texture)
+ {
+ this._textures.delete(existing.source);
+
+ texture.destroy(true);
+ }
+
+ existing.recycle();
+ }
+
+ public getLibraryAsset(name: string): Texture
+ {
+ if(!name) return null;
+
+ name = this._name + '_' + name;
+
+ const texture = this._textures.get(name);
+
+ if(!texture) return null;
+
+ return texture;
+ }
+
+ private addLibraryAsset(textures: Dict): void
+ {
+ if(!textures) return;
+
+ for(const name in textures)
+ {
+ const texture = textures[name];
+
+ if(!texture) continue;
+
+ this._textures.set(GraphicAssetCollection.removeFileExtension(name), texture);
+ }
+ }
+
+ private disposePaletteAssets(disposeAll: boolean = true): void
+ {
+ if(this._paletteAssetNames)
+ {
+ if(disposeAll || (this._paletteAssetNames.length > GraphicAssetCollection.PALETTE_ASSET_DISPOSE_THRESHOLD))
+ {
+ for(const name of this._paletteAssetNames) this.disposeAsset(name);
+
+ this._paletteAssetNames = [];
+ }
+ }
+ }
+
+ public get referenceCount(): number
+ {
+ return this._referenceCount;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get textureSource(): TextureSource
+ {
+ return this._textureSource;
+ }
+
+ public get data(): IAssetData
+ {
+ return this._data;
+ }
+
+ public get textures(): Map
+ {
+ return this._textures;
+ }
+
+ public get assets(): Map
+ {
+ return this._assets;
+ }
+}
diff --git a/packages/assets/src/GraphicAssetPalette.ts b/packages/assets/src/GraphicAssetPalette.ts
new file mode 100644
index 0000000..57652fd
--- /dev/null
+++ b/packages/assets/src/GraphicAssetPalette.ts
@@ -0,0 +1,57 @@
+import { IGraphicAssetPalette } from '@nitrots/api';
+import { GetRenderer } from '@nitrots/utils';
+import { Texture } from 'pixi.js';
+
+export class GraphicAssetPalette implements IGraphicAssetPalette
+{
+ private _palette: [number, number, number][];
+ private _primaryColor: number;
+ private _secondaryColor: number;
+
+ constructor(palette: [number, number, number][], primaryColor: number, secondaryColor: number)
+ {
+ this._palette = palette;
+
+ while(this._palette.length < 256) this._palette.push([0, 0, 0]);
+
+ this._primaryColor = primaryColor;
+ this._secondaryColor = secondaryColor;
+ }
+
+ public applyPalette(texture: Texture): Texture
+ {
+ const canvas = GetRenderer().texture.generateCanvas(texture);
+ const ctx = canvas.getContext('2d');
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
+
+ for(let i = 0; i < imageData.data.length; i += 4)
+ {
+ let paletteColor = this._palette[imageData.data[i + 1]];
+
+ if(paletteColor === undefined) paletteColor = [0, 0, 0];
+
+ imageData.data[i] = paletteColor[0];
+ imageData.data[i + 1] = paletteColor[1];
+ imageData.data[i + 2] = paletteColor[2];
+ }
+
+ ctx.putImageData(imageData, 0, 0);
+
+ const newTexture = Texture.from(canvas);
+
+ //@ts-ignore
+ newTexture.source.hitMap = imageData.data;
+
+ return newTexture;
+ }
+
+ public get primaryColor(): number
+ {
+ return this._primaryColor;
+ }
+
+ public get secondaryColor(): number
+ {
+ return this._secondaryColor;
+ }
+}
diff --git a/packages/assets/src/index.ts b/packages/assets/src/index.ts
new file mode 100644
index 0000000..a21d9b4
--- /dev/null
+++ b/packages/assets/src/index.ts
@@ -0,0 +1,5 @@
+export * from './AssetManager';
+export * from './GetAssetManager';
+export * from './GraphicAsset';
+export * from './GraphicAssetCollection';
+export * from './GraphicAssetPalette';
diff --git a/packages/assets/tsconfig.json b/packages/assets/tsconfig.json
new file mode 100644
index 0000000..5e8757d
--- /dev/null
+++ b/packages/assets/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./src",
+ "outDir": "./dist",
+ "sourceMap": false,
+ "declaration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "Node",
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ "downlevelIteration": true,
+ "allowSyntheticDefaultImports": true,
+ "allowJs": true,
+ "skipLibCheck": true,
+ "noEmit": true,
+ "strict": false,
+ "strictNullChecks": false,
+ "target": "ES6",
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "module": "ES6"
+ },
+ "include": [
+ "src" ]
+}
diff --git a/packages/avatar/.eslintrc.json b/packages/avatar/.eslintrc.json
new file mode 100644
index 0000000..ad92133
--- /dev/null
+++ b/packages/avatar/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": [ "@nitrots/eslint-config" ]
+}
diff --git a/packages/avatar/.gitignore b/packages/avatar/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/packages/avatar/.gitignore
@@ -0,0 +1,51 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
+/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+.git
+
+# System Files
+.DS_Store
+Thumbs.db
+
+*.zip
+*.as
+*.bin
diff --git a/packages/avatar/index.ts b/packages/avatar/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/packages/avatar/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/avatar/package.json b/packages/avatar/package.json
new file mode 100644
index 0000000..63549d6
--- /dev/null
+++ b/packages/avatar/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "@nitrots/avatar",
+ "description": "Nitro communication module",
+ "version": "1.0.0",
+ "type": "module",
+ "license": "GPL-3.0",
+ "scripts": {
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "@nitrots/api": "1.0.0",
+ "@nitrots/assets": "1.0.0",
+ "@nitrots/eslint-config": "1.0.0",
+ "@nitrots/events": "1.0.0",
+ "@nitrots/utils": "1.0.0"
+ },
+ "devDependencies": {
+ "typescript": "~5.4.2"
+ }
+}
diff --git a/packages/avatar/src/AvatarAssetDownloadLibrary.ts b/packages/avatar/src/AvatarAssetDownloadLibrary.ts
new file mode 100644
index 0000000..504b59b
--- /dev/null
+++ b/packages/avatar/src/AvatarAssetDownloadLibrary.ts
@@ -0,0 +1,65 @@
+import { IAssetManager, IAvatarAssetDownloadLibrary } from '@nitrots/api';
+import { AvatarRenderLibraryEvent, GetEventDispatcher, NitroEventType } from '@nitrots/events';
+
+export class AvatarAssetDownloadLibrary implements IAvatarAssetDownloadLibrary
+{
+ private static NOT_LOADED: number = 0;
+ private static LOADING: number = 1;
+ private static LOADED: number = 2;
+
+ private _state: number = AvatarAssetDownloadLibrary.NOT_LOADED;
+ private _libraryName: string;
+ private _revision: string;
+ private _downloadUrl: string;
+ private _assetManager: IAssetManager;
+
+ constructor(libraryName: string, revision: string, downloadUrl: string, assetManager: IAssetManager)
+ {
+ this._libraryName = libraryName;
+ this._revision = revision;
+ this._downloadUrl = downloadUrl;
+ this._assetManager = assetManager;
+
+ this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName);
+ this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision);
+
+ this.checkIsLoaded();
+ }
+
+ public async downloadAsset(): Promise
+ {
+ if(!this._assetManager || (this._state === AvatarAssetDownloadLibrary.LOADING) || (this._state === AvatarAssetDownloadLibrary.LOADED)) return;
+
+ if(!this.checkIsLoaded())
+ {
+ this._state = AvatarAssetDownloadLibrary.LOADING;
+
+ const status = await this._assetManager.downloadAsset(this._downloadUrl);
+
+ if(!status) throw new Error('Could not download asset');
+ }
+
+ if(this.checkIsLoaded()) GetEventDispatcher().dispatchEvent(new AvatarRenderLibraryEvent(NitroEventType.AVATAR_ASSET_DOWNLOADED, this));
+ }
+
+ private checkIsLoaded(): boolean
+ {
+ const asset = this._assetManager.getCollection(this._libraryName);
+
+ if(!asset) return false;
+
+ this._state = AvatarAssetDownloadLibrary.LOADED;
+
+ return true;
+ }
+
+ public get libraryName(): string
+ {
+ return this._libraryName;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return (this._state === AvatarAssetDownloadLibrary.LOADED);
+ }
+}
diff --git a/packages/avatar/src/AvatarAssetDownloadManager.ts b/packages/avatar/src/AvatarAssetDownloadManager.ts
new file mode 100644
index 0000000..a11f073
--- /dev/null
+++ b/packages/avatar/src/AvatarAssetDownloadManager.ts
@@ -0,0 +1,246 @@
+import { IAssetManager, IAvatarFigureContainer, IAvatarImageListener } from '@nitrots/api';
+import { GetConfiguration } from '@nitrots/configuration';
+import { AvatarRenderLibraryEvent, GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events';
+import { AvatarAssetDownloadLibrary } from './AvatarAssetDownloadLibrary';
+import { AvatarStructure } from './AvatarStructure';
+
+export class AvatarAssetDownloadManager
+{
+ private _assets: IAssetManager;
+ private _structure: AvatarStructure;
+
+ private _missingMandatoryLibs: string[] = [];
+ private _figureMap: Map = new Map();
+ private _figureListeners: Map = new Map();
+ private _incompleteFigures: Map = new Map();
+ private _currentDownloads: AvatarAssetDownloadLibrary[] = [];
+ private _libraryNames: string[] = [];
+
+ constructor(assets: IAssetManager, structure: AvatarStructure)
+ {
+ this._assets = assets;
+ this._structure = structure;
+ }
+
+ public async init(): Promise
+ {
+ this._missingMandatoryLibs = GetConfiguration().getValue('avatar.mandatory.libraries');
+
+ const url = GetConfiguration().getValue('avatar.figuremap.url');
+
+ if(!url || !url.length) throw new Error('Invalid figure map url');
+
+ const response = await fetch(url);
+
+ if(response.status !== 200) throw new Error('Invalid figure map file');
+
+ const responseData = await response.json();
+
+ this.processFigureMap(responseData.libraries);
+
+ GetEventDispatcher().addEventListener(NitroEventType.AVATAR_ASSET_DOWNLOADED, (event: AvatarRenderLibraryEvent) => this.onLibraryLoaded(event));
+
+ await this.processMissingLibraries();
+ }
+
+ private processFigureMap(data: any): void
+ {
+ if(!data) return;
+
+ const downloadUrl = GetConfiguration().getValue('avatar.asset.url');
+
+ for(const library of data)
+ {
+ if(!library) continue;
+
+ const libraryName = (library.id as string);
+ const revision = (library.revision || '');
+
+ if(this._libraryNames.indexOf(libraryName) >= 0) continue;
+
+ this._libraryNames.push(libraryName);
+
+ const downloadLibrary = new AvatarAssetDownloadLibrary(libraryName, revision, downloadUrl, this._assets);
+
+ for(const part of library.parts)
+ {
+ const id = (part.id as string);
+ const type = (part.type as string);
+ const partString = (type + ':' + id);
+
+ let existing = this._figureMap.get(partString);
+
+ if(!existing) existing = [];
+
+ existing.push(downloadLibrary);
+
+ this._figureMap.set(partString, existing);
+ }
+ }
+ }
+
+ private async processMissingLibraries(): Promise
+ {
+ const promises: Promise[] = [];
+
+ this._missingMandatoryLibs.forEach(value =>
+ {
+ const libraries = this._figureMap.get(value);
+
+ if(libraries) for(const library of libraries) promises.push(library.downloadAsset());
+ });
+
+ this._missingMandatoryLibs = [];
+
+ await Promise.all(promises);
+ }
+
+ private onLibraryLoaded(event: AvatarRenderLibraryEvent): void
+ {
+ if(!event || !event.library) return;
+
+ const loadedFigures: string[] = [];
+
+ for(const [figure, libraries] of this._incompleteFigures.entries())
+ {
+ let isReady = true;
+
+ for(const library of libraries)
+ {
+ if(!library || library.isLoaded) continue;
+
+ isReady = false;
+
+ break;
+ }
+
+ if(isReady)
+ {
+ loadedFigures.push(figure);
+
+ const listeners = this._figureListeners.get(figure);
+
+ if(listeners)
+ {
+ for(const listener of listeners)
+ {
+ if(!listener || listener.disposed) continue;
+
+ listener.resetFigure(figure);
+ }
+ }
+
+ this._figureListeners.delete(figure);
+
+ GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.AVATAR_ASSET_LOADED));
+ }
+ }
+
+ for(const figure of loadedFigures)
+ {
+ if(!figure) continue;
+
+ this._incompleteFigures.delete(figure);
+ }
+
+ let index = 0;
+
+ while(index < this._currentDownloads.length)
+ {
+ const download = this._currentDownloads[index];
+
+ if(download)
+ {
+ if(download.libraryName === event.library.libraryName) this._currentDownloads.splice(index, 1);
+ }
+
+ index++;
+ }
+ }
+
+ public isAvatarFigureContainerReady(container: IAvatarFigureContainer): boolean
+ {
+ return !this.getAvatarFigurePendingLibraries(container).length;
+ }
+
+ private getAvatarFigurePendingLibraries(container: IAvatarFigureContainer): AvatarAssetDownloadLibrary[]
+ {
+ const pendingLibraries: AvatarAssetDownloadLibrary[] = [];
+
+ if(!container || !this._structure) return pendingLibraries;
+
+ const figureData = this._structure.figureData;
+
+ if(!figureData) return pendingLibraries;
+
+ const setKeys = container.getPartTypeIds();
+
+ for(const key of setKeys)
+ {
+ const set = figureData.getSetType(key);
+
+ if(!set) continue;
+
+ const figurePartSet = set.getPartSet(container.getPartSetId(key));
+
+ if(!figurePartSet) continue;
+
+ for(const part of figurePartSet.parts)
+ {
+ if(!part) continue;
+
+ const name = (part.type + ':' + part.id);
+ const existing = this._figureMap.get(name);
+
+ if(existing === undefined) continue;
+
+ for(const library of existing)
+ {
+ if(!library || library.isLoaded) continue;
+
+ if(pendingLibraries.indexOf(library) >= 0) continue;
+
+ pendingLibraries.push(library);
+ }
+ }
+ }
+
+ return pendingLibraries;
+ }
+
+ public downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void
+ {
+ const figure = container.getFigureString();
+ const pendingLibraries = this.getAvatarFigurePendingLibraries(container);
+
+ if(pendingLibraries && pendingLibraries.length)
+ {
+ if(listener && !listener.disposed)
+ {
+ let listeners = this._figureListeners.get(figure);
+
+ if(!listeners)
+ {
+ listeners = [];
+
+ this._figureListeners.set(figure, listeners);
+ }
+
+ listeners.push(listener);
+ }
+
+ this._incompleteFigures.set(figure, pendingLibraries);
+
+ for(const library of pendingLibraries)
+ {
+ if(!library) continue;
+
+ library.downloadAsset();
+ }
+ }
+ else
+ {
+ if(listener && !listener.disposed) listener.resetFigure(figure);
+ }
+ }
+}
diff --git a/packages/avatar/src/AvatarFigureContainer.ts b/packages/avatar/src/AvatarFigureContainer.ts
new file mode 100644
index 0000000..7bfa63b
--- /dev/null
+++ b/packages/avatar/src/AvatarFigureContainer.ts
@@ -0,0 +1,116 @@
+import { IAvatarFigureContainer } from '@nitrots/api';
+
+export class AvatarFigureContainer implements IAvatarFigureContainer
+{
+ private _parts: Map>;
+
+ constructor(figure: string)
+ {
+ this._parts = new Map();
+
+ this.parseFigure(figure);
+ }
+
+ public getPartTypeIds(): IterableIterator
+ {
+ return this.partSets().keys();
+ }
+
+ public hasPartType(k: string): boolean
+ {
+ return !!this.partSets().get(k);
+ }
+
+ public getPartSetId(k: string): number
+ {
+ const existing = this.partSets().get(k);
+
+ if(!existing) return 0;
+
+ return existing.get('setid');
+ }
+
+ public getPartColorIds(k: string): number[]
+ {
+ const existing = this.partSets().get(k);
+
+ if(!existing) return null;
+
+ return existing.get('colorids');
+ }
+
+ public updatePart(setType: string, partSetId: number, colorIds: number[]): void
+ {
+ const set: Map = new Map();
+
+ set.set('type', setType);
+ set.set('setid', partSetId);
+ set.set('colorids', colorIds);
+
+ const existingSets = this.partSets();
+
+ existingSets.delete(setType);
+ existingSets.set(setType, set);
+ }
+
+ public removePart(k: string): void
+ {
+ this.partSets().delete(k);
+ }
+
+ public getFigureString(): string
+ {
+ const parts: string[] = [];
+
+ for(const key of this.partSets().keys())
+ {
+ if(!key) continue;
+
+ let setParts = [];
+
+ setParts.push(key);
+ setParts.push(this.getPartSetId(key));
+
+ setParts = setParts.concat(this.getPartColorIds(key));
+
+ parts.push(setParts.join('-'));
+ }
+
+ return parts.join('.');
+ }
+
+ private partSets(): Map>
+ {
+ if(!this._parts) this._parts = new Map();
+
+ return this._parts;
+ }
+
+ private parseFigure(figure: string): void
+ {
+ if(!figure) figure = '';
+
+ for(const part of figure.split('.'))
+ {
+ const pieces = part.split('-');
+
+ if(pieces.length >= 2)
+ {
+ const type = pieces[0];
+ const setId = parseInt(pieces[1]);
+ const colors = [];
+
+ let index = 2;
+
+ while(index < pieces.length)
+ {
+ colors.push(parseInt(pieces[index]));
+
+ index++;
+ }
+
+ this.updatePart(type, setId, colors);
+ }
+ }
+ }
+}
diff --git a/packages/avatar/src/AvatarImage.ts b/packages/avatar/src/AvatarImage.ts
new file mode 100644
index 0000000..f23bfd7
--- /dev/null
+++ b/packages/avatar/src/AvatarImage.ts
@@ -0,0 +1,764 @@
+import { AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActiveActionData, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IPartColor, ISpriteDataContainer } from '@nitrots/api';
+import { GetRenderer, GetTexturePool, GetTickerTime, PaletteMapFilter, TextureUtils } from '@nitrots/utils';
+import { ColorMatrixFilter, Container, RenderTexture, Sprite, Texture } from 'pixi.js';
+import { AvatarFigureContainer } from './AvatarFigureContainer';
+import { AvatarStructure } from './AvatarStructure';
+import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
+import { ActiveActionData } from './actions';
+import { AssetAliasCollection } from './alias';
+import { AvatarImageCache } from './cache';
+import { AvatarCanvas } from './structure';
+
+export class AvatarImage implements IAvatarImage, IAvatarEffectListener
+{
+ private static CHANNELS_EQUAL: string = 'CHANNELS_EQUAL';
+ private static CHANNELS_UNIQUE: string = 'CHANNELS_UNIQUE';
+ private static CHANNELS_RED: string = 'CHANNELS_RED';
+ private static CHANNELS_GREEN: string = 'CHANNELS_GREEN';
+ private static CHANNELS_BLUE: string = 'CHANNELS_BLUE';
+ private static CHANNELS_DESATURATED: string = 'CHANNELS_DESATURATED';
+ private static DEFAULT_ACTION: string = 'Default';
+ private static DEFAULT_DIRECTION: number = 2;
+ private static DEFAULT_AVATAR_SET: string = AvatarSetType.FULL;
+
+ protected _mainDirection: number;
+ protected _headDirection: number;
+ protected _mainAction: IActiveActionData;
+ protected _disposed: boolean = false;
+ protected _canvasOffsets: number[] = [];
+ protected _cache: AvatarImageCache;
+ protected _avatarSpriteData: IAvatarDataContainer;
+ protected _actions: ActiveActionData[] = [];
+ protected _activeTexture: Texture = null;
+
+ private _defaultAction: IActiveActionData = null;
+ private _frameCounter: number = 0;
+ private _directionOffset: number = 0;
+ private _changes: boolean = true;
+ private _sprites: ISpriteDataContainer[];
+ private _isAnimating: boolean = false;
+ private _animationHasResetOnToggle: boolean = false;
+ private _actionsSorted: boolean = false;
+ private _sortedActions: IActiveActionData[];
+ private _lastActionsString: string = null;
+ private _currentActionsString: string = null;
+ private _effectIdInUse: number = -1;
+ private _animationFrameCount: number = -1;
+ private _cachedBodyParts: string[] = [];
+ private _cachedBodyPartsDirection: number = -1;
+ private _cachedBodyPartsGeometryType: string = null;
+ private _cachedBodyPartsAvatarSet: string = null;
+
+ constructor(
+ private _structure: AvatarStructure,
+ private _assets: AssetAliasCollection,
+ private _figure: AvatarFigureContainer,
+ private _scale: string,
+ private _effectManager: EffectAssetDownloadManager,
+ private _effectListener: IAvatarEffectListener = null)
+ {
+ if(!this._figure) this._figure = new AvatarFigureContainer('hr-893-45.hd-180-2.ch-210-66.lg-270-82.sh-300-91.wa-2007-.ri-1-');
+ if(!this._scale) this._scale = AvatarScaleType.LARGE;
+
+ this._cache = new AvatarImageCache(this._structure, this, this._assets, this._scale);
+ this.setDirection(AvatarImage.DEFAULT_AVATAR_SET, AvatarImage.DEFAULT_DIRECTION);
+ this._defaultAction = new ActiveActionData(AvatarAction.POSTURE_STAND);
+ this._defaultAction.definition = this._structure.getActionDefinition(AvatarImage.DEFAULT_ACTION);
+ this.resetActions();
+ this._animationFrameCount = 0;
+ }
+
+ public dispose(): void
+ {
+ if(this._disposed) return;
+
+ this._structure = null;
+ this._assets = null;
+ this._mainAction = null;
+ this._figure = null;
+ this._avatarSpriteData = null;
+ this._actions = null;
+
+ if(this._activeTexture)
+ {
+ GetTexturePool().putTexture(this._activeTexture);
+
+ this._activeTexture = null;
+ }
+
+ if(this._cache)
+ {
+ this._cache.dispose();
+ this._cache = null;
+ }
+
+ this._canvasOffsets = null;
+ this._disposed = true;
+ }
+
+ public get disposed(): boolean
+ {
+ return this._disposed;
+ }
+
+ public getFigure(): IAvatarFigureContainer
+ {
+ return this._figure;
+ }
+
+ public getScale(): string
+ {
+ return this._scale;
+ }
+
+ public getPartColor(k: string): IPartColor
+ {
+ return this._structure.getPartColor(this._figure, k);
+ }
+
+ public setDirection(avatarPart: string, direction: number): void
+ {
+ direction += this._directionOffset;
+
+ if(direction < AvatarDirectionAngle.MIN_DIRECTION)
+ {
+ direction = AvatarDirectionAngle.MAX_DIRECTION + (direction + 1);
+ }
+ else if(direction > AvatarDirectionAngle.MAX_DIRECTION)
+ {
+ direction -= (AvatarDirectionAngle.MAX_DIRECTION + 1);
+ }
+
+ if(this._structure.isMainAvatarSet(avatarPart)) this._mainDirection = direction;
+
+ // Special handling for head direction, including prevention checks for turning
+ if(avatarPart === AvatarSetType.HEAD || avatarPart === AvatarSetType.FULL)
+ {
+ if(avatarPart === AvatarSetType.HEAD && this.isHeadTurnPreventedByAction()) direction = this._mainDirection;
+
+ this._headDirection = direction;
+ }
+
+ this._cache.setDirection(avatarPart, direction);
+ this._changes = true;
+ }
+
+ public setDirectionAngle(k: string, _arg_2: number): void
+ {
+ this.setDirection(k, Math.floor(_arg_2 / 45));
+ }
+
+ public getSprites(): ISpriteDataContainer[]
+ {
+ return this._sprites;
+ }
+
+ public getCanvasOffsets(): number[]
+ {
+ return this._canvasOffsets;
+ }
+
+ public getLayerData(k: ISpriteDataContainer): IAnimationLayerData
+ {
+ return this._structure.getBodyPartData(k.animation.id, this._frameCounter, k.id);
+ }
+
+ public updateAnimationByFrames(k: number = 1): void
+ {
+ this._frameCounter += k;
+ this._changes = true;
+ }
+
+ public resetAnimationFrameCounter(): void
+ {
+ this._frameCounter = 0;
+ this._changes = true;
+ }
+
+ private getBodyParts(avatarSet: string, geometryType: string, direction: number): string[]
+ {
+ const shouldUpdateCache = direction !== this._cachedBodyPartsDirection || geometryType !== this._cachedBodyPartsGeometryType || avatarSet !== this._cachedBodyPartsAvatarSet;
+
+ if(shouldUpdateCache)
+ {
+ this._cachedBodyPartsDirection = direction;
+ this._cachedBodyPartsGeometryType = geometryType;
+ this._cachedBodyPartsAvatarSet = avatarSet;
+
+ this._cachedBodyParts = this._structure.getBodyParts(avatarSet, geometryType, direction);
+ }
+
+ return this._cachedBodyParts;
+ }
+
+ private buildAvatarContainer(avatarCanvas: AvatarCanvas, setType: string): Container
+ {
+ const bodyParts = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection);
+ const container = new Container();
+
+ let partCount = (bodyParts.length - 1);
+
+ while(partCount >= 0)
+ {
+ const set = bodyParts[partCount];
+ const part = this._cache.getImageContainer(set, this._frameCounter);
+
+ if(part)
+ {
+ const partCacheContainer = part.image;
+
+ if(partCacheContainer)
+ {
+ const partContainer = new Container();
+
+ partContainer.addChild(partCacheContainer);
+
+ const point = part.regPoint.clone();
+
+ point.x += avatarCanvas.offset.x;
+ point.y += avatarCanvas.offset.y;
+
+ point.x += avatarCanvas.regPoint.x;
+ point.y += avatarCanvas.regPoint.y;
+
+ partContainer.position.set(point.x, point.y);
+
+ container.addChild(partContainer);
+ }
+ }
+
+ partCount--;
+ }
+
+ container.filters = [];
+
+ if(this._avatarSpriteData)
+ {
+ if(this._avatarSpriteData.colorTransform)
+ {
+ if(container.filters === undefined || container.filters === null) container.filters = [ this._avatarSpriteData.colorTransform ];
+ else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, this._avatarSpriteData.colorTransform ];
+ else container.filters = [ container.filters, this._avatarSpriteData.colorTransform ];
+ }
+
+ if(this._avatarSpriteData.paletteIsGrayscale)
+ {
+ this.convertToGrayscale(container);
+
+ const paletteMapFilter = new PaletteMapFilter({
+ palette: this._avatarSpriteData.reds,
+ channel: PaletteMapFilter.CHANNEL_RED
+ });
+
+ if(container.filters === undefined || container.filters === null) container.filters = [ paletteMapFilter ];
+ else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, paletteMapFilter ];
+ else container.filters = [ container.filters, paletteMapFilter ];
+ }
+ }
+
+ return container;
+ }
+
+ public processAsTexture(setType: string, hightlight: boolean): Texture
+ {
+ if(!this._changes) return this._activeTexture;
+
+ if(!this._mainAction) return null;
+
+ if(!this._actionsSorted) this.endActionAppends();
+
+ const avatarCanvas = this._structure.getCanvas(this._scale, this._mainAction.definition.geometryType);
+
+ if(!avatarCanvas) return null;
+
+ const container = this.buildAvatarContainer(avatarCanvas, setType);
+
+ if(this._activeTexture && ((this._activeTexture.width !== avatarCanvas.width) || (this._activeTexture.height !== avatarCanvas.height)))
+ {
+ GetTexturePool().putTexture(this._activeTexture);
+
+ this._activeTexture = null;
+ }
+
+ if(!this._activeTexture) this._activeTexture = GetTexturePool().getTexture(avatarCanvas.width, avatarCanvas.height);
+
+ if(!this._activeTexture) return null;
+
+ GetRenderer().render({
+ target: this._activeTexture,
+ container: container,
+ clear: true
+ });
+
+ container.destroy();
+
+ //@ts-ignore
+ this._activeTexture.source.hitMap = null;
+
+ this._changes = false;
+
+ return this._activeTexture;
+ }
+
+ public processAsImageUrl(setType: string, scale: number = 1): string
+ {
+ const texture = this.processAsTexture(setType, false);
+ const canvas = GetRenderer().texture.generateCanvas(texture);
+
+ const url = canvas.toDataURL('image/png');
+
+ return url;
+ }
+
+ public processAsContainer(setType: string): Container
+ {
+ if(!this._mainAction) return null;
+
+ if(!this._actionsSorted) this.endActionAppends();
+
+ const avatarCanvas = this._structure.getCanvas(this._scale, this._mainAction.definition.geometryType);
+
+ if(!avatarCanvas) return null;
+
+ return this.buildAvatarContainer(avatarCanvas, setType);
+ }
+
+ public applyPalette(texture: RenderTexture, reds: number[] = [], greens: number[] = [], blues: number[] = []): RenderTexture
+ {
+ const textureCanvas = TextureUtils.generateCanvas(texture);
+ const textureCtx = textureCanvas.getContext('2d');
+ const textureImageData = textureCtx.getImageData(0, 0, textureCanvas.width, textureCanvas.height);
+ const data = textureImageData.data;
+
+ for(let i = 0; i < data.length; i += 4)
+ {
+ if(reds.length == 256)
+ {
+ let paletteColor = reds[data[i]];
+ if(paletteColor === undefined) paletteColor = 0;
+
+ data[i] = ((paletteColor >> 16) & 0xFF);
+ data[i + 1] = ((paletteColor >> 8) & 0xFF);
+ data[i + 2] = (paletteColor & 0xFF);
+ }
+
+ if(greens.length == 256)
+ {
+ let paletteColor = greens[data[i + 1]];
+ if(paletteColor === undefined) paletteColor = 0;
+
+ data[i] = ((paletteColor >> 16) & 0xFF);
+ data[i + 1] = ((paletteColor >> 8) & 0xFF);
+ data[i + 2] = (paletteColor & 0xFF);
+ }
+ if(blues.length == 256)
+ {
+ let paletteColor = greens[data[i + 2]];
+ if(paletteColor === undefined) paletteColor = 0;
+
+ data[i] = ((paletteColor >> 16) & 0xFF);
+ data[i + 1] = ((paletteColor >> 8) & 0xFF);
+ data[i + 2] = (paletteColor & 0xFF);
+ }
+ }
+
+ textureCtx.putImageData(textureImageData, 0, 0);
+
+ const newTexture = new Sprite(Texture.from(textureCanvas));
+
+ TextureUtils.writeToTexture(newTexture, texture, true);
+
+ return texture;
+ }
+
+ public getDirection(): number
+ {
+ return this._mainDirection;
+ }
+
+ public initActionAppends(): void
+ {
+ this._actions = [];
+ this._actionsSorted = false;
+ this._currentActionsString = '';
+ }
+
+ public endActionAppends(): void
+ {
+ if(!this.sortActions()) return;
+
+ for(const k of this._sortedActions)
+ {
+ if(k.actionType === AvatarAction.EFFECT)
+ {
+ if(!this._effectManager.isAvatarEffectReady(parseInt(k.actionParameter))) this._effectManager.downloadAvatarEffect(parseInt(k.actionParameter), this);
+ }
+ }
+
+ this.resetActions();
+ this.setActionsToParts();
+ }
+
+ public appendAction(k: string, ..._args: any[]): boolean
+ {
+ let _local_3 = '';
+
+ this._actionsSorted = false;
+
+ if(_args && (_args.length > 0)) _local_3 = _args[0];
+
+ if((_local_3 !== undefined) && (_local_3 !== null)) _local_3 = _local_3.toString();
+
+ switch(k)
+ {
+ case AvatarAction.POSTURE:
+ switch(_local_3)
+ {
+ case AvatarAction.POSTURE_LAY:
+ case AvatarAction.POSTURE_WALK:
+ case AvatarAction.POSTURE_STAND:
+ case AvatarAction.POSTURE_SWIM:
+ case AvatarAction.POSTURE_FLOAT:
+ case AvatarAction.POSTURE_SIT:
+ case AvatarAction.SNOWWAR_RUN:
+ case AvatarAction.SNOWWAR_DIE_FRONT:
+ case AvatarAction.SNOWWAR_DIE_BACK:
+ case AvatarAction.SNOWWAR_PICK:
+ case AvatarAction.SNOWWAR_THROW:
+ if((_local_3 === AvatarAction.POSTURE_LAY) || (_local_3 === AvatarAction.POSTURE_LAY) || (_local_3 === AvatarAction.POSTURE_LAY))
+ {
+ if(_local_3 === AvatarAction.POSTURE_LAY)
+ {
+ if(this._mainDirection == 0)
+ {
+ this.setDirection(AvatarSetType.FULL, 4);
+ }
+ else
+ {
+ this.setDirection(AvatarSetType.FULL, 2);
+ }
+ }
+ }
+
+ this.addActionData(_local_3);
+ break;
+ }
+ break;
+ case AvatarAction.GESTURE:
+ switch(_local_3)
+ {
+ case AvatarAction.GESTURE_AGGRAVATED:
+ case AvatarAction.GESTURE_SAD:
+ case AvatarAction.GESTURE_SMILE:
+ case AvatarAction.GESTURE_SURPRISED:
+ this.addActionData(_local_3);
+ break;
+ }
+ break;
+ case AvatarAction.EFFECT:
+ case AvatarAction.DANCE:
+ case AvatarAction.TALK:
+ case AvatarAction.EXPRESSION_WAVE:
+ case AvatarAction.SLEEP:
+ case AvatarAction.SIGN:
+ case AvatarAction.EXPRESSION_RESPECT:
+ case AvatarAction.EXPRESSION_BLOW_A_KISS:
+ case AvatarAction.EXPRESSION_LAUGH:
+ case AvatarAction.EXPRESSION_CRY:
+ case AvatarAction.EXPRESSION_IDLE:
+ case AvatarAction.EXPRESSION_SNOWBOARD_OLLIE:
+ case AvatarAction.EXPRESSION_SNOWBORD_360:
+ case AvatarAction.EXPRESSION_RIDE_JUMP:
+ if(_local_3 === AvatarAction.EFFECT)
+ {
+ if((((((_local_3 === '33') || (_local_3 === '34')) || (_local_3 === '35')) || (_local_3 === '36')) || (_local_3 === '38')) || (_local_3 === '39'))
+ {
+ //
+ }
+ }
+
+ this.addActionData(k, _local_3);
+ break;
+ case AvatarAction.CARRY_OBJECT:
+ case AvatarAction.USE_OBJECT: {
+ const _local_4 = this._structure.getActionDefinitionWithState(k);
+ if(_local_4) _local_3 = _local_4.getParameterValue(_local_3);
+ this.addActionData(k, _local_3);
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ protected addActionData(actionType: string, actionParameter: string = ''): void
+ {
+ if(!this._actions) this._actions = [];
+
+ const actionExists = this._actions.some(action =>
+ action.actionType === actionType && action.actionParameter === actionParameter
+ );
+
+ if(!actionExists) this._actions.push(new ActiveActionData(actionType, actionParameter, this._frameCounter));
+ }
+
+ public isAnimating(): boolean
+ {
+ return (this._isAnimating) || (this._animationFrameCount > 1);
+ }
+
+ private resetActions(): boolean
+ {
+ this._animationHasResetOnToggle = false;
+ this._isAnimating = false;
+ this._sprites = [];
+ this._avatarSpriteData = null;
+ this._directionOffset = 0;
+ this._structure.removeDynamicItems(this);
+ this._mainAction = this._defaultAction;
+ this._mainAction.definition = this._defaultAction.definition;
+ this.resetBodyPartCache(this._defaultAction);
+ return true;
+ }
+
+ private isHeadTurnPreventedByAction(): boolean
+ {
+ if(!this._sortedActions) return false;
+
+ for(const action of this._sortedActions)
+ {
+ const actionDefinition = this._structure.getActionDefinitionWithState(action.actionType);
+
+ if(actionDefinition != null && actionDefinition.getPreventHeadTurn(action.actionParameter)) return true;
+ }
+
+ return false;
+ }
+
+ private sortActions(): boolean
+ {
+ let hasChanges = false;
+ let hasEffectAction = false;
+ let effectChanged = false;
+
+ this._currentActionsString = '';
+ this._sortedActions = this._structure.sortActions(this._actions);
+ this._animationFrameCount = this._structure.maxFrames(this._sortedActions);
+
+ if(!this._sortedActions)
+ {
+ this._canvasOffsets = [0, 0, 0];
+
+ if(this._lastActionsString !== '')
+ {
+ hasChanges = true;
+
+ this._lastActionsString = '';
+ }
+ }
+ else
+ {
+ this._canvasOffsets = this._structure.getCanvasOffsets(this._sortedActions, this._scale, this._mainDirection);
+
+ for(const action of this._sortedActions)
+ {
+ this._currentActionsString += action.actionType + action.actionParameter;
+
+ if(action.actionType === AvatarAction.EFFECT)
+ {
+ const effectId = parseInt(action.actionParameter);
+
+ if(this._effectIdInUse !== effectId) effectChanged = true;
+
+ this._effectIdInUse = effectId;
+
+ hasEffectAction = true;
+ }
+ }
+
+ if(!hasEffectAction)
+ {
+ if(this._effectIdInUse > -1) effectChanged = true;
+
+ this._effectIdInUse = -1;
+ }
+
+ if(effectChanged) this._cache.disposeInactiveActions();
+
+ if(this._lastActionsString != this._currentActionsString)
+ {
+ hasChanges = true;
+
+ this._lastActionsString = this._currentActionsString;
+ }
+ }
+
+ this._actionsSorted = true;
+
+ return hasChanges;
+ }
+
+ private setActionsToParts(): void
+ {
+ if(!this._sortedActions) return;
+
+ const currentTime = GetTickerTime();
+ const actionTypes: string[] = [];
+
+ for(const action of this._sortedActions) actionTypes.push(action.actionType);
+
+ for(const action of this._sortedActions)
+ {
+ if(action && action.definition && action.definition.isAnimation)
+ {
+ const animation = this._structure.getAnimation(`${action.definition.state}.${action.actionParameter}`);
+
+ if(animation && animation.hasOverriddenActions())
+ {
+ const overriddenActionNames = animation.overriddenActionNames();
+
+ if(overriddenActionNames)
+ {
+ for(const overriddenActionName of overriddenActionNames)
+ {
+ if(actionTypes.includes(overriddenActionName)) action.overridingAction = animation.overridingAction(overriddenActionName);
+ }
+ }
+ }
+
+ if(animation && animation.resetOnToggle) this._animationHasResetOnToggle = true;
+ }
+ }
+
+ for(const action of this._sortedActions)
+ {
+ if(action && action.definition)
+ {
+ if(action.definition.isAnimation && action.actionParameter === '') action.actionParameter = '1';
+
+ this.setActionToParts(action, currentTime);
+
+ if(action.definition.isAnimation)
+ {
+ this._isAnimating = action.definition.isAnimated(action.actionParameter);
+
+ const animation = this._structure.getAnimation(`${action.definition.state}.${action.actionParameter}`);
+
+ if(animation)
+ {
+ this._sprites = [...this._sprites, ...animation.spriteData];
+
+ if(animation.hasDirectionData()) this._directionOffset = animation.directionData.offset;
+
+ if(animation.hasAvatarData()) this._avatarSpriteData = animation.avatarData;
+ }
+ }
+ }
+ }
+ }
+
+ private setActionToParts(action: IActiveActionData, currentTime: number): void
+ {
+ if(!action || !action.definition || action.definition.assetPartDefinition === '') return;
+
+ if(action.definition.isMain)
+ {
+ this._mainAction = action;
+ this._cache.setGeometryType(action.definition.geometryType);
+ }
+
+ this._cache.setAction(action, currentTime);
+
+ this._changes = true;
+ }
+
+ private resetBodyPartCache(action: IActiveActionData): void
+ {
+ if(!action || action.definition.assetPartDefinition === '') return;
+
+ if(action.definition.isMain)
+ {
+ this._mainAction = action;
+ this._cache.setGeometryType(action.definition.geometryType);
+ }
+
+ this._cache.resetBodyPartCache(action);
+
+ this._changes = true;
+ }
+
+ private convertToGrayscale(container: Container, channel: string = 'CHANNELS_EQUAL'): Container
+ {
+ let redWeight = 0.33;
+ let greenWeight = 0.33;
+ let blueWeight = 0.33;
+
+ switch(channel)
+ {
+ case AvatarImage.CHANNELS_UNIQUE:
+ redWeight = 0.3;
+ greenWeight = 0.59;
+ blueWeight = 0.11;
+ break;
+ case AvatarImage.CHANNELS_RED:
+ redWeight = 1;
+ greenWeight = 0;
+ blueWeight = 0;
+ break;
+ case AvatarImage.CHANNELS_GREEN:
+ redWeight = 0;
+ greenWeight = 1;
+ blueWeight = 0;
+ break;
+ case AvatarImage.CHANNELS_BLUE:
+ redWeight = 0;
+ greenWeight = 0;
+ blueWeight = 1;
+ break;
+ case AvatarImage.CHANNELS_DESATURATED:
+ redWeight = 0.3086;
+ greenWeight = 0.6094;
+ blueWeight = 0.082;
+ break;
+ }
+
+ const filter = new ColorMatrixFilter();
+
+ filter.matrix = [
+ redWeight, greenWeight, blueWeight, 0, 0, // Red channel
+ redWeight, greenWeight, blueWeight, 0, 0, // Green channel
+ redWeight, greenWeight, blueWeight, 0, 0, // Blue channel
+ 0, 0, 0, 1, 0 // Alpha channel
+ ];
+
+ if(container.filters === undefined || container.filters === null) container.filters = [ filter ];
+ else if(Array.isArray(container.filters)) container.filters = [ ...container.filters, filter ];
+ else container.filters = [ container.filters, filter ];
+
+ return container;
+ }
+
+ public isPlaceholder(): boolean
+ {
+ return false;
+ }
+
+ public get animationHasResetOnToggle(): boolean
+ {
+ return this._animationHasResetOnToggle;
+ }
+
+ public resetEffect(effect: number): void
+ {
+ if(effect === this._effectIdInUse)
+ {
+ this.resetActions();
+ this.setActionsToParts();
+
+ this._animationHasResetOnToggle = true;
+ this._changes = true;
+
+ if(this._effectListener) this._effectListener.resetEffect(effect);
+ }
+ }
+}
diff --git a/packages/avatar/src/AvatarImageBodyPartContainer.ts b/packages/avatar/src/AvatarImageBodyPartContainer.ts
new file mode 100644
index 0000000..605ac12
--- /dev/null
+++ b/packages/avatar/src/AvatarImageBodyPartContainer.ts
@@ -0,0 +1,88 @@
+import { Container, Point } from 'pixi.js';
+
+export class AvatarImageBodyPartContainer
+{
+ private _image: Container;
+ private _regPoint: Point;
+ private _offset: Point;
+ private _isCacheable: boolean;
+
+ constructor(k: Container, _arg_2: Point, _arg_3: boolean)
+ {
+ this._image = k;
+ this._regPoint = _arg_2;
+ this._offset = new Point(0, 0);
+ this._regPoint = _arg_2;
+ this._isCacheable = _arg_3;
+
+ this.cleanPoints();
+ }
+
+ public dispose(): void
+ {
+ if(this._image)
+ {
+ this._image.destroy({
+ children: true
+ });
+ }
+
+ this._image = null;
+ this._regPoint = null;
+ this._offset = null;
+ }
+
+ private cleanPoints(): void
+ {
+ // this._regPoint.x = this._regPoint.x;
+ // this._regPoint.y = this._regPoint.y;
+ // this._offset.x = this._offset.x;
+ // this._offset.y = this._offset.y;
+ }
+
+ public setRegPoint(k: Point): void
+ {
+ this._regPoint = k;
+
+ this.cleanPoints();
+ }
+
+ public get image(): Container
+ {
+ return this._image;
+ }
+
+ public set image(k: Container)
+ {
+ if(this._image && (this._image !== k))
+ {
+ this._image.destroy({
+ children: true
+ });
+ }
+
+ this._image = k;
+ }
+
+ public get regPoint(): Point
+ {
+ const clone = this._regPoint.clone();
+
+ clone.x += this._offset.x;
+ clone.y += this._offset.y;
+
+ return clone;
+ }
+
+ public set offset(k: Point)
+ {
+ this._offset = k;
+
+ this.cleanPoints();
+ }
+
+ public get isCacheable(): boolean
+ {
+ return this._isCacheable;
+ }
+}
diff --git a/packages/avatar/src/AvatarImagePartContainer.ts b/packages/avatar/src/AvatarImagePartContainer.ts
new file mode 100644
index 0000000..d891543
--- /dev/null
+++ b/packages/avatar/src/AvatarImagePartContainer.ts
@@ -0,0 +1,133 @@
+import { IActionDefinition, IPartColor } from '@nitrots/api';
+import { AvatarAnimationFrame } from './structure';
+
+export class AvatarImagePartContainer
+{
+ private _bodyPartId: string;
+ private _partType: string;
+ private _flippedPartType: string;
+ private _partId: string;
+ private _color: IPartColor;
+ private _frames: AvatarAnimationFrame[];
+ private _action: IActionDefinition;
+ private _isColorable: boolean;
+ private _isBlendable: boolean;
+ private _paletteMapId: number;
+
+ constructor(bodyPartId: string, partType: string, partId: string, partColor: IPartColor, frames: AvatarAnimationFrame[], action: IActionDefinition, isColorable: boolean, paletteMapId: number, flippedPartType: string = '', isBlendable: boolean = false, _arg_11: number = 1)
+ {
+ this._bodyPartId = bodyPartId;
+ this._partType = partType;
+ this._partId = partId;
+ this._color = partColor;
+ this._frames = frames;
+ this._action = action;
+ this._isColorable = isColorable;
+ this._paletteMapId = paletteMapId;
+ this._flippedPartType = flippedPartType;
+ this._isBlendable = isBlendable;
+
+ if(this._partType === 'ey') this._isColorable = false;
+ }
+
+ public getFrameIndex(k: number): number
+ {
+ if(!this._frames || !this._frames.length) return 0;
+
+ const frameNumber = (k % this._frames.length);
+
+ if(this._frames[frameNumber] instanceof AvatarAnimationFrame)
+ {
+ return this._frames[frameNumber].number;
+ }
+
+ return frameNumber;
+ }
+
+ public getFrameDefinition(k: number): AvatarAnimationFrame
+ {
+ const frameNumber = (k % this._frames.length);
+
+ if(this._frames && (this._frames.length > frameNumber))
+ {
+ if(this._frames[frameNumber] instanceof AvatarAnimationFrame)
+ {
+ return this._frames[frameNumber];
+ }
+ }
+
+ return null;
+ }
+
+ public getCacheableKey(k: number): string
+ {
+ const frameNumber = (k % this._frames.length);
+
+ if(this._frames && (this._frames.length > frameNumber))
+ {
+ if(this._frames[frameNumber] instanceof AvatarAnimationFrame)
+ {
+ const frame = this._frames[frameNumber];
+
+ return (this.partId + ':' + frame.assetPartDefinition + ':' + frame.number);
+ }
+ }
+
+ return (this.partId + ':' + frameNumber);
+ }
+
+ public get bodyPartId(): string
+ {
+ return this._bodyPartId;
+ }
+
+ public get partType(): string
+ {
+ return this._partType;
+ }
+
+ public get partId(): string
+ {
+ return this._partId;
+ }
+
+ public get color(): IPartColor
+ {
+ return this._color;
+ }
+
+ public get action(): IActionDefinition
+ {
+ return this._action;
+ }
+
+ public get isColorable(): boolean
+ {
+ return this._isColorable;
+ }
+
+ public set isColorable(k: boolean)
+ {
+ this._isColorable = k;
+ }
+
+ public get paletteMapId(): number
+ {
+ return this._paletteMapId;
+ }
+
+ public get flippedPartType(): string
+ {
+ return this._flippedPartType;
+ }
+
+ public get isBlendable(): boolean
+ {
+ return this._isBlendable;
+ }
+
+ public toString(): string
+ {
+ return [this._bodyPartId, this._partType, this._partId].join(':');
+ }
+}
diff --git a/packages/avatar/src/AvatarRenderManager.ts b/packages/avatar/src/AvatarRenderManager.ts
new file mode 100644
index 0000000..8c3d9e7
--- /dev/null
+++ b/packages/avatar/src/AvatarRenderManager.ts
@@ -0,0 +1,292 @@
+import { AvatarSetType, IAssetManager, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IAvatarImageListener, IAvatarRenderManager, IFigureData, IFigurePartSet, IGraphicAsset, IStructureData } from '@nitrots/api';
+import { GetAssetManager } from '@nitrots/assets';
+import { GetConfiguration } from '@nitrots/configuration';
+import { GetEventDispatcher, NitroEventType } from '@nitrots/events';
+import { AvatarAssetDownloadManager } from './AvatarAssetDownloadManager';
+import { AvatarFigureContainer } from './AvatarFigureContainer';
+import { AvatarImage } from './AvatarImage';
+import { AvatarStructure } from './AvatarStructure';
+import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
+import { FigureDataContainer } from './FigureDataContainer';
+import { PlaceHolderAvatarImage } from './PlaceHolderAvatarImage';
+import { AssetAliasCollection } from './alias';
+import { HabboAvatarAnimations } from './data/HabboAvatarAnimations';
+import { HabboAvatarGeometry } from './data/HabboAvatarGeometry';
+import { HabboAvatarPartSets } from './data/HabboAvatarPartSets';
+
+export class AvatarRenderManager implements IAvatarRenderManager
+{
+ private static DEFAULT_FIGURE: string = 'hd-99999-99999';
+
+ private _structure: AvatarStructure = new AvatarStructure(this);
+ private _aliasCollection: AssetAliasCollection = new AssetAliasCollection(this, GetAssetManager());
+ private _avatarAssetDownloadManager: AvatarAssetDownloadManager = new AvatarAssetDownloadManager(GetAssetManager(), this._structure);
+ private _effectAssetDownloadManager: EffectAssetDownloadManager = new EffectAssetDownloadManager(GetAssetManager(), this._structure);
+
+ private _placeHolderFigure: AvatarFigureContainer = new AvatarFigureContainer(AvatarRenderManager.DEFAULT_FIGURE);
+
+ public async init(): Promise
+ {
+ this._structure?.initGeometry(HabboAvatarGeometry.geometry);
+ this._structure?.initPartSets(HabboAvatarPartSets.partSets);
+
+ await this.loadActions();
+
+ this._structure?.initAnimation(HabboAvatarAnimations.animations);
+ await this.loadFigureData();
+
+ this._aliasCollection.init();
+
+ GetEventDispatcher().addEventListener(NitroEventType.AVATAR_ASSET_LOADED, () => this._aliasCollection.reset());
+ GetEventDispatcher().addEventListener(NitroEventType.AVATAR_EFFECT_LOADED, () => this._aliasCollection.reset());
+
+ await this._avatarAssetDownloadManager.init();
+ await this._effectAssetDownloadManager.init();
+ }
+
+ private async loadActions(): Promise
+ {
+ const defaultActions = GetConfiguration().getValue('avatar.default.actions');
+
+ if(defaultActions) this._structure.initActions(GetAssetManager(), defaultActions);
+
+ const url = GetConfiguration().getValue('avatar.actions.url');
+
+ if(!url || !url.length) throw new Error('Invalid avatar action url');
+
+ const response = await fetch(url);
+
+ if(response.status !== 200) throw new Error('Invalid avatar action file');
+
+ this._structure.updateActions(await response.json());
+ }
+
+ private async loadFigureData(): Promise
+ {
+ const defaultFigureData = GetConfiguration().getValue('avatar.default.figuredata');
+
+ if(defaultFigureData) this._structure?.initFigureData(defaultFigureData);
+
+ const url = GetConfiguration().getValue('avatar.figuredata.url');
+
+ if(!url || !url.length) throw new Error('Invalid figure data url');
+
+ const response = await fetch(url);
+
+ if(response.status !== 200) throw new Error('Invalid figure data file');
+
+ this._structure.figureData.appendJSON(await response.json());
+
+ this._structure.init();
+ }
+
+ public createFigureContainer(figure: string): IAvatarFigureContainer
+ {
+ return new AvatarFigureContainer(figure);
+ }
+
+ public isFigureContainerReady(container: IAvatarFigureContainer): boolean
+ {
+ if(!this._avatarAssetDownloadManager) return false;
+
+ return this._avatarAssetDownloadManager.isAvatarFigureContainerReady(container);
+ }
+
+ public createAvatarImage(figure: string, size: string, gender: string, listener: IAvatarImageListener = null, effectListener: IAvatarEffectListener = null): IAvatarImage
+ {
+ if(!this._structure || !this._avatarAssetDownloadManager) return null;
+
+ const figureContainer = new AvatarFigureContainer(figure);
+
+ if(gender) this.validateAvatarFigure(figureContainer, gender);
+
+ if(this._avatarAssetDownloadManager.isAvatarFigureContainerReady(figureContainer))
+ {
+ return new AvatarImage(this._structure, this._aliasCollection, figureContainer, size, this._effectAssetDownloadManager, effectListener);
+ }
+
+ this._avatarAssetDownloadManager.downloadAvatarFigure(figureContainer, listener);
+
+ return new PlaceHolderAvatarImage(this._structure, this._aliasCollection, this._placeHolderFigure, size, this._effectAssetDownloadManager);
+ }
+
+ public downloadAvatarFigure(container: IAvatarFigureContainer, listener: IAvatarImageListener): void
+ {
+ if(!this._avatarAssetDownloadManager) return;
+
+ this._avatarAssetDownloadManager.downloadAvatarFigure(container, listener);
+ }
+
+ private validateAvatarFigure(container: AvatarFigureContainer, gender: string): boolean
+ {
+ let isValid = false;
+
+ const typeIds = this._structure.getMandatorySetTypeIds(gender, 2);
+
+ if(typeIds)
+ {
+ const figureData = this._structure.figureData;
+
+ for(const id of typeIds)
+ {
+ if(!container.hasPartType(id))
+ {
+ const figurePartSet = this._structure.getDefaultPartSet(id, gender);
+
+ if(figurePartSet)
+ {
+ container.updatePart(id, figurePartSet.id, [0]);
+
+ isValid = true;
+ }
+ }
+ else
+ {
+ const setType = figureData.getSetType(id);
+
+ if(setType)
+ {
+ const figurePartSet = setType.getPartSet(container.getPartSetId(id));
+
+ if(!figurePartSet)
+ {
+ const partSet = this._structure.getDefaultPartSet(id, gender);
+
+ if(partSet)
+ {
+ container.updatePart(id, partSet.id, [0]);
+
+ isValid = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return !(isValid);
+ }
+
+ public getFigureClubLevel(container: IAvatarFigureContainer, gender: string, searchParts: string[] = null): number
+ {
+ if(!this._structure) return 0;
+
+ const figureData = this._structure.figureData;
+ const parts = Array.from(container.getPartTypeIds());
+
+ let clubLevel = 0;
+
+ for(const part of parts)
+ {
+ const set = figureData.getSetType(part);
+
+ if(!set) continue;
+
+ const setId = container.getPartSetId(part);
+ const partSet = set.getPartSet(setId);
+
+ if(partSet)
+ {
+ clubLevel = Math.max(partSet.clubLevel, clubLevel);
+
+ const palette = figureData.getPalette(set.paletteID);
+ const colors = container.getPartColorIds(part);
+
+ for(const colorId of colors)
+ {
+ const color = palette.getColor(colorId);
+
+ if(!color) continue;
+
+ clubLevel = Math.max(color.clubLevel, clubLevel);
+ }
+ }
+ }
+
+ if(!searchParts) searchParts = this._structure.getBodyPartsUnordered(AvatarSetType.FULL);
+
+ for(const part of searchParts)
+ {
+ const set = figureData.getSetType(part);
+
+ if(!set) continue;
+
+ if(parts.indexOf(part) === -1) clubLevel = Math.max(set.optionalFromClubLevel(gender), clubLevel);
+ }
+
+ return clubLevel;
+ }
+
+ public isValidFigureSetForGender(setId: number, gender: string): boolean
+ {
+ const structure = this.structureData;
+ const partSet = structure.getFigurePartSet(setId);
+
+ return !!(partSet && ((partSet.gender.toUpperCase() === 'U') || (partSet.gender.toUpperCase() === gender.toUpperCase())));
+ }
+
+ public getFigureStringWithFigureIds(figure: string, gender: string, _arg_3: number[]): string
+ {
+ const container = new FigureDataContainer();
+
+ container.loadAvatarData(figure, gender);
+
+ const partSets: IFigurePartSet[] = this.resolveFigureSets(_arg_3);
+
+ for(const partSet of partSets)
+ {
+ container.savePartData(partSet.type, partSet.id, container.getColourIds(partSet.type));
+ }
+
+ return container.getFigureString();
+ }
+
+ private resolveFigureSets(setIds: number[]): IFigurePartSet[]
+ {
+ const structure = this.structureData;
+ const partSets: IFigurePartSet[] = [];
+
+ for(const setId of setIds)
+ {
+ const partSet = structure.getFigurePartSet(setId);
+
+ if(partSet) partSets.push(partSet);
+ }
+
+ return partSets;
+ }
+
+ public getMandatoryAvatarPartSetIds(k: string, _arg_2: number): string[]
+ {
+ if(!this._structure) return null;
+
+ return this._structure.getMandatorySetTypeIds(k, _arg_2);
+ }
+
+ public getAssetByName(name: string): IGraphicAsset
+ {
+ return this._aliasCollection.getAsset(name);
+ }
+
+ public get assets(): IAssetManager
+ {
+ return GetAssetManager();
+ }
+
+ public get structure(): AvatarStructure
+ {
+ return this._structure;
+ }
+
+ public get structureData(): IStructureData
+ {
+ if(this._structure) return this._structure.figureData;
+
+ return null;
+ }
+
+ public get downloadManager(): AvatarAssetDownloadManager
+ {
+ return this._avatarAssetDownloadManager;
+ }
+}
diff --git a/packages/avatar/src/AvatarStructure.ts b/packages/avatar/src/AvatarStructure.ts
new file mode 100644
index 0000000..4d841d4
--- /dev/null
+++ b/packages/avatar/src/AvatarStructure.ts
@@ -0,0 +1,619 @@
+import { AvatarDirectionAngle, IActionDefinition, IActiveActionData, IAssetAnimation, IAssetManager, IAvatarFigureContainer, IAvatarImage, IAvatarRenderManager, IFigureData, IFigurePartSet, IPartColor, IStructureData } from '@nitrots/api';
+import { Point } from 'pixi.js';
+import { AvatarImagePartContainer } from './AvatarImagePartContainer';
+import { AvatarRenderManager } from './AvatarRenderManager';
+import { ActionDefinition, AvatarActionManager } from './actions';
+import { Animation, AnimationManager, AvatarAnimationLayerData } from './animation';
+import { AvatarModelGeometry } from './geometry';
+import { AnimationAction, AvatarAnimationData, AvatarAnimationFrame, AvatarCanvas, FigureSetData, PartSetsData } from './structure';
+
+export class AvatarStructure
+{
+ private _renderManager: AvatarRenderManager;
+ private _geometry: AvatarModelGeometry;
+ private _figureData: FigureSetData;
+ private _partSetsData: PartSetsData;
+ private _animationData: AvatarAnimationData;
+ private _animationManager: AnimationManager;
+ private _mandatorySetTypeIds: { [index: string]: { [index: number]: string[] } };
+ private _actionManager: AvatarActionManager;
+ private _defaultAction: IActionDefinition;
+
+ constructor(renderManager: AvatarRenderManager)
+ {
+ this._renderManager = renderManager;
+ this._geometry = null;
+ this._figureData = new FigureSetData();
+ this._partSetsData = new PartSetsData();
+ this._animationData = new AvatarAnimationData();
+ this._animationManager = new AnimationManager();
+ this._mandatorySetTypeIds = {};
+ this._actionManager = null;
+ this._defaultAction = null;
+ }
+
+ public init(): void
+ {
+
+ }
+
+ public initGeometry(k: any): void
+ {
+ if(!k) return;
+
+ this._geometry = new AvatarModelGeometry(k);
+ }
+
+ public initActions(k: IAssetManager, _arg_2: any): void
+ {
+ if(!_arg_2) return;
+
+ this._actionManager = new AvatarActionManager(k, _arg_2);
+ this._defaultAction = this._actionManager.getDefaultAction();
+ }
+
+ public updateActions(data: any): void
+ {
+ this._actionManager.updateActions(data);
+
+ this._defaultAction = this._actionManager.getDefaultAction();
+ }
+
+ public initPartSets(k: any): boolean
+ {
+ if(!k) return false;
+
+ if(this._partSetsData.parse(k))
+ {
+ this._partSetsData.getPartDefinition('ri').appendToFigure = true;
+ this._partSetsData.getPartDefinition('li').appendToFigure = true;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public initAnimation(k: any): boolean
+ {
+ if(!k) return false;
+
+ return this._animationData.parse(k);
+ }
+
+ public initFigureData(k: IFigureData): boolean
+ {
+ if(!k) return false;
+
+ return this._figureData.parse(k);
+ }
+
+ public injectFigureData(data: IFigureData): void
+ {
+ this._figureData.injectJSON(data);
+ }
+
+ public registerAnimations(k: IAssetManager, _arg_2: string = 'fx', _arg_3: number = 200): void
+ {
+ let index = 0;
+
+ while(index < _arg_3)
+ {
+ const collection = k.getCollection((_arg_2 + index));
+
+ if(collection)
+ {
+ const animationData = collection.data;
+
+ this._animationManager.registerAnimation(this, animationData.animations);
+ }
+
+ index++;
+ }
+ }
+
+ public registerAnimation(data: { [index: string]: IAssetAnimation }): void
+ {
+ this._animationManager.registerAnimation(this, data);
+ }
+
+ public getPartColor(k: IAvatarFigureContainer, _arg_2: string, _arg_3: number = 0): IPartColor
+ {
+ const _local_4 = k.getPartColorIds(_arg_2);
+
+ if((!(_local_4)) || (_local_4.length < _arg_3)) return null;
+
+ const _local_5 = this._figureData.getSetType(_arg_2);
+
+ if(_local_5 == null) return null;
+
+ const _local_6 = this._figureData.getPalette(_local_5.paletteID);
+
+ if(!_local_6) return null;
+
+ return _local_6.getColor(_local_4[_arg_3]);
+ }
+
+ public getBodyPartData(animation: string, frameCount: number, spriteId: string): AvatarAnimationLayerData
+ {
+ return this._animationManager.getLayerData(animation, frameCount, spriteId) as AvatarAnimationLayerData;
+ }
+
+ public getAnimation(k: string): Animation
+ {
+ return this._animationManager.getAnimation(k) as Animation;
+ }
+
+ public getActionDefinition(k: string): ActionDefinition
+ {
+ return this._actionManager.getActionDefinition(k);
+ }
+
+ public getActionDefinitionWithState(k: string): ActionDefinition
+ {
+ return this._actionManager.getActionDefinitionWithState(k);
+ }
+
+ public isMainAvatarSet(k: string): boolean
+ {
+ return this._geometry.isMainAvatarSet(k);
+ }
+
+ public sortActions(k: IActiveActionData[]): IActiveActionData[]
+ {
+ return this._actionManager.sortActions(k);
+ }
+
+ public maxFrames(k: IActiveActionData[]): number
+ {
+ let _local_2 = 0;
+
+ for(const _local_3 of k)
+ {
+ _local_2 = Math.max(_local_2, this._animationData.getFrameCount(_local_3.definition));
+ }
+ return _local_2;
+ }
+
+ public getMandatorySetTypeIds(k: string, _arg_2: number): string[]
+ {
+ if(!this._mandatorySetTypeIds[k])
+ {
+ this._mandatorySetTypeIds[k] = [];
+ }
+
+ if(this._mandatorySetTypeIds[k][_arg_2])
+ {
+ return this._mandatorySetTypeIds[k][_arg_2];
+ }
+
+ this._mandatorySetTypeIds[k][_arg_2] = this._figureData.getMandatorySetTypeIds(k, _arg_2);
+
+ return this._mandatorySetTypeIds[k][_arg_2];
+ }
+
+ public getDefaultPartSet(k: string, _arg_2: string): IFigurePartSet
+ {
+ return this._figureData.getDefaultPartSet(k, _arg_2);
+ }
+
+ public getCanvasOffsets(k: IActiveActionData[], _arg_2: string, _arg_3: number): number[]
+ {
+ return this._actionManager.getCanvasOffsets(k, _arg_2, _arg_3);
+ }
+
+ public getCanvas(k: string, _arg_2: string): AvatarCanvas
+ {
+ return this._geometry.getCanvas(k, _arg_2);
+ }
+
+ public removeDynamicItems(k: IAvatarImage): void
+ {
+ this._geometry.removeDynamicItems(k);
+ }
+
+ public getActiveBodyPartIds(k: IActiveActionData, _arg_2: IAvatarImage): string[]
+ {
+ let _local_3: string[] = [];
+
+ const _local_4: string[] = [];
+ const _local_5 = k.definition.geometryType;
+
+ if(k.definition.isAnimation)
+ {
+ const _local_7 = ((k.definition.state + '.') + k.actionParameter);
+ const _local_8 = this._animationManager.getAnimation(_local_7);
+
+ if(_local_8)
+ {
+ _local_3 = _local_8.getAnimatedBodyPartIds(0, k.overridingAction);
+
+ if(_local_8.hasAddData())
+ {
+ const _local_11 = {
+ id: '',
+ x: 0,
+ y: 0,
+ z: 0,
+ radius: 0.01,
+ nx: 0,
+ ny: 0,
+ nz: -1,
+ double: 1
+ };
+
+ const _local_12 = {
+ setType: ''
+ };
+
+ for(const _local_13 of _local_8.addData)
+ {
+ const _local_6 = this._geometry.getBodyPart(_local_5, _local_13.align);
+
+ if(_local_6)
+ {
+ _local_11.id = _local_13.id;
+ _local_6.addPart(_local_11, _arg_2);
+
+ _local_12.setType = _local_13.id;
+
+ const _local_10 = this._partSetsData.addPartDefinition(_local_12);
+ _local_10.appendToFigure = true;
+
+ if(_local_13.base === '') _local_10.staticId = 1;
+
+ if(_local_4.indexOf(_local_6.id) === -1) _local_4.push(_local_6.id);
+ }
+ }
+ }
+ }
+
+ for(const _local_9 of _local_3)
+ {
+ const _local_6 = this._geometry.getBodyPart(_local_5, _local_9);
+
+ if(_local_6 && (_local_4.indexOf(_local_6.id) === -1)) _local_4.push(_local_6.id);
+ }
+ }
+ else
+ {
+ _local_3 = this._partSetsData.getActiveParts(k.definition);
+
+ for(const _local_14 of _local_3)
+ {
+ const _local_6 = this._geometry.getBodyPartOfItem(_local_5, _local_14, _arg_2);
+
+ if(_local_6 && (_local_4.indexOf(_local_6.id) === -1)) _local_4.push(_local_6.id);
+ }
+ }
+
+ return _local_4;
+ }
+
+ public getBodyPartsUnordered(k: string): string[]
+ {
+ return this._geometry.getBodyPartIdsInAvatarSet(k);
+ }
+
+ public getBodyParts(k: string, _arg_2: string, _arg_3: number): string[]
+ {
+ const _local_4 = AvatarDirectionAngle.DIRECTION_TO_ANGLE[_arg_3];
+
+ return this._geometry.getBodyPartsAtAngle(k, _local_4, _arg_2);
+ }
+
+ public getFrameBodyPartOffset(k: IActiveActionData, _arg_2: number, _arg_3: number, _arg_4: string): Point
+ {
+ const _local_5 = this._animationData.getAction(k.definition);
+
+ if(_local_5) return _local_5.getFrameBodyPartOffset(_arg_2, _arg_3, _arg_4);
+
+ return AnimationAction.DEFAULT_OFFSET;
+ }
+
+ public getParts(k: string, _arg_2: IAvatarFigureContainer, _arg_3: IActiveActionData, _arg_4: string, _arg_5: number, removes: string[], _arg_7: IAvatarImage, _arg_8: Map = null): AvatarImagePartContainer[]
+ {
+ const _local_10: Animation = null;
+ let _local_34: IActionDefinition = null;
+
+ let _local_20: AvatarAnimationFrame[] = [];
+ let _local_36: IPartColor = null;
+
+ if(!_arg_3 == null) return [];
+
+ const _local_9 = this._partSetsData.getActiveParts(_arg_3.definition);
+ const _local_11: AvatarImagePartContainer[] = [];
+ let _local_14: any[] = [0];
+ const _local_15 = this._animationData.getAction(_arg_3.definition);
+
+ if(_arg_3.definition.isAnimation)
+ {
+ const _local_24 = ((_arg_3.definition.state + '.') + _arg_3.actionParameter);
+ const _local_10 = this._animationManager.getAnimation(_local_24);
+
+ if(_local_10)
+ {
+ _local_14 = this.getPopulatedArray(_local_10.frameCount(_arg_3.overridingAction));
+
+ for(const _local_25 of _local_10.getAnimatedBodyPartIds(0, _arg_3.overridingAction))
+ {
+ if(_local_25 === k)
+ {
+ const _local_26 = this._geometry.getBodyPart(_arg_4, _local_25);
+
+ if(_local_26)
+ {
+ for(const _local_27 of _local_26.getDynamicParts(_arg_7))
+ {
+ _local_9.push(_local_27.id);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ const _local_16 = this._geometry.getParts(_arg_4, k, _arg_5, _local_9, _arg_7);
+ const _local_21 = _arg_2.getPartTypeIds();
+
+ for(const _local_17 of _local_21)
+ {
+ if(_arg_8)
+ {
+ if(_arg_8.get(_local_17)) continue;
+ }
+
+ const _local_28 = _arg_2.getPartSetId(_local_17);
+ const _local_29 = _arg_2.getPartColorIds(_local_17);
+ const _local_30 = this._figureData.getSetType(_local_17);
+
+
+
+ if(_local_30)
+ {
+ const _local_31 = this._figureData.getPalette(_local_30.paletteID);
+
+ if(_local_31)
+ {
+ const _local_32 = _local_30.getPartSet(_local_28);
+
+ if(_local_32)
+ {
+ removes = removes.concat(_local_32.hiddenLayers);
+
+ for(const _local_33 of _local_32.parts)
+ {
+ if(_local_16.indexOf(_local_33.type) > -1)
+ {
+ if(_local_15)
+ {
+ const _local_19 = _local_15.getPart(_local_33.type);
+
+ if(_local_19)
+ {
+ _local_20 = _local_19.frames;
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+
+ _local_34 = _arg_3.definition;
+
+ if(_local_9.indexOf(_local_33.type) === -1) _local_34 = this._defaultAction;
+
+ const _local_13 = this._partSetsData.getPartDefinition(_local_33.type);
+
+ let _local_35 = (!_local_13) ? _local_33.type : _local_13.flippedSetType;
+
+ if(!_local_35 || (_local_35 === '')) _local_35 = _local_33.type;
+
+ if(_local_29 && (_local_29.length > (_local_33.colorLayerIndex - 1)))
+ {
+ _local_36 = _local_31.getColor(_local_29[(_local_33.colorLayerIndex - 1)]);
+ }
+
+ const _local_37 = (_local_33.colorLayerIndex > 0);
+ const _local_18 = new AvatarImagePartContainer(k, _local_33.type, _local_33.id.toString(), _local_36, _local_20, _local_34, _local_37, _local_33.paletteMap, _local_35);
+
+ _local_11.push(_local_18);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ const _local_22: AvatarImagePartContainer[] = [];
+
+ for(const _local_12 of _local_16)
+ {
+ let _local_39: IPartColor = null;
+ let _local_38 = false;
+
+ const _local_40 = ((_arg_8) && (_arg_8.get(_local_12)));
+
+ for(const _local_23 of _local_11)
+ {
+ if(_local_23.partType === _local_12)
+ {
+ if(_local_40)
+ {
+ _local_39 = _local_23.color;
+ }
+ else
+ {
+ _local_38 = true;
+
+ if(removes.indexOf(_local_12) === -1) _local_22.push(_local_23);
+ }
+ }
+ }
+
+ if(!_local_38)
+ {
+ if(_local_40)
+ {
+ const _local_41 = _arg_8.get(_local_12);
+
+ let _local_42 = 0;
+ let _local_43 = 0;
+
+ while(_local_43 < _local_41.length)
+ {
+ _local_42 = (_local_42 + _local_41.charCodeAt(_local_43));
+ _local_43++;
+ }
+
+ if(_local_15)
+ {
+ const _local_19 = _local_15.getPart(_local_12);
+
+ if(_local_19)
+ {
+ _local_20 = _local_19.frames;
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+
+ const _local_18 = new AvatarImagePartContainer(k, _local_12, _local_41, _local_39, _local_20, _arg_3.definition, (!(_local_39 == null)), -1, _local_12, false, 1);
+
+ _local_22.push(_local_18);
+ }
+ else
+ {
+ if(_local_9.indexOf(_local_12) > -1)
+ {
+ const _local_44 = this._geometry.getBodyPartOfItem(_arg_4, _local_12, _arg_7);
+
+ if(k !== _local_44.id)
+ {
+ //
+ }
+ else
+ {
+ const _local_13 = this._partSetsData.getPartDefinition(_local_12);
+
+ let _local_45 = false;
+ let _local_46 = 1;
+
+ if(_local_13.appendToFigure)
+ {
+ let _local_47 = '1';
+
+ if(_arg_3.actionParameter !== '')
+ {
+ _local_47 = _arg_3.actionParameter;
+ }
+
+ if(_local_13.hasStaticId())
+ {
+ _local_47 = _local_13.staticId.toString();
+ }
+
+ if(_local_10 != null)
+ {
+ const _local_48 = _local_10.getAddData(_local_12);
+
+ if(_local_48)
+ {
+ _local_45 = _local_48.isBlended;
+ _local_46 = _local_48.blend;
+ }
+ }
+
+ if(_local_15)
+ {
+ const _local_19 = _local_15.getPart(_local_12);
+
+ if(_local_19)
+ {
+ _local_20 = _local_19.frames;
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+ }
+ else
+ {
+ _local_20 = _local_14;
+ }
+
+ const _local_18 = new AvatarImagePartContainer(k, _local_12, _local_47, null, _local_20, _arg_3.definition, false, -1, _local_12, _local_45, _local_46);
+
+ _local_22.push(_local_18);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return _local_22;
+ }
+
+ private getPopulatedArray(k: number): number[]
+ {
+ const _local_2: number[] = [];
+
+ let index = 0;
+
+ while(index < k)
+ {
+ _local_2.push(index);
+
+ index++;
+ }
+
+ return _local_2;
+ }
+
+ public getItemIds(): string[]
+ {
+ if(this._actionManager)
+ {
+ const k = this._actionManager.getActionDefinition('CarryItem').params;
+
+ const _local_2 = [];
+
+ for(const _local_3 of k.values()) _local_2.push(_local_3);
+
+ return _local_2;
+ }
+
+ return [];
+ }
+
+ public get renderManager(): IAvatarRenderManager
+ {
+ return this._renderManager;
+ }
+
+ public get figureData(): IStructureData
+ {
+ return this._figureData;
+ }
+
+ public get partData(): PartSetsData
+ {
+ return this._partSetsData;
+ }
+
+ public get animationManager(): AnimationManager
+ {
+ return this._animationManager;
+ }
+}
diff --git a/packages/avatar/src/EffectAssetDownloadLibrary.ts b/packages/avatar/src/EffectAssetDownloadLibrary.ts
new file mode 100644
index 0000000..26adf0a
--- /dev/null
+++ b/packages/avatar/src/EffectAssetDownloadLibrary.ts
@@ -0,0 +1,75 @@
+import { IAssetAnimation, IAssetManager, IEffectAssetDownloadLibrary } from '@nitrots/api';
+import { AvatarRenderEffectLibraryEvent, GetEventDispatcher, NitroEventType } from '@nitrots/events';
+
+export class EffectAssetDownloadLibrary implements IEffectAssetDownloadLibrary
+{
+ public static DOWNLOAD_COMPLETE: string = 'EADL_DOWNLOAD_COMPLETE';
+
+ private static NOT_LOADED: number = 0;
+ private static LOADING: number = 1;
+ private static LOADED: number = 2;
+
+ private _state: number = EffectAssetDownloadLibrary.NOT_LOADED;
+ private _libraryName: string;
+ private _revision: string;
+ private _downloadUrl: string;
+ private _assetManager: IAssetManager;
+ private _animation: { [index: string]: IAssetAnimation } = null;
+
+ constructor(libraryName: string, revision: string, downloadUrl: string, assetManager: IAssetManager)
+ {
+ this._libraryName = libraryName;
+ this._revision = revision;
+ this._downloadUrl = downloadUrl;
+ this._assetManager = assetManager;
+
+ this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName);
+ this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision);
+
+ this.checkIsLoaded();
+ }
+
+ public async downloadAsset(): Promise
+ {
+ if(!this._assetManager || (this._state === EffectAssetDownloadLibrary.LOADING) || (this._state === EffectAssetDownloadLibrary.LOADED)) return;
+
+ if(!this.checkIsLoaded())
+ {
+ this._state = EffectAssetDownloadLibrary.LOADING;
+
+ const status = await this._assetManager.downloadAsset(this._downloadUrl);
+
+ if(!status) throw new Error('Could not download asset');
+ }
+
+ if(this.checkIsLoaded()) GetEventDispatcher().dispatchEvent(new AvatarRenderEffectLibraryEvent(NitroEventType.AVATAR_EFFECT_DOWNLOADED, this));
+ }
+
+ private checkIsLoaded(): boolean
+ {
+ const asset = this._assetManager.getCollection(this._libraryName);
+
+ if(!asset) return false;
+
+ this._state = EffectAssetDownloadLibrary.LOADED;
+
+ this._animation = asset.data.animations;
+
+ return true;
+ }
+
+ public get libraryName(): string
+ {
+ return this._libraryName;
+ }
+
+ public get animation(): { [index: string]: IAssetAnimation }
+ {
+ return this._animation;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return (this._state === EffectAssetDownloadLibrary.LOADED);
+ }
+}
diff --git a/packages/avatar/src/EffectAssetDownloadManager.ts b/packages/avatar/src/EffectAssetDownloadManager.ts
new file mode 100644
index 0000000..33e8afd
--- /dev/null
+++ b/packages/avatar/src/EffectAssetDownloadManager.ts
@@ -0,0 +1,206 @@
+import { IAssetManager, IAvatarEffectListener } from '@nitrots/api';
+import { GetConfiguration } from '@nitrots/configuration';
+import { AvatarRenderEffectLibraryEvent, GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events';
+import { AvatarStructure } from './AvatarStructure';
+import { EffectAssetDownloadLibrary } from './EffectAssetDownloadLibrary';
+
+export class EffectAssetDownloadManager
+{
+ private _assets: IAssetManager;
+ private _structure: AvatarStructure;
+
+ private _missingMandatoryLibs: string[] = [];
+ private _effectMap: Map = new Map();
+ private _effectListeners: Map = new Map();
+ private _incompleteEffects: Map = new Map();
+ private _currentDownloads: EffectAssetDownloadLibrary[] = [];
+ private _libraryNames: string[] = [];
+
+ constructor(assets: IAssetManager, structure: AvatarStructure)
+ {
+ this._assets = assets;
+ this._structure = structure;
+ }
+
+ public async init(): Promise
+ {
+ this._missingMandatoryLibs = GetConfiguration().getValue('avatar.mandatory.effect.libraries');
+
+ const url = GetConfiguration().getValue('avatar.effectmap.url');
+
+ if(!url || !url.length) throw new Error('Invalid effect map url');
+
+ const response = await fetch(url);
+
+ if(response.status !== 200) throw new Error('Invalid effect map file');
+
+ const responseData = await response.json();
+
+ this.processEffectMap(responseData.effects);
+
+ GetEventDispatcher().addEventListener(NitroEventType.AVATAR_EFFECT_DOWNLOADED, (event: AvatarRenderEffectLibraryEvent) => this.onLibraryLoaded(event));
+
+ await this.processMissingLibraries();
+ }
+
+ private processEffectMap(data: any): void
+ {
+ if(!data) return;
+
+ const downloadUrl = GetConfiguration().getValue('avatar.asset.effect.url');
+
+ for(const effect of data)
+ {
+ if(!effect) continue;
+
+ const id = (effect.id as string);
+ const libraryName = (effect.lib as string);
+ const revision = (effect.revision || '');
+
+ if(this._libraryNames.indexOf(libraryName) >= 0) continue;
+
+ this._libraryNames.push(libraryName);
+
+ const downloadLibrary = new EffectAssetDownloadLibrary(libraryName, revision, downloadUrl, this._assets);
+
+ let existing = this._effectMap.get(id);
+
+ if(!existing) existing = [];
+
+ existing.push(downloadLibrary);
+
+ this._effectMap.set(id, existing);
+ }
+ }
+
+ private async processMissingLibraries(): Promise
+ {
+ const promises: Promise[] = [];
+
+ this._missingMandatoryLibs.forEach(value =>
+ {
+ const libraries = this._effectMap.get(value);
+
+ if(libraries) for(const library of libraries) promises.push(library.downloadAsset());
+ });
+
+ this._missingMandatoryLibs = [];
+
+ await Promise.all(promises);
+ }
+
+ private onLibraryLoaded(event: AvatarRenderEffectLibraryEvent): void
+ {
+ if(!event || !event.library) return;
+
+ const loadedEffects: string[] = [];
+
+ this._structure.registerAnimation(event.library.animation);
+
+ for(const [id, libraries] of this._incompleteEffects.entries())
+ {
+ let isReady = true;
+
+ for(const library of libraries)
+ {
+ if(!library || library.isLoaded) continue;
+
+ isReady = false;
+
+ break;
+ }
+
+ if(isReady)
+ {
+ loadedEffects.push(id);
+
+ const listeners = this._effectListeners.get(id);
+
+ for(const listener of listeners)
+ {
+ if(!listener || listener.disposed) continue;
+
+ listener.resetEffect(parseInt(id));
+ }
+
+ this._effectListeners.delete(id);
+
+ GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.AVATAR_EFFECT_LOADED));
+ }
+ }
+
+ for(const id of loadedEffects) this._incompleteEffects.delete(id);
+
+ let index = 0;
+
+ while(index < this._currentDownloads.length)
+ {
+ const download = this._currentDownloads[index];
+
+ if(download)
+ {
+ if(download.libraryName === event.library.libraryName) this._currentDownloads.splice(index, 1);
+ }
+
+ index++;
+ }
+ }
+
+ public isAvatarEffectReady(effect: number): boolean
+ {
+ return !this.getAvatarEffectPendingLibraries(effect).length;
+ }
+
+ private getAvatarEffectPendingLibraries(id: number): EffectAssetDownloadLibrary[]
+ {
+ const pendingLibraries: EffectAssetDownloadLibrary[] = [];
+
+ if(!this._structure) return pendingLibraries;
+
+ const libraries = this._effectMap.get(id.toString());
+
+ if(libraries)
+ {
+ for(const library of libraries)
+ {
+ if(!library || library.isLoaded) continue;
+
+ if(pendingLibraries.indexOf(library) === -1) pendingLibraries.push(library);
+ }
+ }
+
+ return pendingLibraries;
+ }
+
+ public downloadAvatarEffect(id: number, listener: IAvatarEffectListener): void
+ {
+ const pendingLibraries = this.getAvatarEffectPendingLibraries(id);
+
+ if(pendingLibraries && pendingLibraries.length)
+ {
+ if(listener && !listener.disposed)
+ {
+ let listeners = this._effectListeners.get(id.toString());
+
+ if(!listeners) listeners = [];
+
+ listeners.push(listener);
+
+ this._effectListeners.set(id.toString(), listeners);
+ }
+
+ this._incompleteEffects.set(id.toString(), pendingLibraries);
+
+ for(const library of pendingLibraries)
+ {
+ if(!library) continue;
+
+ library.downloadAsset();
+ }
+ }
+ else
+ {
+ if(listener && !listener.disposed) listener.resetEffect(id);
+ }
+ }
+}
diff --git a/packages/avatar/src/FigureDataContainer.ts b/packages/avatar/src/FigureDataContainer.ts
new file mode 100644
index 0000000..71dd487
--- /dev/null
+++ b/packages/avatar/src/FigureDataContainer.ts
@@ -0,0 +1,241 @@
+export class FigureDataContainer
+{
+ private static MALE: string = 'M';
+ private static FEMALE: string = 'F';
+ private static UNISEX: string = 'U';
+ private static SCALE: string = 'h';
+ private static STD: string = 'std';
+ private static DEFAULT_FRAME: string = '0';
+ private static HD: string = 'hd';
+ private static HAIR: string = 'hr';
+ private static HAT: string = 'ha';
+ private static HEAD_ACCESSORIES: string = 'he';
+ private static EYE_ACCESSORIES: string = 'ea';
+ private static FACE_ACCESSORIES: string = 'fa';
+ private static JACKET: string = 'cc';
+ private static SHIRT: string = 'ch';
+ private static CHEST_ACCESSORIES: string = 'ca';
+ private static CHEST_PRINTS: string = 'cp';
+ private static TROUSERS: string = 'lg';
+ private static SHOES: string = 'sh';
+ private static TROUSER_ACCESSORIES: string = 'wa';
+ private static BLOCKED_FX_TYPES: number[] = [28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 68];
+
+ private _data: Map;
+ private _colors: Map;
+ private _gender: string = 'M';
+ private _isDisposed: boolean;
+ private _avatarEffectType: number = -1;
+
+ public loadAvatarData(figure: string, gender: string): void
+ {
+ this._data = new Map();
+ this._colors = new Map();
+ this._gender = gender;
+
+ this.parseFigureString(figure);
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ this._colors = null;
+ this._isDisposed = true;
+ }
+
+ public get disposed(): boolean
+ {
+ return this._isDisposed;
+ }
+
+ private parseFigureString(k: string): void
+ {
+ if(!k) return;
+
+ for(const set of k.split('.'))
+ {
+ const _local_3 = set.split('-');
+
+ if(_local_3.length > 0)
+ {
+ const part = _local_3[0];
+ const setId = parseInt(_local_3[1]);
+ const colors: number[] = [];
+
+ let i = 2;
+
+ while(i < _local_3.length)
+ {
+ colors.push(parseInt(_local_3[i]));
+
+ i++;
+ }
+
+ if(!colors.length) colors.push(0);
+
+ this.savePartSetId(part, setId, false);
+ this.savePartSetColourId(part, colors, false);
+ }
+ }
+ }
+
+ public hasSetType(k: string): boolean
+ {
+ return !!this._data.get(k);
+ }
+
+ public getPartSetId(k: string): number
+ {
+ if(this.hasSetType(k)) return this._data.get(k);
+
+ return -1;
+ }
+
+ public getColourIds(k: string): number[]
+ {
+ if(this._colors.get(k)) return this._colors.get(k);
+
+ return [];
+ }
+
+ public getFigureString(): string
+ {
+ let figure = '';
+
+ const sets: string[] = [];
+
+ for(const [key, value] of this._data.entries())
+ {
+ let set = ((key + '-') + value);
+
+ const colors = this._colors.get(key);
+
+ if(colors) for(const color of colors) set = (set + ('-' + color));
+
+ sets.push(set);
+ }
+
+ let i = 0;
+
+ while(i < sets.length)
+ {
+ figure = (figure + sets[i]);
+
+ if(i < (sets.length - 1)) figure = (figure + '.');
+
+ i++;
+ }
+
+ return figure;
+ }
+
+ public savePartData(k: string, _arg_2: number, _arg_3: number[], _arg_4: boolean = false): void
+ {
+ this.savePartSetId(k, _arg_2, _arg_4);
+ this.savePartSetColourId(k, _arg_3, _arg_4);
+ }
+
+ private savePartSetId(k: string, _arg_2: number, _arg_3: boolean = true): void
+ {
+ switch(k)
+ {
+ case FigureDataContainer.HD:
+ case FigureDataContainer.HAIR:
+ case FigureDataContainer.HAT:
+ case FigureDataContainer.HEAD_ACCESSORIES:
+ case FigureDataContainer.EYE_ACCESSORIES:
+ case FigureDataContainer.FACE_ACCESSORIES:
+ case FigureDataContainer.SHIRT:
+ case FigureDataContainer.JACKET:
+ case FigureDataContainer.CHEST_ACCESSORIES:
+ case FigureDataContainer.CHEST_PRINTS:
+ case FigureDataContainer.TROUSERS:
+ case FigureDataContainer.SHOES:
+ case FigureDataContainer.TROUSER_ACCESSORIES:
+ if(_arg_2 >= 0)
+ {
+ this._data.set(k, _arg_2);
+ }
+ else
+ {
+ this._data.delete(k);
+ }
+ }
+ }
+
+ public savePartSetColourId(k: string, _arg_2: number[], _arg_3: boolean = true): void
+ {
+ switch(k)
+ {
+ case FigureDataContainer.HD:
+ case FigureDataContainer.HAIR:
+ case FigureDataContainer.HAT:
+ case FigureDataContainer.HEAD_ACCESSORIES:
+ case FigureDataContainer.EYE_ACCESSORIES:
+ case FigureDataContainer.FACE_ACCESSORIES:
+ case FigureDataContainer.SHIRT:
+ case FigureDataContainer.JACKET:
+ case FigureDataContainer.CHEST_ACCESSORIES:
+ case FigureDataContainer.CHEST_PRINTS:
+ case FigureDataContainer.TROUSERS:
+ case FigureDataContainer.SHOES:
+ case FigureDataContainer.TROUSER_ACCESSORIES:
+ this._colors.set(k, _arg_2);
+ return;
+ }
+ }
+
+ public getFigureStringWithFace(k: number): string
+ {
+ const partSets: string[] = [FigureDataContainer.HD];
+
+ let figure = '';
+ const sets: string[] = [];
+
+ for(const part of partSets)
+ {
+ const colors = this._colors.get(part);
+
+ if(colors)
+ {
+ let setId = this._data.get(part);
+
+ if(part === FigureDataContainer.HD) setId = k;
+
+ let set = ((part + '-') + setId);
+
+ if(setId >= 0)
+ {
+ let i = 0;
+
+ while(i < colors.length)
+ {
+ set = (set + ('-' + colors[i]));
+
+ i++;
+ }
+ }
+
+ sets.push(set);
+ }
+ }
+
+ let i = 0;
+
+ while(i < sets.length)
+ {
+ figure = (figure + sets[i]);
+
+ if(i < (sets.length - 1)) figure = (figure + '.');
+
+ i++;
+ }
+
+ return figure;
+ }
+
+ public get gender(): string
+ {
+ return this._gender;
+ }
+}
diff --git a/packages/avatar/src/GetAvatarRenderManager.ts b/packages/avatar/src/GetAvatarRenderManager.ts
new file mode 100644
index 0000000..c6cef25
--- /dev/null
+++ b/packages/avatar/src/GetAvatarRenderManager.ts
@@ -0,0 +1,5 @@
+import { AvatarRenderManager } from './AvatarRenderManager';
+
+const avatarRenderManager = new AvatarRenderManager();
+
+export const GetAvatarRenderManager = () => avatarRenderManager;
diff --git a/packages/avatar/src/PlaceHolderAvatarImage.ts b/packages/avatar/src/PlaceHolderAvatarImage.ts
new file mode 100644
index 0000000..1a56373
--- /dev/null
+++ b/packages/avatar/src/PlaceHolderAvatarImage.ts
@@ -0,0 +1,18 @@
+import { AssetAliasCollection } from './alias';
+import { AvatarFigureContainer } from './AvatarFigureContainer';
+import { AvatarImage } from './AvatarImage';
+import { AvatarStructure } from './AvatarStructure';
+import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
+
+export class PlaceHolderAvatarImage extends AvatarImage
+{
+ constructor(k: AvatarStructure, _arg_2: AssetAliasCollection, _arg_3: AvatarFigureContainer, _arg_4: string, _arg_5: EffectAssetDownloadManager)
+ {
+ super(k, _arg_2, _arg_3, _arg_4, _arg_5, null);
+ }
+
+ public isPlaceholder(): boolean
+ {
+ return true;
+ }
+}
diff --git a/packages/avatar/src/actions/ActionDefinition.ts b/packages/avatar/src/actions/ActionDefinition.ts
new file mode 100644
index 0000000..0f16d70
--- /dev/null
+++ b/packages/avatar/src/actions/ActionDefinition.ts
@@ -0,0 +1,220 @@
+import { IActionDefinition } from '@nitrots/api';
+import { ActionType } from './ActionType';
+
+export class ActionDefinition implements IActionDefinition
+{
+ private _id: string;
+ private _state: string;
+ private _precedence: number;
+ private _activePartSet: string;
+ private _assetPartDefinition: string;
+ private _lay: string;
+ private _geometryType: string;
+ private _isMain: boolean;
+ private _isDefault: boolean;
+ private _isAnimation: boolean;
+ private _startFromFrameZero: boolean;
+ private _prevents: string[];
+ private _preventHeadTurn: boolean;
+ private _types: Map = new Map();
+ private _params: Map = new Map();
+ private _defaultParameterValue: string = '';
+ private _canvasOffsets: Map> = new Map();
+
+ constructor(data: any)
+ {
+ this._id = data.id;
+ this._state = data.state;
+ this._precedence = data.precedence;
+ this._activePartSet = data.activePartSet;
+ this._assetPartDefinition = data.assetPartDefinition;
+ this._lay = data.lay;
+ this._geometryType = data.geometryType;
+ this._isMain = data.main || false;
+ this._isDefault = data.isDefault || false;
+ this._isAnimation = data.animation || false;
+ this._startFromFrameZero = data.startFromFrameZero || false;
+ this._prevents = data.prevents || [];
+ this._preventHeadTurn = data.preventHeadTurn || false;
+
+ if(data.params && (data.params.length > 0))
+ {
+ for(const param of data.params)
+ {
+ if(!param) continue;
+
+ if(param.id === 'default') this._defaultParameterValue = param.value;
+ else this._params.set(param.id, param.value);
+ }
+ }
+
+ if(data.types && (data.types.length > 0))
+ {
+ for(const type of data.types)
+ {
+ if(!type) continue;
+
+ const action = new ActionType(type);
+
+ this._types.set(action.id, action);
+ }
+ }
+ }
+
+ public setOffsets(k: string, _arg_2: number, _arg_3: number[]): void
+ {
+ if(!this._canvasOffsets) this._canvasOffsets = new Map();
+
+ let existing = this._canvasOffsets.get(k);
+
+ if(!existing)
+ {
+ existing = new Map();
+
+ this._canvasOffsets.set(k, existing);
+ }
+
+ existing.set(_arg_2, _arg_3);
+ }
+
+ public getOffsets(k: string, _arg_2: number): number[]
+ {
+ if(!this._canvasOffsets) return null;
+
+ const existing = this._canvasOffsets.get(k);
+
+ if(!existing) return null;
+
+ return existing.get(_arg_2);
+ }
+
+ public getType(id: string): ActionType
+ {
+ if(!id) return null;
+
+ const existing = this._types.get(parseInt(id));
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getParameterValue(id: string): string
+ {
+ if(!id) return '';
+
+ const existing = this._params.get(id);
+
+ if(!existing) return this._defaultParameterValue;
+
+ return existing;
+ }
+
+ public getPrevents(type: string): string[]
+ {
+ return this._prevents.concat(this.getTypePrevents(type));
+ }
+
+ private getTypePrevents(type: string): string[]
+ {
+ if(!type) return [];
+
+ const existing = this._types.get(parseInt(type));
+
+ if(!existing) return [];
+
+ return existing.prevents;
+ }
+
+ public getPreventHeadTurn(k: string): boolean
+ {
+ if(!k) return this._preventHeadTurn;
+
+ const type = this.getType(k);
+
+ if(!type) return this._preventHeadTurn;
+
+ return type.preventHeadTurn;
+ }
+
+ public isAnimated(k: string): boolean
+ {
+ if(!k) return true;
+
+ const type = this.getType(k);
+
+ if(!type) return true;
+
+ return type.isAnimated;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get state(): string
+ {
+ return this._state;
+ }
+
+ public get precedence(): number
+ {
+ return this._precedence;
+ }
+
+ public get activePartSet(): string
+ {
+ return this._activePartSet;
+ }
+
+ public get assetPartDefinition(): string
+ {
+ return this._assetPartDefinition;
+ }
+
+ public get lay(): string
+ {
+ return this._lay;
+ }
+
+ public get geometryType(): string
+ {
+ return this._geometryType;
+ }
+
+ public get isMain(): boolean
+ {
+ return this._isMain;
+ }
+
+ public get isDefault(): boolean
+ {
+ return this._isDefault;
+ }
+
+ public get isAnimation(): boolean
+ {
+ return this._isAnimation;
+ }
+
+ public get startFromFrameZero(): boolean
+ {
+ return this._startFromFrameZero;
+ }
+
+ public get prevents(): string[]
+ {
+ return this._prevents;
+ }
+
+ public get preventHeadTurn(): boolean
+ {
+ return this._preventHeadTurn;
+ }
+
+ public get params(): Map
+ {
+ return this._params;
+ }
+}
diff --git a/packages/avatar/src/actions/ActionType.ts b/packages/avatar/src/actions/ActionType.ts
new file mode 100644
index 0000000..d6d0312
--- /dev/null
+++ b/packages/avatar/src/actions/ActionType.ts
@@ -0,0 +1,44 @@
+export class ActionType
+{
+ private _id: number;
+ private _value: number;
+ private _prevents: string[];
+ private _preventHeadTurn: boolean;
+ private _isAnimated: boolean;
+
+ constructor(data: any)
+ {
+ this._id = parseInt(data.id);
+ this._value = parseInt(data.id);
+ this._prevents = data.prevents || [];
+ this._preventHeadTurn = data.preventHeadTurn || false;
+ this._isAnimated = true;
+
+ if((data.animated !== undefined) && (data.animated === false)) this._isAnimated = false;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get value(): number
+ {
+ return this._value;
+ }
+
+ public get prevents(): string[]
+ {
+ return this._prevents;
+ }
+
+ public get preventHeadTurn(): boolean
+ {
+ return this._preventHeadTurn;
+ }
+
+ public get isAnimated(): boolean
+ {
+ return this._isAnimated;
+ }
+}
diff --git a/packages/avatar/src/actions/ActiveActionData.ts b/packages/avatar/src/actions/ActiveActionData.ts
new file mode 100644
index 0000000..7578e20
--- /dev/null
+++ b/packages/avatar/src/actions/ActiveActionData.ts
@@ -0,0 +1,73 @@
+import { IActionDefinition, IActiveActionData } from '@nitrots/api';
+
+export class ActiveActionData implements IActiveActionData
+{
+ private _actionType: string;
+ private _actionParameter: string;
+ private _definition: IActionDefinition;
+ private _startFrame: number;
+ private _overridingAction: string;
+
+ constructor(action: string, parameter: string = '', startFrame: number = 0)
+ {
+ this._actionType = action || '';
+ this._actionParameter = parameter || '';
+ this._definition = null;
+ this._startFrame = startFrame || 0;
+ this._overridingAction = null;
+ }
+
+ public dispose(): void
+ {
+ this._actionType = null;
+ this._actionParameter = null;
+ this._definition = null;
+ }
+
+ public get id(): string
+ {
+ if(!this._definition) return '';
+
+ return this._definition.id + '_' + this._actionParameter;
+ }
+
+ public get actionType(): string
+ {
+ return this._actionType;
+ }
+
+ public get actionParameter(): string
+ {
+ return this._actionParameter;
+ }
+
+ public set actionParameter(parameter: string)
+ {
+ this._actionParameter = parameter;
+ }
+
+ public get definition(): IActionDefinition
+ {
+ return this._definition;
+ }
+
+ public set definition(definition: IActionDefinition)
+ {
+ this._definition = definition;
+ }
+
+ public get startFrame(): number
+ {
+ return this._startFrame;
+ }
+
+ public get overridingAction(): string
+ {
+ return this._overridingAction;
+ }
+
+ public set overridingAction(action: string)
+ {
+ this._overridingAction = action;
+ }
+}
diff --git a/packages/avatar/src/actions/AvatarActionManager.ts b/packages/avatar/src/actions/AvatarActionManager.ts
new file mode 100644
index 0000000..eee1eef
--- /dev/null
+++ b/packages/avatar/src/actions/AvatarActionManager.ts
@@ -0,0 +1,186 @@
+import { IActiveActionData, IAssetManager } from '@nitrots/api';
+import { ActionDefinition } from './ActionDefinition';
+
+export class AvatarActionManager
+{
+ private _assets: IAssetManager;
+ private _actions: Map;
+ private _defaultAction: ActionDefinition;
+
+ constructor(k: IAssetManager, data: any)
+ {
+ this._assets = k;
+ this._actions = new Map();
+ this._defaultAction = null;
+
+ this.updateActions(data);
+ }
+
+ public updateActions(data: any): void
+ {
+ if(!data) return;
+
+ for(const action of data.actions)
+ {
+ if(!action || !action.state) continue;
+
+ const definition = new ActionDefinition(action);
+
+ this._actions.set(definition.state, definition);
+ }
+
+ if(data.actionOffsets) this.parseActionOffsets(data.actionOffsets);
+ }
+
+ private parseActionOffsets(offsets: any): void
+ {
+ if(!offsets || !offsets.length) return;
+
+ for(const offset of offsets)
+ {
+ const action = this._actions.get(offset.action);
+
+ if(!action) continue;
+
+ for(const canvasOffset of offset.offsets)
+ {
+ const size = (canvasOffset.size || '');
+ const direction = canvasOffset.direction;
+
+ if((size === '') || (direction === undefined)) continue;
+
+ const x = (canvasOffset.x || 0);
+ const y = (canvasOffset.y || 0);
+ const z = (canvasOffset.z || 0);
+
+ action.setOffsets(size, direction, [x, y, z]);
+ }
+ }
+ }
+
+ public getActionDefinition(id: string): ActionDefinition
+ {
+ if(!id) return null;
+
+ for(const action of this._actions.values())
+ {
+ if(!action || (action.id !== id)) continue;
+
+ return action;
+ }
+
+ return null;
+ }
+
+ public getActionDefinitionWithState(state: string): ActionDefinition
+ {
+ const existing = this._actions.get(state);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getDefaultAction(): ActionDefinition
+ {
+ if(this._defaultAction) return this._defaultAction;
+
+ for(const action of this._actions.values())
+ {
+ if(!action || !action.isDefault) continue;
+
+ this._defaultAction = action;
+
+ return action;
+ }
+
+ return null;
+ }
+
+ public getCanvasOffsets(k: IActiveActionData[], _arg_2: string, _arg_3: number): number[]
+ {
+ let canvasOffsets: number[] = [];
+
+ for(const activeAction of k)
+ {
+ if(!activeAction) continue;
+
+ const action = this._actions.get(activeAction.actionType);
+ const offsets = action && action.getOffsets(_arg_2, _arg_3);
+
+ if(offsets) canvasOffsets = offsets;
+ }
+
+ return canvasOffsets;
+ }
+
+ public sortActions(actions: IActiveActionData[]): IActiveActionData[]
+ {
+ if(!actions) return null;
+
+ actions = this.filterActions(actions);
+
+ const validatedActions: IActiveActionData[] = [];
+
+ for(const action of actions)
+ {
+ if(!action) continue;
+
+ const definition = this._actions.get(action.actionType);
+
+ if(!definition) continue;
+
+ action.definition = definition;
+
+ validatedActions.push(action);
+ }
+
+ validatedActions.sort(this.sortByPrecedence);
+
+ return validatedActions;
+ }
+
+ private filterActions(actions: IActiveActionData[]): IActiveActionData[]
+ {
+ let preventions: string[] = [];
+ const activeActions: IActiveActionData[] = [];
+
+ for(const action of actions)
+ {
+ if(!action) continue;
+
+ const localAction = this._actions.get(action.actionType);
+
+ if(localAction) preventions = preventions.concat(localAction.getPrevents(action.actionParameter));
+ }
+
+ for(const action of actions)
+ {
+ if(!action) continue;
+
+ let actionType = action.actionType;
+
+ if(action.actionType === 'fx') actionType = (actionType + ('.' + action.actionParameter));
+
+ if(preventions.indexOf(actionType) >= 0) continue;
+
+ activeActions.push(action);
+ }
+
+ return activeActions;
+ }
+
+ private sortByPrecedence(actionOne: IActiveActionData, actionTwo: IActiveActionData): number
+ {
+ if(!actionOne || !actionTwo) return 0;
+
+ const precedenceOne = actionOne.definition.precedence;
+ const precedenceTwo = actionTwo.definition.precedence;
+
+ if(precedenceOne < precedenceTwo) return 1;
+
+ if(precedenceOne > precedenceTwo) return -1;
+
+ return 0;
+ }
+}
diff --git a/packages/avatar/src/actions/index.ts b/packages/avatar/src/actions/index.ts
new file mode 100644
index 0000000..a849536
--- /dev/null
+++ b/packages/avatar/src/actions/index.ts
@@ -0,0 +1,4 @@
+export * from './ActionDefinition';
+export * from './ActionType';
+export * from './ActiveActionData';
+export * from './AvatarActionManager';
diff --git a/packages/avatar/src/alias/AssetAlias.ts b/packages/avatar/src/alias/AssetAlias.ts
new file mode 100644
index 0000000..fd07c13
--- /dev/null
+++ b/packages/avatar/src/alias/AssetAlias.ts
@@ -0,0 +1,37 @@
+import { IAssetAlias } from '@nitrots/api';
+
+export class AssetAlias
+{
+ private _name: string;
+ private _link: string;
+ private _flipH: boolean;
+ private _flipV: boolean;
+
+ constructor(name: string, alias: IAssetAlias)
+ {
+ this._name = name;
+ this._link = alias.link;
+ this._flipH = alias.flipH;
+ this._flipV = alias.flipV;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get link(): string
+ {
+ return this._link;
+ }
+
+ public get flipH(): boolean
+ {
+ return this._flipH;
+ }
+
+ public get flipV(): boolean
+ {
+ return this._flipV;
+ }
+}
diff --git a/packages/avatar/src/alias/AssetAliasCollection.ts b/packages/avatar/src/alias/AssetAliasCollection.ts
new file mode 100644
index 0000000..e4aec28
--- /dev/null
+++ b/packages/avatar/src/alias/AssetAliasCollection.ts
@@ -0,0 +1,89 @@
+import { IAssetManager, IGraphicAsset } from '@nitrots/api';
+import { AvatarRenderManager } from '../AvatarRenderManager';
+import { AssetAlias } from './AssetAlias';
+
+export class AssetAliasCollection
+{
+ private _assets: IAssetManager;
+ private _aliases: Map;
+ private _avatarRenderManager: AvatarRenderManager;
+ private _missingAssetNames: string[];
+
+ constructor(k: AvatarRenderManager, _arg_2: IAssetManager)
+ {
+ this._avatarRenderManager = k;
+ this._aliases = new Map();
+ this._assets = _arg_2;
+ this._missingAssetNames = [];
+ }
+
+ public dispose(): void
+ {
+ this._assets = null;
+ this._aliases = null;
+ }
+
+ public reset(): void
+ {
+ this.init();
+ }
+
+ public init(): void
+ {
+ for(const collection of this._assets.collections.values())
+ {
+ if(!collection) continue;
+
+ const aliases = collection.data && collection.data.aliases;
+
+ if(!aliases) continue;
+
+ for(const name in aliases)
+ {
+ const alias = aliases[name];
+
+ if(!alias) continue;
+
+ this._aliases.set(name, new AssetAlias(name, alias));
+ }
+ }
+ }
+
+ public hasAlias(k: string): boolean
+ {
+ const alias = this._aliases.get(k);
+
+ if(alias) return true;
+
+ return false;
+ }
+
+ public getAssetName(k: string): string
+ {
+ let _local_2 = k;
+ let _local_3 = 5;
+
+ while(this.hasAlias(_local_2) && (_local_3 >= 0))
+ {
+ const _local_4 = this._aliases.get(_local_2);
+
+ _local_2 = _local_4.link;
+ _local_3--;
+ }
+
+ return _local_2;
+ }
+
+ public getAsset(name: string): IGraphicAsset
+ {
+ if(!this._assets) return null;
+
+ name = this.getAssetName(name);
+
+ const asset = this._assets.getAsset(name);
+
+ if(!asset) return null;
+
+ return asset;
+ }
+}
diff --git a/packages/avatar/src/alias/index.ts b/packages/avatar/src/alias/index.ts
new file mode 100644
index 0000000..7d9524c
--- /dev/null
+++ b/packages/avatar/src/alias/index.ts
@@ -0,0 +1,2 @@
+export * from './AssetAlias';
+export * from './AssetAliasCollection';
diff --git a/packages/avatar/src/animation/AddDataContainer.ts b/packages/avatar/src/animation/AddDataContainer.ts
new file mode 100644
index 0000000..d0ede74
--- /dev/null
+++ b/packages/avatar/src/animation/AddDataContainer.ts
@@ -0,0 +1,61 @@
+import { IAssetAnimationAdd } from '@nitrots/api';
+
+export class AddDataContainer
+{
+ private _id: string;
+ private _align: string;
+ private _base: string;
+ private _ink: number;
+ private _blend: number;
+
+ constructor(k: IAssetAnimationAdd)
+ {
+ this._id = k.id || '';
+ this._align = k.align || '';
+ this._base = k.base || '';
+ this._ink = k.ink || 0;
+ this._blend = 0;
+
+ const _local_2 = k.blend;
+
+ if(_local_2)
+ {
+ if(_local_2.length > 0)
+ {
+ this._blend = parseInt(_local_2);
+
+ if(this._blend > 1) this._blend = (this._blend / 100);
+ }
+ }
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get align(): string
+ {
+ return this._align;
+ }
+
+ public get base(): string
+ {
+ return this._base;
+ }
+
+ public get ink(): number
+ {
+ return this._ink;
+ }
+
+ public get blend(): number
+ {
+ return this._blend;
+ }
+
+ public get isBlended(): boolean
+ {
+ return this._blend !== 1;
+ }
+}
diff --git a/packages/avatar/src/animation/Animation.ts b/packages/avatar/src/animation/Animation.ts
new file mode 100644
index 0000000..b6defc0
--- /dev/null
+++ b/packages/avatar/src/animation/Animation.ts
@@ -0,0 +1,311 @@
+import { IAnimation, IAssetAnimation, IAssetAnimationFrame } from '@nitrots/api';
+import { AvatarStructure } from '../AvatarStructure';
+import { AddDataContainer } from './AddDataContainer';
+import { AvatarAnimationLayerData } from './AvatarAnimationLayerData';
+import { AvatarDataContainer } from './AvatarDataContainer';
+import { DirectionDataContainer } from './DirectionDataContainer';
+import { SpriteDataContainer } from './SpriteDataContainer';
+
+export class Animation implements IAnimation
+{
+ private static EMPTY_ARRAY: any[] = [];
+
+ private _id: string;
+ private _description: string;
+ private _frames: AvatarAnimationLayerData[][];
+ private _spriteData: SpriteDataContainer[];
+ private _avatarData: AvatarDataContainer;
+ private _directionData: DirectionDataContainer;
+ private _removeData: string[];
+ private _addData: AddDataContainer[];
+ private _overriddenActions: Map;
+ private _overrideFrames: Map;
+ private _resetOnToggle: boolean;
+
+ constructor(k: AvatarStructure, _arg_2: IAssetAnimation)
+ {
+ this._id = _arg_2.name;
+ this._description = this._id;
+ this._frames = [];
+ this._spriteData = null;
+ this._avatarData = null;
+ this._directionData = null;
+ this._removeData = null;
+ this._addData = null;
+ this._overriddenActions = null;
+ this._overrideFrames = null;
+ this._resetOnToggle = (_arg_2.resetOnToggle || false);
+
+ if(_arg_2.sprites && _arg_2.sprites.length)
+ {
+ this._spriteData = [];
+
+ for(const sprite of _arg_2.sprites) this._spriteData.push(new SpriteDataContainer(this, sprite));
+ }
+
+ if(_arg_2.avatars && _arg_2.avatars.length) this._avatarData = new AvatarDataContainer(_arg_2.avatars[0]);
+
+ if(_arg_2.directions && _arg_2.directions.length) this._directionData = new DirectionDataContainer(_arg_2.directions[0]);
+
+ if(_arg_2.removes && _arg_2.removes.length)
+ {
+ this._removeData = [];
+
+ for(const remove of _arg_2.removes) this._removeData.push(remove.id);
+ }
+
+ if(_arg_2.adds && _arg_2.adds.length)
+ {
+ this._addData = [];
+
+ for(const add of _arg_2.adds) this._addData.push(new AddDataContainer(add));
+ }
+
+ if(_arg_2.overrides && _arg_2.overrides.length)
+ {
+ this._overrideFrames = new Map();
+ this._overriddenActions = new Map();
+
+ for(const override of _arg_2.overrides)
+ {
+ const name = override.name;
+ const value = override.override;
+
+ this._overriddenActions.set(value, name);
+
+ const frames: AvatarAnimationLayerData[][] = [];
+
+ this.parseFrames(frames, override.frames, k);
+
+ this._overrideFrames.set(name, frames);
+ }
+ }
+
+ this.parseFrames(this._frames, _arg_2.frames, k);
+ }
+
+ private parseFrames(frames: AvatarAnimationLayerData[][], _arg_2: IAssetAnimationFrame[], _arg_3: AvatarStructure): void
+ {
+ if(!_arg_2 || !_arg_2.length) return;
+
+ for(const frame of _arg_2)
+ {
+ let repeats = 1;
+
+ if(frame.repeats && (frame.repeats > 1)) repeats = frame.repeats;
+
+ let index = 0;
+
+ while(index < repeats)
+ {
+ const layers: AvatarAnimationLayerData[] = [];
+
+ if(frame.bodyparts && frame.bodyparts.length)
+ {
+ for(const bodyPart of frame.bodyparts)
+ {
+ const definition = _arg_3.getActionDefinition(bodyPart.action);
+ const layer = new AvatarAnimationLayerData(bodyPart, AvatarAnimationLayerData.BODYPART, definition);
+
+ layers.push(layer);
+ }
+ }
+
+ if(frame.fxs && frame.fxs.length)
+ {
+ for(const fx of frame.fxs)
+ {
+ const definition = _arg_3.getActionDefinition(fx.action);
+ const layer = new AvatarAnimationLayerData(fx, AvatarAnimationLayerData.FX, definition);
+
+ layers.push(layer);
+ }
+ }
+
+ frames.push(layers);
+
+ index++;
+ }
+ }
+ }
+
+ public frameCount(k: string = null): number
+ {
+ if(!k) return this._frames.length;
+
+ if(this._overrideFrames)
+ {
+ const _local_2 = this._overrideFrames.get(k);
+
+ if(_local_2) return _local_2.length;
+ }
+
+ return 0;
+ }
+
+ public hasOverriddenActions(): boolean
+ {
+ if(!this._overriddenActions) return false;
+
+ return (this._overriddenActions.size > 0);
+ }
+
+ public overriddenActionNames(): string[]
+ {
+ if(!this._overriddenActions) return null;
+
+ const keys: string[] = [];
+
+ for(const key of this._overriddenActions.keys()) keys.push(key);
+
+ return keys;
+ }
+
+ public overridingAction(k: string): string
+ {
+ if(!this._overriddenActions) return null;
+
+ return this._overriddenActions.get(k);
+ }
+
+ private getFrame(frameCount: number, _arg_2: string = null): AvatarAnimationLayerData[]
+ {
+ if(frameCount < 0) frameCount = 0;
+
+ let layers: AvatarAnimationLayerData[] = [];
+
+ if(!_arg_2)
+ {
+ if(this._frames.length > 0)
+ {
+ layers = this._frames[(frameCount % this._frames.length)];
+ }
+ }
+ else
+ {
+ const overrideLayers = this._overrideFrames.get(_arg_2);
+
+ if(overrideLayers && (overrideLayers.length > 0))
+ {
+ layers = overrideLayers[(frameCount % overrideLayers.length)];
+ }
+ }
+
+ return layers;
+ }
+
+ public getAnimatedBodyPartIds(k: number, _arg_2: string = null): string[]
+ {
+ const _local_3: string[] = [];
+
+ for(const layer of this.getFrame(k, _arg_2))
+ {
+ if(layer.type === AvatarAnimationLayerData.BODYPART)
+ {
+ _local_3.push(layer.id);
+ }
+
+ else if(layer.type === AvatarAnimationLayerData.FX)
+ {
+ if(this._addData && this._addData.length)
+ {
+ for(const _local_5 of this._addData)
+ {
+ if(_local_5.id === layer.id) _local_3.push(_local_5.align);
+ }
+ }
+ }
+ }
+
+ return _local_3;
+ }
+
+ public getLayerData(frameCount: number, spriteId: string, _arg_3: string = null): AvatarAnimationLayerData
+ {
+ for(const layer of this.getFrame(frameCount, _arg_3))
+ {
+ if(layer.id === spriteId) return layer;
+
+ if(layer.type === AvatarAnimationLayerData.FX)
+ {
+ if(this._addData && this._addData.length)
+ {
+ for(const addData of this._addData)
+ {
+ if(((addData.align === spriteId) && (addData.id === layer.id))) return layer;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public hasAvatarData(): boolean
+ {
+ return this._avatarData !== null;
+ }
+
+ public hasDirectionData(): boolean
+ {
+ return this._directionData !== null;
+ }
+
+ public hasAddData(): boolean
+ {
+ return this._addData !== null;
+ }
+
+ public getAddData(k: string): AddDataContainer
+ {
+ if(this._addData)
+ {
+ for(const _local_2 of this._addData)
+ {
+ if(_local_2.id === k) return _local_2;
+ }
+ }
+
+ return null;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get spriteData(): SpriteDataContainer[]
+ {
+ return this._spriteData || Animation.EMPTY_ARRAY;
+ }
+
+ public get avatarData(): AvatarDataContainer
+ {
+ return this._avatarData;
+ }
+
+ public get directionData(): DirectionDataContainer
+ {
+ return this._directionData;
+ }
+
+ public get removeData(): string[]
+ {
+ return this._removeData || Animation.EMPTY_ARRAY;
+ }
+
+ public get addData(): AddDataContainer[]
+ {
+ return this._addData || Animation.EMPTY_ARRAY;
+ }
+
+ public toString(): string
+ {
+ return this._description;
+ }
+
+ public get resetOnToggle(): boolean
+ {
+ return this._resetOnToggle;
+ }
+}
diff --git a/packages/avatar/src/animation/AnimationManager.ts b/packages/avatar/src/animation/AnimationManager.ts
new file mode 100644
index 0000000..daa7e6b
--- /dev/null
+++ b/packages/avatar/src/animation/AnimationManager.ts
@@ -0,0 +1,49 @@
+import { IAnimation, IAnimationLayerData, IAnimationManager, IAssetAnimation } from '@nitrots/api';
+import { AvatarStructure } from '../AvatarStructure';
+import { Animation } from './Animation';
+
+export class AnimationManager implements IAnimationManager
+{
+ private _animations: Map;
+
+ constructor()
+ {
+ this._animations = new Map();
+ }
+
+ public registerAnimation(structure: AvatarStructure, _arg_2: { [index: string]: IAssetAnimation }): boolean
+ {
+ if(!_arg_2) return false;
+
+ const animationData = _arg_2[Object.keys(_arg_2)[0]];
+
+ const animation = new Animation(structure, animationData);
+
+ this._animations.set(animationData.name, animation);
+
+ return true;
+ }
+
+ public getAnimation(animation: string): Animation
+ {
+ const existing = this._animations.get(animation);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getLayerData(animation: string, frameCount: number, spriteId: string): IAnimationLayerData
+ {
+ const existing = this.getAnimation(animation);
+
+ if(!existing) return null;
+
+ return existing.getLayerData(frameCount, spriteId);
+ }
+
+ public get animations(): Map
+ {
+ return this._animations;
+ }
+}
diff --git a/packages/avatar/src/animation/AvatarAnimationLayerData.ts b/packages/avatar/src/animation/AvatarAnimationLayerData.ts
new file mode 100644
index 0000000..9e4714b
--- /dev/null
+++ b/packages/avatar/src/animation/AvatarAnimationLayerData.ts
@@ -0,0 +1,109 @@
+import { IActionDefinition, IActiveActionData, IAnimationLayerData, IAssetAnimationFramePart } from '@nitrots/api';
+import { ActiveActionData } from '../actions';
+
+export class AvatarAnimationLayerData implements IAnimationLayerData
+{
+ public static BODYPART: string = 'bodypart';
+ public static FX: string = 'fx';
+
+ private _id: string;
+ private _action: IActiveActionData;
+ private _animationFrame: number;
+ private _dx: number;
+ private _dy: number;
+ private _dz: number;
+ private _directionOffset: number;
+ private _type: string;
+ private _base: string;
+ private _items: Map;
+
+ constructor(k: IAssetAnimationFramePart, _arg_2: string, _arg_3: IActionDefinition)
+ {
+ this._id = k.id;
+ this._animationFrame = (k.frame || 0);
+ this._dx = (k.dx || 0);
+ this._dy = (k.dy || 0);
+ this._dz = (k.dz || 0);
+ this._directionOffset = (k.dd || 0);
+ this._type = _arg_2;
+ this._base = (k.base || '');
+ this._items = new Map();
+
+ if(k.items) for(const _local_4 of k.items) this._items.set(_local_4.id, _local_4.base);
+
+ let _local_5 = '';
+
+ if(this._base !== '') _local_5 = this.baseAsInt().toString();
+
+ if(_arg_3)
+ {
+ this._action = new ActiveActionData(_arg_3.state, this.base);
+ this._action.definition = _arg_3;
+ }
+ }
+
+ public get items(): Map
+ {
+ return this._items;
+ }
+
+ private baseAsInt(): number
+ {
+ let k = 0;
+ let index = 0;
+
+ while(index < this._base.length)
+ {
+ k = (k + this._base.charCodeAt(index));
+
+ index++;
+ }
+
+ return k;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get animationFrame(): number
+ {
+ return this._animationFrame;
+ }
+
+ public get dx(): number
+ {
+ return this._dx;
+ }
+
+ public get dy(): number
+ {
+ return this._dy;
+ }
+
+ public get dz(): number
+ {
+ return this._dz;
+ }
+
+ public get dd(): number
+ {
+ return this._directionOffset;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get base(): string
+ {
+ return this._base;
+ }
+
+ public get action(): IActiveActionData
+ {
+ return this._action;
+ }
+}
diff --git a/packages/avatar/src/animation/AvatarDataContainer.ts b/packages/avatar/src/animation/AvatarDataContainer.ts
new file mode 100644
index 0000000..399cc68
--- /dev/null
+++ b/packages/avatar/src/animation/AvatarDataContainer.ts
@@ -0,0 +1,136 @@
+import { IAssetAnimationAvatar, IAvatarDataContainer } from '@nitrots/api';
+import { AdjustmentFilter } from 'pixi-filters';
+
+export class AvatarDataContainer implements IAvatarDataContainer
+{
+ private _ink: number;
+ private _foreGround: number;
+ private _backGround: number;
+ private _colorTransform: AdjustmentFilter;
+ private _rgb: number;
+ private _r: number;
+ private _g: number;
+ private _b: number;
+ private _redMultiplier: number;
+ private _greenMultiplier: number;
+ private _blueMultiplier: number;
+ private _alphaMultiplier: number;
+ private _colorMap: Map;
+ private _paletteIsGrayscale: boolean;
+
+ constructor(k: IAssetAnimationAvatar)
+ {
+ this._ink = k.ink;
+
+ let foreground = k.foreground;
+ let background = k.background;
+
+ foreground = foreground.replace('#', '');
+ background = background.replace('#', '');
+
+ this._foreGround = parseInt(foreground, 16);
+ this._backGround = parseInt(background, 16);
+ this._colorTransform = null;
+ this._rgb = parseInt(foreground, 16);
+ this._r = ((this._rgb >> 16) & 0xFF);
+ this._g = ((this._rgb >> 8) & 0xFF);
+ this._b = ((this._rgb >> 0) & 0xFF);
+ this._redMultiplier = ((this._r / 0xFF) * 1);
+ this._greenMultiplier = ((this._g / 0xFF) * 1);
+ this._blueMultiplier = ((this._b / 0xFF) * 1);
+ this._alphaMultiplier = 1;
+ this._paletteIsGrayscale = true;
+
+ if(this._ink === 37)
+ {
+ this._alphaMultiplier = 0.5;
+ this._paletteIsGrayscale = false;
+ }
+
+ this._colorTransform = new AdjustmentFilter({ red: (this._r / 255), green: (this._g / 255), blue: (this._b / 255), alpha: this._alphaMultiplier });
+ this._colorMap = this.generatePaletteMapForGrayscale(this._backGround, this._foreGround);
+ }
+
+ public get ink(): number
+ {
+ return this._ink;
+ }
+
+ public get colorTransform(): AdjustmentFilter
+ {
+ return this._colorTransform;
+ }
+
+ public get reds(): number[]
+ {
+ return this._colorMap.get('reds');
+ }
+
+ public get greens(): number[]
+ {
+ return this._colorMap.get('greens');
+ }
+
+ public get blues(): number[]
+ {
+ return this._colorMap.get('blues');
+ }
+
+ public get alphas(): number[]
+ {
+ return this._colorMap.get('alphas');
+ }
+
+ public get paletteIsGrayscale(): boolean
+ {
+ return this._paletteIsGrayscale;
+ }
+
+ private generatePaletteMapForGrayscale(background: number, foreground: number): Map
+ {
+ const alphaBackground = ((background >> 24) & 0xFF);
+ const redBackground = ((background >> 16) & 0xFF);
+ const greenBackground = ((background >> 8) & 0xFF);
+ const blueBackground = ((background >> 0) & 0xFF);
+ const alphaForeground = ((foreground >> 24) & 0xFF);
+ const redForeground = ((foreground >> 16) & 0xFF);
+ const greenForeground = ((foreground >> 8) & 0xFF);
+ const blueForeground = ((foreground >> 0) & 0xFF);
+ const alphaDifference = ((alphaForeground - alphaBackground) / 0xFF);
+ const redDifference = ((redForeground - redBackground) / 0xFF);
+ const greenDifference = ((greenForeground - greenBackground) / 0xFF);
+ const blueDifference = ((blueForeground - blueBackground) / 0xFF);
+ const _local_15: Map = new Map();
+ const _local_16: number[] = [];
+ const _local_17: number[] = [];
+ const _local_18: number[] = [];
+ const _local_19: number[] = [];
+ let _local_20 = alphaBackground;
+ let _local_21 = redBackground;
+ let _local_22 = greenBackground;
+ let _local_23 = blueBackground;
+
+ for(let i = 0; i < 256; i++)
+ {
+ if((((_local_21 == redBackground) && (_local_22 == greenBackground)) && (_local_23 == blueBackground)))
+ {
+ _local_20 = 0;
+ }
+ _local_20 = (_local_20 + alphaDifference);
+ _local_21 = (_local_21 + redDifference);
+ _local_22 = (_local_22 + greenDifference);
+ _local_23 = (_local_23 + blueDifference);
+ _local_19.push((_local_20 << 24));
+ _local_16.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
+ _local_17.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
+ _local_18.push(((((_local_20 << 24) | (_local_21 << 16)) | (_local_22 << 8)) | _local_23));
+ }
+
+ _local_15.set('alphas', _local_16);
+ _local_15.set('reds', _local_16);
+ _local_15.set('greens', _local_17);
+ _local_15.set('blues', _local_18);
+
+ return _local_15;
+ }
+}
diff --git a/packages/avatar/src/animation/DirectionDataContainer.ts b/packages/avatar/src/animation/DirectionDataContainer.ts
new file mode 100644
index 0000000..e90f453
--- /dev/null
+++ b/packages/avatar/src/animation/DirectionDataContainer.ts
@@ -0,0 +1,16 @@
+import { IAssetAnimationDirection } from '@nitrots/api';
+
+export class DirectionDataContainer
+{
+ private _offset: number;
+
+ constructor(k: IAssetAnimationDirection)
+ {
+ this._offset = k.offset;
+ }
+
+ public get offset(): number
+ {
+ return this._offset;
+ }
+}
diff --git a/packages/avatar/src/animation/SpriteDataContainer.ts b/packages/avatar/src/animation/SpriteDataContainer.ts
new file mode 100644
index 0000000..6755240
--- /dev/null
+++ b/packages/avatar/src/animation/SpriteDataContainer.ts
@@ -0,0 +1,94 @@
+import { IAnimation, IAssetAnimationSprite, ISpriteDataContainer } from '@nitrots/api';
+
+export class SpriteDataContainer implements ISpriteDataContainer
+{
+ private _animation: IAnimation;
+ private _id: string;
+ private _ink: number;
+ private _member: string;
+ private _hasDirections: boolean;
+ private _hasStaticY: boolean;
+ private _dx: number[];
+ private _dy: number[];
+ private _dz: number[];
+
+ constructor(k: IAnimation, _arg_2: IAssetAnimationSprite)
+ {
+ this._animation = k;
+ this._id = _arg_2.id;
+ this._ink = _arg_2.ink;
+ this._member = _arg_2.member;
+ this._hasStaticY = _arg_2.staticY ? true : false;
+ this._hasDirections = _arg_2.directions ? true : false;
+ this._dx = [];
+ this._dy = [];
+ this._dz = [];
+
+ const directions = _arg_2.directionList;
+
+ if(directions && directions.length)
+ {
+ for(const direction of directions)
+ {
+ const id = direction.id;
+
+ if(id === undefined) continue;
+
+ this._dx[id] = (direction.dx || 0);
+ this._dy[id] = (direction.dy || 0);
+ this._dz[id] = (direction.dz || 0);
+ }
+ }
+ }
+
+ public getDirectionOffsetX(k: number): number
+ {
+ if(k < this._dx.length) return this._dx[k];
+
+ return 0;
+ }
+
+ public getDirectionOffsetY(k: number): number
+ {
+ if(k < this._dy.length) return this._dy[k];
+
+ return 0;
+ }
+
+ public getDirectionOffsetZ(k: number): number
+ {
+ if(k < this._dz.length) return this._dz[k];
+
+ return 0;
+ }
+
+ public get animation(): IAnimation
+ {
+ return this._animation;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get ink(): number
+ {
+ return this._ink;
+ }
+
+ public get member(): string
+ {
+ return this._member;
+ }
+
+ public get hasDirections(): boolean
+ {
+ return this._hasDirections;
+ }
+
+ public get hasStaticY(): boolean
+ {
+ return this._hasStaticY;
+ }
+}
diff --git a/packages/avatar/src/animation/index.ts b/packages/avatar/src/animation/index.ts
new file mode 100644
index 0000000..f2e83c4
--- /dev/null
+++ b/packages/avatar/src/animation/index.ts
@@ -0,0 +1,7 @@
+export * from './AddDataContainer';
+export * from './Animation';
+export * from './AnimationManager';
+export * from './AvatarAnimationLayerData';
+export * from './AvatarDataContainer';
+export * from './DirectionDataContainer';
+export * from './SpriteDataContainer';
diff --git a/packages/avatar/src/cache/AvatarImageActionCache.ts b/packages/avatar/src/cache/AvatarImageActionCache.ts
new file mode 100644
index 0000000..0b65729
--- /dev/null
+++ b/packages/avatar/src/cache/AvatarImageActionCache.ts
@@ -0,0 +1,57 @@
+import { GetTickerTime } from '@nitrots/utils';
+import { AvatarImageDirectionCache } from './AvatarImageDirectionCache';
+
+export class AvatarImageActionCache
+{
+ private _cache: Map;
+ private _lastAccessTime: number;
+
+ constructor()
+ {
+ this._cache = new Map();
+
+ this.setLastAccessTime(GetTickerTime());
+ }
+
+ public dispose(): void
+ {
+ this.debugInfo('[dispose]');
+
+ if(!this._cache) return;
+
+ for(const direction of this._cache.values())
+ {
+ if(direction) direction.dispose();
+ }
+
+ this._cache.clear();
+ }
+
+ public getDirectionCache(k: number): AvatarImageDirectionCache
+ {
+ const existing = this._cache.get(k.toString());
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public updateDirectionCache(k: number, _arg_2: AvatarImageDirectionCache): void
+ {
+ this._cache.set(k.toString(), _arg_2);
+ }
+
+ public setLastAccessTime(k: number): void
+ {
+ this._lastAccessTime = k;
+ }
+
+ public getLastAccessTime(): number
+ {
+ return this._lastAccessTime;
+ }
+
+ private debugInfo(k: string): void
+ {
+ }
+}
diff --git a/packages/avatar/src/cache/AvatarImageBodyPartCache.ts b/packages/avatar/src/cache/AvatarImageBodyPartCache.ts
new file mode 100644
index 0000000..cb7d5ce
--- /dev/null
+++ b/packages/avatar/src/cache/AvatarImageBodyPartCache.ts
@@ -0,0 +1,96 @@
+import { IActiveActionData } from '@nitrots/api';
+import { AvatarImageActionCache } from './AvatarImageActionCache';
+
+export class AvatarImageBodyPartCache
+{
+ private _cache: Map;
+ private _currentAction: IActiveActionData;
+ private _currentDirection: number;
+ private _disposed: boolean;
+
+ constructor()
+ {
+ this._cache = new Map();
+ }
+
+ public setAction(k: IActiveActionData, _arg_2: number): void
+ {
+ if(!this._currentAction) this._currentAction = k;
+
+ const _local_3 = this.getActionCache(this._currentAction);
+
+ if(_local_3) _local_3.setLastAccessTime(_arg_2);
+
+ this._currentAction = k;
+ }
+
+ public dispose(): void
+ {
+ if(!this._disposed)
+ {
+ if(!this._cache) return;
+
+ this.disposeActions(0, 2147483647);
+
+ this._cache.clear();
+
+ this._cache = null;
+ this._disposed = true;
+ }
+ }
+
+ public disposeActions(k: number, _arg_2: number): void
+ {
+ if(!this._cache || this._disposed) return;
+
+ for(const [key, cache] of this._cache.entries())
+ {
+ if(!cache) continue;
+
+ const _local_3 = cache.getLastAccessTime();
+
+ if((_arg_2 - _local_3) >= k)
+ {
+ cache.dispose();
+
+ this._cache.delete(key);
+ }
+ }
+ }
+
+ public getAction(): IActiveActionData
+ {
+ return this._currentAction;
+ }
+
+ public setDirection(k: number): void
+ {
+ this._currentDirection = k;
+ }
+
+ public getDirection(): number
+ {
+ return this._currentDirection;
+ }
+
+ public getActionCache(k: IActiveActionData = null): AvatarImageActionCache
+ {
+ if(!this._currentAction) return null;
+
+ if(!k) k = this._currentAction;
+
+ if(k.overridingAction) return this._cache.get(k.overridingAction);
+
+ return this._cache.get(k.id);
+ }
+
+ public updateActionCache(k: IActiveActionData, _arg_2: AvatarImageActionCache): void
+ {
+ if(k.overridingAction) this._cache.set(k.overridingAction, _arg_2);
+ else this._cache.set(k.id, _arg_2);
+ }
+
+ private debugInfo(k: string): void
+ {
+ }
+}
diff --git a/packages/avatar/src/cache/AvatarImageCache.ts b/packages/avatar/src/cache/AvatarImageCache.ts
new file mode 100644
index 0000000..6c8381e
--- /dev/null
+++ b/packages/avatar/src/cache/AvatarImageCache.ts
@@ -0,0 +1,444 @@
+import { AvatarDirectionAngle, AvatarFigurePartType, AvatarScaleType, GeometryType, IActiveActionData, IAvatarImage } from '@nitrots/api';
+import { GetTickerTime } from '@nitrots/utils';
+import { Container, Matrix, Point, Rectangle, Sprite, Texture } from 'pixi.js';
+import { AvatarImageBodyPartContainer } from '../AvatarImageBodyPartContainer';
+import { AvatarImagePartContainer } from '../AvatarImagePartContainer';
+import { AvatarStructure } from '../AvatarStructure';
+import { AssetAliasCollection } from '../alias';
+import { AvatarAnimationLayerData } from '../animation';
+import { AvatarCanvas } from '../structure';
+import { AvatarImageActionCache } from './AvatarImageActionCache';
+import { AvatarImageBodyPartCache } from './AvatarImageBodyPartCache';
+import { AvatarImageDirectionCache } from './AvatarImageDirectionCache';
+import { ImageData } from './ImageData';
+
+export class AvatarImageCache
+{
+ private static DEFAULT_MAX_CACHE_STORAGE_TIME_MS: number = 60000;
+
+ private _structure: AvatarStructure;
+ private _avatar: IAvatarImage;
+ private _assets: AssetAliasCollection;
+ private _scale: string;
+ private _cache: Map;
+ private _canvas: AvatarCanvas;
+ private _disposed: boolean;
+ private _geometryType: string;
+ private _unionImages: ImageData[];
+ private _matrix: Matrix;
+
+ constructor(k: AvatarStructure, _arg_2: IAvatarImage, _arg_3: AssetAliasCollection, _arg_4: string)
+ {
+ this._structure = k;
+ this._avatar = _arg_2;
+ this._assets = _arg_3;
+ this._scale = _arg_4;
+ this._cache = new Map();
+ this._canvas = null;
+ this._disposed = false;
+ this._unionImages = [];
+ this._matrix = new Matrix();
+ }
+
+ public dispose(): void
+ {
+ if(this._disposed) return;
+
+ this._structure = null;
+ this._avatar = null;
+ this._assets = null;
+ this._canvas = null;
+ this._disposed = true;
+
+ if(this._cache)
+ {
+ for(const cache of this._cache.values())
+ {
+ if(!cache) continue;
+
+ cache.dispose();
+ }
+
+ this._cache = null;
+ }
+
+ if(this._unionImages)
+ {
+ for(const image of this._unionImages)
+ {
+ if(!image) continue;
+
+ image.dispose();
+ }
+
+ this._unionImages = [];
+ }
+ }
+
+ public disposeInactiveActions(k: number = 60000): void
+ {
+ const time = GetTickerTime();
+
+ if(this._cache)
+ {
+ for(const cache of this._cache.values())
+ {
+ if(!cache) continue;
+
+ cache.disposeActions(k, time);
+ }
+ }
+ }
+
+ public resetBodyPartCache(k: IActiveActionData): void
+ {
+ if(this._cache)
+ {
+ for(const cache of this._cache.values())
+ {
+ if(!cache) continue;
+
+ cache.setAction(k, 0);
+ }
+ }
+ }
+
+ public setDirection(k: string, _arg_2: number): void
+ {
+ const parts = this._structure.getBodyPartsUnordered(k);
+
+ if(parts)
+ {
+ for(const part of parts)
+ {
+ const actionCache = this.getBodyPartCache(part);
+
+ if(!actionCache) continue;
+
+ actionCache.setDirection(_arg_2);
+ }
+ }
+ }
+
+ public setAction(k: IActiveActionData, _arg_2: number): void
+ {
+ const _local_3 = this._structure.getActiveBodyPartIds(k, this._avatar);
+
+ for(const _local_4 of _local_3)
+ {
+ const _local_5 = this.getBodyPartCache(_local_4);
+
+ if(_local_5) _local_5.setAction(k, _arg_2);
+ }
+ }
+
+ public setGeometryType(k: string): void
+ {
+ if(this._geometryType === k) return;
+
+ if((((this._geometryType === GeometryType.SITTING) && (k === GeometryType.VERTICAL)) || ((this._geometryType === GeometryType.VERTICAL) && (k === GeometryType.SITTING)) || ((this._geometryType === GeometryType.SNOWWARS_HORIZONTAL) && (k = GeometryType.SNOWWARS_HORIZONTAL))))
+ {
+ this._geometryType = k;
+ this._canvas = null;
+
+ return;
+ }
+
+ this.disposeInactiveActions(0);
+
+ this._geometryType = k;
+ this._canvas = null;
+ }
+
+ public getImageContainer(key: string, frameNumber: number, forceRefresh: boolean = false): AvatarImageBodyPartContainer
+ {
+ const bodyPartCache = this.getBodyPartCache(key) || new AvatarImageBodyPartCache();
+
+ this._cache.set(key, bodyPartCache);
+
+ let direction = bodyPartCache.getDirection();
+ let action = bodyPartCache.getAction();
+ let adjustedFrameCount = frameNumber;
+
+ if(action.definition.startFromFrameZero) adjustedFrameCount -= action.startFrame;
+
+ let adjustedAction = action;
+ let removeData: string[] = [];
+ let items: Map = new Map();
+
+ const positionOffset = new Point();
+
+ if(action.definition.isAnimation)
+ {
+ let adjustedDirection = direction;
+
+ const animation = this._structure.getAnimation(((action.definition.state + '.') + action.actionParameter));
+ const animationFrameOffset = (frameNumber - action.startFrame);
+
+ if(animation)
+ {
+ const layerData = animation.getLayerData(animationFrameOffset, key, action.overridingAction);
+
+ if(layerData)
+ {
+ adjustedDirection = (direction + layerData.dd + 8) % 8;
+
+ positionOffset.x = this._scale === AvatarScaleType.LARGE ? layerData.dx : layerData.dx / 2;
+ positionOffset.y = this._scale === AvatarScaleType.LARGE ? layerData.dy : layerData.dy / 2;
+
+ adjustedFrameCount = layerData.animationFrame;
+
+ if(layerData.action) action = layerData.action;
+
+ if(layerData.type === AvatarAnimationLayerData.BODYPART)
+ {
+ if(layerData.action) adjustedAction = layerData.action;
+
+ direction = adjustedDirection;
+ }
+ else if(layerData.type === AvatarAnimationLayerData.FX) direction = adjustedDirection;
+
+ items = layerData.items;
+ }
+
+ removeData = animation.removeData;
+ }
+ }
+
+ let actionCache = bodyPartCache.getActionCache(adjustedAction);
+
+ if(!actionCache || forceRefresh)
+ {
+ actionCache = new AvatarImageActionCache();
+ bodyPartCache.updateActionCache(adjustedAction, actionCache);
+ }
+
+ let directionCache = actionCache.getDirectionCache(direction);
+
+ if(!directionCache || forceRefresh)
+ {
+ const partList = this._structure.getParts(key, this._avatar.getFigure(), adjustedAction, this._geometryType, direction, removeData, this._avatar, items);
+
+ directionCache = new AvatarImageDirectionCache(partList);
+
+ actionCache.updateDirectionCache(direction, directionCache);
+ }
+
+ let imageContainer = directionCache.getImageContainer(adjustedFrameCount);
+
+ if(!imageContainer || forceRefresh)
+ {
+ const partList = directionCache.getPartList();
+
+ imageContainer = this.renderBodyPart(direction, partList, adjustedFrameCount, action);
+
+ if(imageContainer && !forceRefresh)
+ {
+ if(imageContainer.isCacheable) directionCache.updateImageContainer(imageContainer, adjustedFrameCount);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ const offset = this._structure.getFrameBodyPartOffset(adjustedAction, direction, adjustedFrameCount, key);
+
+ positionOffset.x += offset.x;
+ positionOffset.y += offset.y;
+
+ imageContainer.offset = positionOffset;
+
+ return imageContainer;
+ }
+
+ public getBodyPartCache(k: string): AvatarImageBodyPartCache
+ {
+ let existing = this._cache.get(k);
+
+ if(!existing)
+ {
+ existing = new AvatarImageBodyPartCache();
+
+ this._cache.set(k, existing);
+ }
+
+ return existing;
+ }
+
+ private renderBodyPart(direction: number, containers: AvatarImagePartContainer[], frameCount: number, action: IActiveActionData): AvatarImageBodyPartContainer
+ {
+ if(!containers || !containers.length) return null;
+
+ if(!this._canvas)
+ {
+ this._canvas = this._structure.getCanvas(this._scale, this._geometryType);
+
+ if(!this._canvas) return null;
+ }
+
+ const isFlipped = AvatarDirectionAngle.DIRECTION_IS_FLIPPED[direction] || false;
+ let assetPartDefinition = action.definition.assetPartDefinition;
+ let isCacheable = true;
+ let containerIndex = (containers.length - 1);
+
+ while(containerIndex >= 0)
+ {
+ const container = containers[containerIndex];
+
+ let color = 16777215;
+
+ if(!((direction == 7) && ((container.partType === 'fc') || (container.partType === 'ey'))))
+ {
+ if(!((container.partType === 'ri') && !container.partId))
+ {
+ const partId = container.partId;
+ const animationFrame = container.getFrameDefinition(frameCount);
+
+ let partType = container.partType;
+ let frameNumber = 0;
+
+ if(animationFrame)
+ {
+ frameNumber = animationFrame.number;
+
+ if((animationFrame.assetPartDefinition) && (animationFrame.assetPartDefinition !== '')) assetPartDefinition = animationFrame.assetPartDefinition;
+ }
+ else frameNumber = container.getFrameIndex(frameCount);
+
+ let assetDirection = direction;
+ let flipH = false;
+
+ if(isFlipped)
+ {
+ if(((assetPartDefinition === 'wav') && (((partType === AvatarFigurePartType.LEFT_HAND) || (partType === AvatarFigurePartType.LEFT_SLEEVE)) || (partType === AvatarFigurePartType.LEFT_COAT_SLEEVE))) || ((assetPartDefinition === 'drk') && (((partType === AvatarFigurePartType.RIGHT_HAND) || (partType === AvatarFigurePartType.RIGHT_SLEEVE)) || (partType === AvatarFigurePartType.RIGHT_COAT_SLEEVE))) || ((assetPartDefinition === 'blw') && (partType === AvatarFigurePartType.RIGHT_HAND)) || ((assetPartDefinition === 'sig') && (partType === AvatarFigurePartType.LEFT_HAND)) || ((assetPartDefinition === 'respect') && (partType === AvatarFigurePartType.LEFT_HAND)) || (partType === AvatarFigurePartType.RIGHT_HAND_ITEM) || (partType === AvatarFigurePartType.LEFT_HAND_ITEM) || (partType === AvatarFigurePartType.CHEST_PRINT))
+ {
+ flipH = true;
+ }
+ else
+ {
+ if(direction === 4) assetDirection = 2;
+ else if(direction === 5) assetDirection = 1;
+ else if(direction === 6) assetDirection = 0;
+
+ if(container.flippedPartType !== partType) partType = container.flippedPartType;
+ }
+ }
+
+ let assetName = (this._scale + '_' + assetPartDefinition + '_' + partType + '_' + partId + '_' + assetDirection + '_' + frameNumber);
+ let asset = this._assets.getAsset(assetName);
+
+ if(!asset)
+ {
+ assetName = (this._scale + '_std_' + partType + '_' + partId + '_' + assetDirection + '_0');
+ asset = this._assets.getAsset(assetName);
+ }
+
+ if(asset)
+ {
+ const texture = asset.texture;
+
+ if(!texture || !texture.source)
+ {
+ isCacheable = false;
+ }
+ else
+ {
+ if(container.isColorable && container.color) color = container.color.rgb;
+
+ const offset = new Point(-(asset.x), -(asset.y));
+
+ if(flipH) offset.x = (offset.x + ((this._scale === AvatarScaleType.LARGE) ? 65 : 31));
+
+ this._unionImages.push(new ImageData(texture, asset.rectangle, offset, flipH, color));
+ }
+ }
+ }
+ }
+
+ containerIndex--;
+ }
+
+ if(!this._unionImages.length) return null;
+
+ const imageData = this.createUnionImage(this._unionImages, isFlipped);
+ const canvasOffset = ((this._scale === AvatarScaleType.LARGE) ? (this._canvas.height - 16) : (this._canvas.height - 8));
+ const offset = new Point(-(imageData.regPoint.x), (canvasOffset - imageData.regPoint.y));
+
+ if(isFlipped && (assetPartDefinition !== 'lay')) offset.x = (offset.x + ((this._scale === AvatarScaleType.LARGE) ? 67 : 31));
+
+ let imageIndex = (this._unionImages.length - 1);
+
+ while(imageIndex >= 0)
+ {
+ const _local_17 = this._unionImages.pop();
+
+ if(_local_17) _local_17.dispose();
+
+ imageIndex--;
+ }
+
+ return new AvatarImageBodyPartContainer(imageData.container, offset, isCacheable);
+ }
+
+ private convertColorToHex(k: number): string
+ {
+ let _local_2: string = (k * 0xFF).toString(16);
+ if(_local_2.length < 2)
+ {
+ _local_2 = ('0' + _local_2);
+ }
+ return _local_2;
+ }
+
+ private createUnionImage(k: ImageData[], isFlipped: boolean): ImageData
+ {
+ const bounds = new Rectangle();
+
+ for(const data of k) data && bounds.enlarge(data.offsetRect);
+
+ const point = new Point(-(bounds.x), -(bounds.y));
+ const container = new Container();
+
+ const sprite = new Sprite(Texture.EMPTY);
+
+ sprite.width = bounds.width;
+ sprite.height = bounds.height;
+
+ container.addChild(sprite);
+
+ for(const data of k)
+ {
+ if(!data) continue;
+
+ const regPoint = point.clone();
+
+ regPoint.x -= data.regPoint.x;
+ regPoint.y -= data.regPoint.y;
+
+ if(isFlipped) regPoint.x = (container.width - (regPoint.x + data.rect.width));
+
+ if(isFlipped != data.flipH)
+ {
+ this._matrix.a = -1;
+ this._matrix.tx = ((data.rect.x + data.rect.width) + regPoint.x);
+ this._matrix.ty = (regPoint.y - data.rect.y);
+ }
+ else
+ {
+ this._matrix.a = 1;
+ this._matrix.tx = (regPoint.x - data.rect.x);
+ this._matrix.ty = (regPoint.y - data.rect.y);
+ }
+
+ const sprite = new Sprite(data.texture);
+
+ sprite.tint = data.colorTransform;
+ sprite.setFromMatrix(this._matrix);
+
+ container.addChild(sprite);
+ }
+
+ return new ImageData(null, container.getLocalBounds().rectangle, point, isFlipped, null, container);
+ }
+}
diff --git a/packages/avatar/src/cache/AvatarImageDirectionCache.ts b/packages/avatar/src/cache/AvatarImageDirectionCache.ts
new file mode 100644
index 0000000..da3a75e
--- /dev/null
+++ b/packages/avatar/src/cache/AvatarImageDirectionCache.ts
@@ -0,0 +1,59 @@
+import { AvatarImageBodyPartContainer } from '../AvatarImageBodyPartContainer';
+import { AvatarImagePartContainer } from '../AvatarImagePartContainer';
+
+export class AvatarImageDirectionCache
+{
+ private _partList: AvatarImagePartContainer[];
+ private _images: Map;
+
+ constructor(k: AvatarImagePartContainer[])
+ {
+ this._partList = k;
+ this._images = new Map();
+ }
+
+ public dispose(): void
+ {
+ for(const image of this._images.values()) image && image.dispose();
+
+ this._images = null;
+ }
+
+ public getPartList(): AvatarImagePartContainer[]
+ {
+ return this._partList;
+ }
+
+ public getImageContainer(k: number): AvatarImageBodyPartContainer
+ {
+ const existing = this._images.get(this.getCacheKey(k));
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public updateImageContainer(k: AvatarImageBodyPartContainer, _arg_2: number): void
+ {
+ const name = this.getCacheKey(_arg_2);
+
+ const existing = this._images.get(name);
+
+ if(existing) existing.dispose();
+
+ this._images.set(name, k);
+ }
+
+ private getCacheKey(k: number): string
+ {
+ let name = '';
+
+ for(const part of this._partList) name += (part.getCacheableKey(k) + '/');
+
+ return name;
+ }
+
+ private debugInfo(k: string): void
+ {
+ }
+}
diff --git a/packages/avatar/src/cache/ImageData.ts b/packages/avatar/src/cache/ImageData.ts
new file mode 100644
index 0000000..c43c2c2
--- /dev/null
+++ b/packages/avatar/src/cache/ImageData.ts
@@ -0,0 +1,65 @@
+import { Container, Point, Rectangle, Texture } from 'pixi.js';
+
+export class ImageData
+{
+ private _texture: Texture;
+ private _container: Container;
+ private _rect: Rectangle;
+ private _regPoint: Point;
+ private _flipH: boolean;
+ private _colorTransform: number;
+
+ constructor(texture: Texture, rectangle: Rectangle, _arg_3: Point, flipH: boolean, color: number, container: Container = null)
+ {
+ this._texture = texture;
+ this._container = container;
+ this._rect = rectangle;
+ this._regPoint = _arg_3;
+ this._flipH = flipH;
+ this._colorTransform = color;
+
+ if(flipH) this._regPoint.x = (-(this._regPoint.x) + rectangle.width);
+ }
+
+ public dispose(): void
+ {
+ this._texture = null;
+ this._regPoint = null;
+ this._colorTransform = null;
+ }
+
+ public get texture(): Texture
+ {
+ return this._texture;
+ }
+
+ public get container(): Container
+ {
+ return this._container;
+ }
+
+ public get rect(): Rectangle
+ {
+ return this._rect;
+ }
+
+ public get regPoint(): Point
+ {
+ return this._regPoint;
+ }
+
+ public get flipH(): boolean
+ {
+ return this._flipH;
+ }
+
+ public get colorTransform(): number
+ {
+ return this._colorTransform;
+ }
+
+ public get offsetRect(): Rectangle
+ {
+ return new Rectangle(-(this._regPoint.x), -(this._regPoint.y), this._rect.width, this._rect.height);
+ }
+}
diff --git a/packages/avatar/src/cache/index.ts b/packages/avatar/src/cache/index.ts
new file mode 100644
index 0000000..d8d2e53
--- /dev/null
+++ b/packages/avatar/src/cache/index.ts
@@ -0,0 +1,5 @@
+export * from './AvatarImageActionCache';
+export * from './AvatarImageBodyPartCache';
+export * from './AvatarImageCache';
+export * from './AvatarImageDirectionCache';
+export * from './ImageData';
diff --git a/packages/avatar/src/data/HabboAvatarAnimations.ts b/packages/avatar/src/data/HabboAvatarAnimations.ts
new file mode 100644
index 0000000..f1fc2cc
--- /dev/null
+++ b/packages/avatar/src/data/HabboAvatarAnimations.ts
@@ -0,0 +1,827 @@
+export const HabboAvatarAnimations = {
+ 'animations': [
+ {
+ 'id': 'Move',
+ 'parts': [
+ {
+ 'setType': 'bd',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'bds',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'ss',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'lg',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'sh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'lh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'lhs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'ls',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'lc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rhs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ },
+ {
+ 'setType': 'ch',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wlk'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wlk'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Wave',
+ 'parts': [
+ {
+ 'setType': 'lh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ },
+ {
+ 'setType': 'lhs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ },
+ {
+ 'setType': 'ls',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ },
+ {
+ 'setType': 'lc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ },
+ {
+ 'setType': 'ch',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 2,
+ 'assetPartDefinition': 'wav'
+ },
+ {
+ 'number': 3,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Talk',
+ 'parts': [
+ {
+ 'setType': 'hd',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'spk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'spk'
+ }
+ ]
+ },
+ {
+ 'setType': 'fc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'spk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'spk'
+ }
+ ]
+ },
+ {
+ 'setType': 'fa',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'spk'
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'spk'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Sign',
+ 'parts': [
+ {
+ 'setType': 'lh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'sig'
+ }
+ ]
+ },
+ {
+ 'setType': 'li',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'sig'
+ }
+ ]
+ },
+ {
+ 'setType': 'ls',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ },
+ {
+ 'setType': 'lc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav'
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Respect',
+ 'parts': [
+ {
+ 'setType': 'lh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'respect',
+ 'repeats': 15
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'respect',
+ 'repeats': 15
+ }
+ ]
+ },
+ {
+ 'setType': 'ls',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav',
+ 'repeats': 15
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav',
+ 'repeats': 15
+ }
+ ]
+ },
+ {
+ 'setType': 'lc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'wav',
+ 'repeats': 15
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'wav',
+ 'repeats': 15
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Blow',
+ 'parts': [
+ {
+ 'setType': 'rh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'blw',
+ 'repeats': 10
+ },
+ {
+ 'number': 1,
+ 'assetPartDefinition': 'blw',
+ 'repeats': 10
+ }
+ ]
+ },
+ {
+ 'setType': 'rs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'drk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'drk'
+ }
+ ]
+ },
+ {
+ 'setType': 'ri',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': ''
+ }
+ ]
+ },
+ {
+ 'setType': 'ey',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'std',
+ 'repeats': 10
+ },
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'eyb',
+ 'repeats': 10
+ }
+ ]
+ },
+ {
+ 'setType': 'fc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'std',
+ 'repeats': 10
+ },
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'blw',
+ 'repeats': 10
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'Laugh',
+ 'parts': [
+ {
+ 'setType': 'rh',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'blw'
+ }
+ ]
+ },
+ {
+ 'setType': 'rs',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'drk'
+ }
+ ]
+ },
+ {
+ 'setType': 'rc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'drk'
+ }
+ ]
+ },
+ {
+ 'setType': 'ri',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': ''
+ }
+ ]
+ },
+ {
+ 'setType': 'ey',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'std',
+ 'repeats': 2
+ }
+ ]
+ },
+ {
+ 'setType': 'fc',
+ 'frames': [
+ {
+ 'number': 0,
+ 'assetPartDefinition': 'sml'
+ }
+ ]
+ }
+ ],
+ 'offsets': {
+ 'frames': [
+ {
+ 'id': 0,
+ 'directions': [
+ {
+ 'id': 0,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 1,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 2,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 3,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 4,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 5,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 6,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ },
+ {
+ 'id': 7,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 1
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 1,
+ 'directions': [
+ {
+ 'id': 0,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 1,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 2,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 3,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 4,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 5,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 6,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ },
+ {
+ 'id': 7,
+ 'bodyParts': [
+ {
+ 'id': 'head',
+ 'dx': 0,
+ 'dy': 0
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+};
diff --git a/packages/avatar/src/data/HabboAvatarGeometry.ts b/packages/avatar/src/data/HabboAvatarGeometry.ts
new file mode 100644
index 0000000..e6b9db0
--- /dev/null
+++ b/packages/avatar/src/data/HabboAvatarGeometry.ts
@@ -0,0 +1,1830 @@
+export const HabboAvatarGeometry = {
+ 'geometry': {
+ 'direction': 0,
+ 'camera': {
+ 'x': 0,
+ 'y': 0,
+ 'z': 10
+ },
+ 'canvases': [
+ {
+ 'scale': 'h',
+ 'geometries': [
+ {
+ 'id': 'vertical',
+ 'width': 90,
+ 'height': 130,
+ 'dx': 0,
+ 'dy': 0
+ },
+ {
+ 'id': 'sitting',
+ 'width': 90,
+ 'height': 130,
+ 'dx': 0,
+ 'dy': 0
+ },
+ {
+ 'id': 'horizontal',
+ 'width': 128,
+ 'height': 80,
+ 'dx': 30,
+ 'dy': 0
+ },
+ {
+ 'id': 'swhorizontal',
+ 'width': 192,
+ 'height': 120,
+ 'dx': 0,
+ 'dy': -40
+ }
+ ]
+ },
+ {
+ 'scale': 'sh',
+ 'geometries': [
+ {
+ 'id': 'vertical',
+ 'width': 45,
+ 'height': 72,
+ 'dx': 0,
+ 'dy': 0
+ },
+ {
+ 'id': 'sitting',
+ 'width': 45,
+ 'height': 72,
+ 'dx': 0,
+ 'dy': 0
+ },
+ {
+ 'id': 'horizontal',
+ 'width': 64,
+ 'height': 50,
+ 'dx': 15,
+ 'dy': -10
+ },
+ {
+ 'id': 'swhorizontal',
+ 'width': 96,
+ 'height': 70,
+ 'dx': 0,
+ 'dy': -20
+ },
+ {
+ 'id': 'swim',
+ 'width': 64,
+ 'height': 70,
+ 'dx': 25,
+ 'dy': 10
+ }
+ ]
+ }
+ ],
+ 'avatarSets': [
+ {
+ 'id': 'full',
+ 'avatarSets': [
+ {
+ 'id': 'body',
+ 'main': true,
+ 'bodyParts': [
+ {
+ 'id': 'top'
+ },
+ {
+ 'id': 'bottom'
+ },
+ {
+ 'id': 'behind'
+ },
+ {
+ 'id': 'torso'
+ },
+ {
+ 'id': 'leftitem'
+ },
+ {
+ 'id': 'rightitem'
+ },
+ {
+ 'id': 'leftarm'
+ },
+ {
+ 'id': 'rightarm'
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'bodyParts': [
+ {
+ 'id': 'head'
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ 'types': [
+ {
+ 'id': 'vertical',
+ 'bodyParts': [
+ {
+ 'id': 'top',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 2.0
+ },
+ {
+ 'id': 'bottom',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.001
+ },
+ {
+ 'id': 'behind',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.2,
+ 'radius': 0.3
+ },
+ {
+ 'id': 'torso',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.4,
+ 'items': [
+ {
+ 'id': 'bd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'bds',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'ch',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'sh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lg',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ss',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cp',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.045,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'wa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ca',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'li',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'ri',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftarm',
+ 'x': -1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'lh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ls',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightarm',
+ 'x': 1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'rh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'hd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ey',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'hr',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'hrb',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ea',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ha',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.08,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'he',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.09,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'sitting',
+ 'bodyParts': [
+ {
+ 'id': 'top',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 2.0
+ },
+ {
+ 'id': 'bottom',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.001
+ },
+ {
+ 'id': 'behind',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.2,
+ 'radius': 0.3
+ },
+ {
+ 'id': 'torso',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.4,
+ 'items': [
+ {
+ 'id': 'bd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'bds',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'ch',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'sh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lg',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ss',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cp',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.045,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'wa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ca',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'li',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'ri',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftarm',
+ 'x': -1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'lh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ls',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightarm',
+ 'x': 1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'rh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'hd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ey',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'hr',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'hrb',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ea',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ha',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.08,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'he',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.09,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'horizontal',
+ 'bodyParts': [
+ {
+ 'id': 'torso',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.4,
+ 'items': [
+ {
+ 'id': 'bd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'bds',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'ch',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cp',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'sh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lg',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ss',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'wa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ca',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'li',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'ri',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftarm',
+ 'x': -1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.6,
+ 'items': [
+ {
+ 'id': 'lh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ls',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightarm',
+ 'x': 1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.6,
+ 'items': [
+ {
+ 'id': 'rh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'hd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ey',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'hr',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'hrb',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ea',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ha',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.08,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'he',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.09,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'swhorizontal',
+ 'bodyParts': [
+ {
+ 'id': 'torso',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.4,
+ 'items': [
+ {
+ 'id': 'bd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'bds',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'ch',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cp',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'sh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lg',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ss',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'wa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'cc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ca',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'li',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightitem',
+ 'x': 0,
+ 'y': 0,
+ 'z': -0.29,
+ 'radius': 0.3,
+ 'items': [
+ {
+ 'id': 'ri',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'leftarm',
+ 'x': -1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.6,
+ 'items': [
+ {
+ 'id': 'lh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ls',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'lc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'rightarm',
+ 'x': 1,
+ 'y': 0,
+ 'z': -0.51,
+ 'radius': 0.6,
+ 'items': [
+ {
+ 'id': 'rh',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rhs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rs',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'rc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.025,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'hd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ey',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'hr',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'hrb',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ea',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ha',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.08,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'he',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.09,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ }
+ ]
+ },
+ {
+ 'id': 'swim',
+ 'bodyParts': [
+ {
+ 'id': 'torso',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0.0,
+ 'radius': 0.4,
+ 'items': [
+ {
+ 'id': 'bds',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'ss',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.5,
+ 'items': [
+ {
+ 'id': 'hd',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.01,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fc',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.02,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ey',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.03,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'hr',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.04,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'hrb',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.05,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': true
+ },
+ {
+ 'id': 'fa',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.06,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ea',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.07,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'ha',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.08,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ },
+ {
+ 'id': 'he',
+ 'x': 0,
+ 'y': 0,
+ 'z': 0,
+ 'radius': 0.09,
+ 'nx': 0,
+ 'ny': 0,
+ 'nz': -1,
+ 'double': false
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+};
diff --git a/packages/avatar/src/data/HabboAvatarPartSets.ts b/packages/avatar/src/data/HabboAvatarPartSets.ts
new file mode 100644
index 0000000..1bd4750
--- /dev/null
+++ b/packages/avatar/src/data/HabboAvatarPartSets.ts
@@ -0,0 +1,418 @@
+export const HabboAvatarPartSets = {
+ 'partSets': {
+ 'partSet': [
+ {
+ 'setType': 'ri',
+ 'flippedSetType': 'ri'
+ },
+ {
+ 'setType': 'ri',
+ 'flippedSetType': 'ri'
+ },
+ {
+ 'setType': 'rh',
+ 'flippedSetType': 'lh'
+ },
+ {
+ 'setType': 'rhs',
+ 'flippedSetType': 'lhs'
+ },
+ {
+ 'setType': 'rs',
+ 'swim': '0',
+ 'flippedSetType': 'ls'
+ },
+ {
+ 'setType': 'rc',
+ 'flippedSetType': 'lc'
+ },
+ {
+ 'setType': 'bd'
+ },
+ {
+ 'setType': 'bds'
+ },
+ {
+ 'setType': 'ss'
+ },
+ {
+ 'setType': 'sh'
+ },
+ {
+ 'setType': 'lg'
+ },
+ {
+ 'setType': 'ch'
+ },
+ {
+ 'setType': 'cp'
+ },
+ {
+ 'setType': 'cc'
+ },
+ {
+ 'setType': 'hd'
+ },
+ {
+ 'setType': 'fc'
+ },
+ {
+ 'setType': 'ey'
+ },
+ {
+ 'setType': 'hr'
+ },
+ {
+ 'setType': 'hrb',
+ 'removeSetType': 'hr'
+ },
+ {
+ 'setType': 'li',
+ 'flippedSetType': 'li'
+ },
+ {
+ 'setType': 'lh',
+ 'flippedSetType': 'rh'
+ },
+ {
+ 'setType': 'lhs',
+ 'flippedSetType': 'rhs'
+ },
+ {
+ 'setType': 'ls',
+ 'flippedSetType': 'rs'
+ },
+ {
+ 'setType': 'lc',
+ 'flippedSetType': 'rc'
+ },
+ {
+ 'setType': 'wa'
+ },
+ {
+ 'setType': 'ea'
+ },
+ {
+ 'setType': 'ca'
+ },
+ {
+ 'setType': 'fa'
+ },
+ {
+ 'setType': 'ha'
+ },
+ {
+ 'setType': 'he'
+ }
+ ],
+ 'activePartSets': [
+ {
+ 'id': 'figure',
+ 'activeParts': [
+ {
+ 'setType': 'rh'
+ },
+ {
+ 'setType': 'rh'
+ },
+ {
+ 'setType': 'rhs'
+ },
+ {
+ 'setType': 'rs'
+ },
+ {
+ 'setType': 'rc'
+ },
+ {
+ 'setType': 'bd'
+ },
+ {
+ 'setType': 'bds'
+ },
+ {
+ 'setType': 'ss'
+ },
+ {
+ 'setType': 'sh'
+ },
+ {
+ 'setType': 'lg'
+ },
+ {
+ 'setType': 'ch'
+ },
+ {
+ 'setType': 'cp'
+ },
+ {
+ 'setType': 'cc'
+ },
+ {
+ 'setType': 'wa'
+ },
+ {
+ 'setType': 'hd'
+ },
+ {
+ 'setType': 'fc'
+ },
+ {
+ 'setType': 'ey'
+ },
+ {
+ 'setType': 'hr'
+ },
+ {
+ 'setType': 'hrb'
+ },
+ {
+ 'setType': 'lh'
+ },
+ {
+ 'setType': 'lhs'
+ },
+ {
+ 'setType': 'ls'
+ },
+ {
+ 'setType': 'lc'
+ },
+ {
+ 'setType': 'ea'
+ },
+ {
+ 'setType': 'ca'
+ },
+ {
+ 'setType': 'fa'
+ },
+ {
+ 'setType': 'ha'
+ },
+ {
+ 'setType': 'he'
+ }
+ ]
+ },
+ {
+ 'id': 'head',
+ 'activeParts': [
+ {
+ 'setType': 'hd'
+ },
+ {
+ 'setType': 'fc'
+ },
+ {
+ 'setType': 'ey'
+ },
+ {
+ 'setType': 'hr'
+ },
+ {
+ 'setType': 'hrb'
+ },
+ {
+ 'setType': 'ea'
+ },
+ {
+ 'setType': 'fa'
+ },
+ {
+ 'setType': 'ha'
+ },
+ {
+ 'setType': 'he'
+ }
+ ]
+ },
+ {
+ 'id': 'speak',
+ 'activeParts': [
+ {
+ 'setType': 'hd'
+ },
+ {
+ 'setType': 'hr'
+ },
+ {
+ 'setType': 'hrb'
+ },
+ {
+ 'setType': 'fc'
+ },
+ {
+ 'setType': 'fa'
+ },
+ {
+ 'setType': 'ha'
+ }
+ ]
+ },
+ {
+ 'id': 'gesture',
+ 'activeParts': [
+ {
+ 'setType': 'ey'
+ },
+ {
+ 'setType': 'fc'
+ }
+ ]
+ },
+ {
+ 'id': 'eye',
+ 'activeParts': [
+ {
+ 'setType': 'ey'
+ }
+ ]
+ },
+ {
+ 'id': 'handRight',
+ 'activeParts': [
+ {
+ 'setType': 'rh'
+ },
+ {
+ 'setType': 'rhs'
+ },
+ {
+ 'setType': 'rs'
+ },
+ {
+ 'setType': 'rc'
+ },
+ {
+ 'setType': 'ri'
+ }
+ ]
+ },
+ {
+ 'id': 'handRightAndHead',
+ 'activeParts': [
+ {
+ 'setType': 'rh'
+ },
+ {
+ 'setType': 'rhs'
+ },
+ {
+ 'setType': 'rs'
+ },
+ {
+ 'setType': 'rc'
+ },
+ {
+ 'setType': 'ri'
+ },
+ {
+ 'setType': 'ey'
+ },
+ {
+ 'setType': 'fc'
+ },
+ {
+ 'setType': 'hd'
+ }
+ ]
+ },
+ {
+ 'id': 'handLeft',
+ 'activeParts': [
+ {
+ 'setType': 'lh'
+ },
+ {
+ 'setType': 'lhs'
+ },
+ {
+ 'setType': 'ls'
+ },
+ {
+ 'setType': 'lc'
+ },
+ {
+ 'setType': 'li'
+ }
+ ]
+ },
+ {
+ 'id': 'walk',
+ 'activeParts': [
+ {
+ 'setType': 'bd'
+ },
+ {
+ 'setType': 'bds'
+ },
+ {
+ 'setType': 'ss'
+ },
+ {
+ 'setType': 'lg'
+ },
+ {
+ 'setType': 'lh'
+ },
+ {
+ 'setType': 'lhs'
+ },
+ {
+ 'setType': 'rh'
+ },
+ {
+ 'setType': 'rhs'
+ },
+ {
+ 'setType': 'ls'
+ },
+ {
+ 'setType': 'lc'
+ },
+ {
+ 'setType': 'rs'
+ },
+ {
+ 'setType': 'rc'
+ },
+ {
+ 'setType': 'sh'
+ }
+ ]
+ },
+ {
+ 'id': 'sit',
+ 'activeParts': [
+ {
+ 'setType': 'bd'
+ },
+ {
+ 'setType': 'bds'
+ },
+ {
+ 'setType': 'ss'
+ },
+ {
+ 'setType': 'lg'
+ },
+ {
+ 'setType': 'sh'
+ },
+ {
+ 'setType': 'cc'
+ }
+ ]
+ },
+ {
+ 'id': 'itemRight',
+ 'activeParts': [
+ {
+ 'setType': 'ri'
+ }
+ ]
+ }
+ ]
+ }
+};
diff --git a/packages/avatar/src/geometry/AvatarModelGeometry.ts b/packages/avatar/src/geometry/AvatarModelGeometry.ts
new file mode 100644
index 0000000..821e7f7
--- /dev/null
+++ b/packages/avatar/src/geometry/AvatarModelGeometry.ts
@@ -0,0 +1,287 @@
+import { IAvatarImage } from '@nitrots/api';
+import { Vector3d } from '@nitrots/utils';
+import { Matrix4x4 } from '@nitrots/utils/src/Matrix4x4';
+import { AvatarCanvas } from '../structure';
+import { AvatarSet } from './AvatarSet';
+import { GeometryBodyPart } from './GeometryBodyPart';
+
+export class AvatarModelGeometry
+{
+ private _camera: Vector3d;
+ private _avatarSet: AvatarSet;
+ private _geometryTypes: Map>;
+ private _itemIdToBodyPartMap: Map>;
+ private _transformation: Matrix4x4;
+ private _canvases: Map>;
+
+ constructor(k: any)
+ {
+ this._camera = new Vector3d(0, 0, 10);
+ this._avatarSet = new AvatarSet(k.avatarSets[0]);
+ this._geometryTypes = new Map();
+ this._itemIdToBodyPartMap = new Map();
+ this._transformation = new Matrix4x4();
+ this._canvases = new Map();
+
+ const camera = k.camera;
+
+ if(camera)
+ {
+ this._camera.x = parseFloat(camera.x);
+ this._camera.y = parseFloat(camera.y);
+ this._camera.z = parseFloat(camera.z);
+ }
+
+ if(k.canvases && (k.canvases.length > 0))
+ {
+ for(const canvas of k.canvases)
+ {
+ if(!canvas) continue;
+
+ const scale = canvas.scale;
+ const geometries = new Map();
+
+ if(canvas.geometries && (canvas.geometries.length > 0))
+ {
+ for(const geometry of canvas.geometries)
+ {
+ if(!geometry) continue;
+
+ const avatarCanvas = new AvatarCanvas(geometry, scale);
+
+ geometries.set(avatarCanvas.id, avatarCanvas);
+ }
+ }
+
+ this._canvases.set(scale, geometries);
+ }
+ }
+
+ if(k.types && (k.types.length > 0))
+ {
+ for(const type of k.types)
+ {
+ if(!type) continue;
+
+ const bodyParts: Map = new Map();
+ const itemIds: Map = new Map();
+
+ if(type.bodyParts && (type.bodyParts.length > 0))
+ {
+ for(const bodyPart of type.bodyParts)
+ {
+ if(!bodyPart) continue;
+
+ const geometryBodyPart = new GeometryBodyPart(bodyPart);
+
+ bodyParts.set(geometryBodyPart.id, geometryBodyPart);
+
+ for(const part of geometryBodyPart.getPartIds(null))
+ {
+ itemIds.set(part, geometryBodyPart);
+ }
+ }
+ }
+
+ this._geometryTypes.set(type.id, bodyParts);
+ this._itemIdToBodyPartMap.set(type.id, itemIds);
+ }
+ }
+ }
+
+ public removeDynamicItems(k: IAvatarImage): void
+ {
+ for(const geometry of this._geometryTypes.values())
+ {
+ if(!geometry) continue;
+
+ for(const part of geometry.values())
+ {
+ if(!part) continue;
+
+ part.removeDynamicParts(k);
+ }
+ }
+ }
+
+ public getBodyPartIdsInAvatarSet(k: string): string[]
+ {
+ const avatarSet = this._avatarSet.findAvatarSet(k);
+
+ if(!avatarSet) return [];
+
+ return avatarSet.getBodyParts();
+ }
+
+ public isMainAvatarSet(k: string): boolean
+ {
+ const avatarSet = this._avatarSet.findAvatarSet(k);
+
+ if(!avatarSet) return false;
+
+ return avatarSet.isMain;
+ }
+
+ public getCanvas(k: string, _arg_2: string): AvatarCanvas
+ {
+ const canvas = this._canvases.get(k);
+
+ if(!canvas) return null;
+
+ return (canvas.get(_arg_2) || null);
+ }
+
+ private typeExists(k: string): boolean
+ {
+ const existing = this._geometryTypes.get(k);
+
+ if(existing) return true;
+
+ return false;
+ }
+
+ private hasBodyPart(k: string, _arg_2: string): boolean
+ {
+ if(this.typeExists(k))
+ {
+ const existing = this._geometryTypes.get(k);
+
+ if(existing && existing.get(_arg_2)) return true;
+ }
+
+ return false;
+ }
+
+ private getBodyPartIDs(k: string): string[]
+ {
+ const parts = this.getBodyPartsOfType(k);
+
+ const types = [];
+
+ if(parts)
+ {
+ for(const part of parts.values())
+ {
+ if(!part) continue;
+
+ types.push(part.id);
+ }
+ }
+
+ return types;
+ }
+
+ private getBodyPartsOfType(k: string): Map
+ {
+ if(this.typeExists(k)) return this._geometryTypes.get(k);
+
+ return new Map();
+ }
+
+ public getBodyPart(k: string, _arg_2: string): GeometryBodyPart
+ {
+ return (this.getBodyPartsOfType(k).get(_arg_2) || null);
+ }
+
+ public getBodyPartOfItem(k: string, _arg_2: string, _arg_3: IAvatarImage): GeometryBodyPart
+ {
+ const itemIds = this._itemIdToBodyPartMap.get(k);
+
+ if(itemIds)
+ {
+ const part = itemIds.get(_arg_2);
+
+ if(part) return part;
+
+ const parts = this.getBodyPartsOfType(k);
+
+ if(parts)
+ {
+ for(const part of parts.values())
+ {
+ if(!part) continue;
+
+ if(part.hasPart(_arg_2, _arg_3)) return part;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private getBodyPartsInAvatarSet(k: Map, _arg_2: string): GeometryBodyPart[]
+ {
+ const parts = this.getBodyPartIdsInAvatarSet(_arg_2);
+ const geometryParts = [];
+
+ for(const part of parts)
+ {
+ if(!part) continue;
+
+ const bodyPart = k.get(part);
+
+ if(bodyPart)
+ {
+ geometryParts.push(bodyPart);
+ }
+ }
+
+ return geometryParts;
+ }
+
+ public getBodyPartsAtAngle(k: string, _arg_2: number, _arg_3: string): string[]
+ {
+ if(!_arg_3) return [];
+
+ const geometryParts = this.getBodyPartsOfType(_arg_3);
+ const parts = this.getBodyPartsInAvatarSet(geometryParts, k);
+ const sets: [number, GeometryBodyPart][] = [];
+ const ids: string[] = [];
+
+ this._transformation = Matrix4x4.getYRotationMatrix(_arg_2);
+
+ for(const part of parts.values())
+ {
+ if(!part) continue;
+
+ part.applyTransform(this._transformation);
+
+ sets.push([part.getDistance(this._camera), part]);
+ }
+
+ sets.sort((a, b) =>
+ {
+ const partA = a[0];
+ const partB = b[0];
+
+ if(partA < partB) return -1;
+
+ if(partA > partB) return 1;
+
+ return 0;
+ });
+
+ for(const set of sets)
+ {
+ if(!set) continue;
+
+ ids.push(set[1].id);
+ }
+
+ return ids;
+ }
+
+ public getParts(k: string, _arg_2: string, _arg_3: number, _arg_4: any[], _arg_5: IAvatarImage): string[]
+ {
+ if(this.hasBodyPart(k, _arg_2))
+ {
+ const part = this.getBodyPartsOfType(k).get(_arg_2);
+
+ this._transformation = Matrix4x4.getYRotationMatrix(_arg_3);
+
+ return part.getParts(this._transformation, this._camera, _arg_4, _arg_5);
+ }
+
+ return [];
+ }
+}
diff --git a/packages/avatar/src/geometry/AvatarSet.ts b/packages/avatar/src/geometry/AvatarSet.ts
new file mode 100644
index 0000000..2dee804
--- /dev/null
+++ b/packages/avatar/src/geometry/AvatarSet.ts
@@ -0,0 +1,92 @@
+export class AvatarSet
+{
+ private _id: string;
+ private _isMain: boolean;
+ private _avatarSets: Map;
+ private _bodyParts: string[];
+ private _allBodyParts: string[];
+
+ constructor(k: any)
+ {
+ this._id = k.id;
+ this._isMain = k.main || false;
+ this._avatarSets = new Map();
+ this._bodyParts = [];
+ this._allBodyParts = [];
+
+ if(k.avatarSets && (k.avatarSets.length > 0))
+ {
+ for(const avatarSet of k.avatarSets)
+ {
+ if(!avatarSet) continue;
+
+ const set = new AvatarSet(avatarSet);
+
+ this._avatarSets.set(set.id, set);
+ }
+ }
+
+ if(k.bodyParts && (k.bodyParts.length > 0))
+ {
+ for(const bodyPart of k.bodyParts)
+ {
+ if(!bodyPart) continue;
+
+ this._bodyParts.push(bodyPart.id);
+ }
+ }
+
+ let bodyParts = this._bodyParts.concat();
+
+ for(const avatarSet of this._avatarSets.values())
+ {
+ if(!avatarSet) continue;
+
+ bodyParts = bodyParts.concat(avatarSet.getBodyParts());
+ }
+
+ this._allBodyParts = bodyParts;
+ }
+
+ public findAvatarSet(k: string): AvatarSet
+ {
+ if(k === this._id) return this;
+
+ for(const avatarSet of this._avatarSets.values())
+ {
+ if(!avatarSet) continue;
+
+ if(!avatarSet.findAvatarSet(k)) continue;
+
+ return avatarSet;
+ }
+
+ return null;
+ }
+
+ public getBodyParts(): string[]
+ {
+ return this._allBodyParts.concat();
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get isMain(): boolean
+ {
+ if(this._isMain) return true;
+
+ for(const avatarSet of this._avatarSets.values())
+ {
+ if(!avatarSet) continue;
+
+ if(!avatarSet.isMain) continue;
+
+ return true;
+ }
+
+ return false;
+ }
+}
diff --git a/packages/avatar/src/geometry/GeometryBodyPart.ts b/packages/avatar/src/geometry/GeometryBodyPart.ts
new file mode 100644
index 0000000..4d61c93
--- /dev/null
+++ b/packages/avatar/src/geometry/GeometryBodyPart.ts
@@ -0,0 +1,192 @@
+import { IAvatarImage } from '@nitrots/api';
+import { Matrix4x4, Node3D, Vector3d } from '@nitrots/utils';
+import { GeometryItem } from './GeometryItem';
+
+export class GeometryBodyPart extends Node3D
+{
+ private _id: string;
+ private _radius: number;
+ private _parts: Map;
+ private _dynamicParts: Map;
+
+ constructor(k: any)
+ {
+ super(parseFloat(k.x), parseFloat(k.y), parseFloat(k.z));
+
+ this._id = k.id;
+ this._radius = parseFloat(k.radius);
+ this._parts = new Map();
+ this._dynamicParts = new Map();
+
+ if(k.items && (k.items.length > 0))
+ {
+ for(const item of k.items)
+ {
+ if(!item) continue;
+
+ const geometryItem = new GeometryItem(item);
+
+ this._parts.set(geometryItem.id, geometryItem);
+ }
+ }
+ }
+
+ public getDynamicParts(k: IAvatarImage): GeometryItem[]
+ {
+ const existing = this._dynamicParts.get(k);
+ const parts: GeometryItem[] = [];
+
+ if(existing)
+ {
+ for(const index in existing)
+ {
+ const item = existing[index];
+
+ if(!item) continue;
+
+ parts.push(item);
+ }
+ }
+
+ return parts;
+ }
+
+ public getPartIds(k: IAvatarImage): string[]
+ {
+ const ids: string[] = [];
+
+ for(const part of this._parts.values())
+ {
+ if(!part) continue;
+
+ ids.push(part.id);
+ }
+
+ if(k)
+ {
+ const existing = this._dynamicParts.get(k);
+
+ if(existing)
+ {
+ for(const index in existing)
+ {
+ const part = existing[index];
+
+ if(!part) continue;
+
+ ids.push(part.id);
+ }
+ }
+ }
+
+ return ids;
+ }
+
+ public removeDynamicParts(k: IAvatarImage): boolean
+ {
+ this._dynamicParts.delete(k);
+
+ return true;
+ }
+
+ public addPart(k: any, _arg_2: IAvatarImage): boolean
+ {
+ if(this.hasPart(k.id, _arg_2)) return false;
+
+ let existing = this._dynamicParts.get(_arg_2);
+
+ if(!existing)
+ {
+ existing = {};
+
+ this._dynamicParts.set(_arg_2, existing);
+ }
+
+ existing[k.id] = new GeometryItem(k, true);
+
+ return true;
+ }
+
+ public hasPart(k: string, _arg_2: IAvatarImage): boolean
+ {
+ let existingPart = (this._parts.get(k) || null);
+
+ if(!existingPart && (this._dynamicParts.get(_arg_2) !== undefined))
+ {
+ existingPart = (this._dynamicParts.get(_arg_2)[k] || null);
+ }
+
+ return (existingPart !== null);
+ }
+
+ public getParts(k: Matrix4x4, _arg_2: Vector3d, _arg_3: any[], _arg_4: IAvatarImage): string[]
+ {
+ const parts: [number, GeometryItem][] = [];
+
+ for(const part of this._parts.values())
+ {
+ if(!part) continue;
+
+ part.applyTransform(k);
+
+ parts.push([part.getDistance(_arg_2), part]);
+ }
+
+ const existingDynamic = this._dynamicParts.get(_arg_4);
+
+ if(existingDynamic)
+ {
+ for(const index in existingDynamic)
+ {
+ const part = existingDynamic[index];
+
+ if(!part) continue;
+
+ part.applyTransform(k);
+
+ parts.push([part.getDistance(_arg_2), part]);
+ }
+ }
+
+ parts.sort((a, b) =>
+ {
+ const partA = a[0];
+ const partB = b[0];
+
+ if(partA < partB) return -1;
+
+ if(partA > partB) return 1;
+
+ return 0;
+ });
+
+ const partIds: string[] = [];
+
+ for(const part of parts)
+ {
+ if(!part) continue;
+
+ partIds.push(part[1].id);
+ }
+
+ return partIds;
+ }
+
+ public getDistance(k: Vector3d): number
+ {
+ const _local_2 = Math.abs(((k.z - this.transformedLocation.z) - this._radius));
+ const _local_3 = Math.abs(((k.z - this.transformedLocation.z) + this._radius));
+
+ return Math.min(_local_2, _local_3);
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get radius(): number
+ {
+ return this._radius;
+ }
+}
diff --git a/packages/avatar/src/geometry/GeometryItem.ts b/packages/avatar/src/geometry/GeometryItem.ts
new file mode 100644
index 0000000..3aea172
--- /dev/null
+++ b/packages/avatar/src/geometry/GeometryItem.ts
@@ -0,0 +1,54 @@
+import { Node3D, Vector3d } from '@nitrots/utils';
+
+export class GeometryItem extends Node3D
+{
+ private _id: string;
+ private _radius: number;
+ private _normal: Vector3d;
+ private _isDoubleSided: boolean;
+ private _isDynamic: boolean;
+
+ constructor(k: any, _arg_2: boolean = false)
+ {
+ super(parseFloat(k.x), parseFloat(k.y), parseFloat(k.z));
+
+ this._id = k.id;
+ this._radius = parseFloat(k.radius);
+ this._normal = new Vector3d(parseFloat(k.nx), parseFloat(k.ny), parseFloat(k.nz));
+ this._isDoubleSided = k.double || false;
+ this._isDynamic = _arg_2;
+ }
+
+ public getDistance(k: Vector3d): number
+ {
+ const _local_2 = Math.abs(((k.z - this.transformedLocation.z) - this._radius));
+ const _local_3 = Math.abs(((k.z - this.transformedLocation.z) + this._radius));
+
+ return Math.min(_local_2, _local_3);
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get normal(): Vector3d
+ {
+ return this._normal;
+ }
+
+ public get isDoubleSided(): boolean
+ {
+ return this._isDoubleSided;
+ }
+
+ public toString(): string
+ {
+ return ((((this._id + ': ') + this.location) + ' - ') + this.transformedLocation);
+ }
+
+ public get isDynamic(): boolean
+ {
+ return this._isDynamic;
+ }
+}
diff --git a/packages/avatar/src/geometry/index.ts b/packages/avatar/src/geometry/index.ts
new file mode 100644
index 0000000..0eb1361
--- /dev/null
+++ b/packages/avatar/src/geometry/index.ts
@@ -0,0 +1,4 @@
+export * from './AvatarModelGeometry';
+export * from './AvatarSet';
+export * from './GeometryBodyPart';
+export * from './GeometryItem';
diff --git a/packages/avatar/src/index.ts b/packages/avatar/src/index.ts
new file mode 100644
index 0000000..8a429ea
--- /dev/null
+++ b/packages/avatar/src/index.ts
@@ -0,0 +1,25 @@
+export * from './AvatarAssetDownloadLibrary';
+export * from './AvatarAssetDownloadManager';
+export * from './AvatarFigureContainer';
+export * from './AvatarImage';
+export * from './AvatarImageBodyPartContainer';
+export * from './AvatarImagePartContainer';
+export * from './AvatarRenderManager';
+export * from './AvatarStructure';
+export * from './EffectAssetDownloadLibrary';
+export * from './EffectAssetDownloadManager';
+export * from './FigureDataContainer';
+export * from './GetAvatarRenderManager';
+export * from './PlaceHolderAvatarImage';
+export * from './actions';
+export * from './alias';
+export * from './animation';
+export * from './cache';
+export * from './data/HabboAvatarAnimations';
+export * from './data/HabboAvatarGeometry';
+export * from './data/HabboAvatarPartSets';
+export * from './geometry';
+export * from './structure';
+export * from './structure/animation';
+export * from './structure/figure';
+export * from './structure/parts';
diff --git a/packages/avatar/src/structure/AvatarAnimationData.ts b/packages/avatar/src/structure/AvatarAnimationData.ts
new file mode 100644
index 0000000..fd78ccc
--- /dev/null
+++ b/packages/avatar/src/structure/AvatarAnimationData.ts
@@ -0,0 +1,57 @@
+import { IActionDefinition, IFigureSetData } from '@nitrots/api';
+import { AnimationAction } from './animation';
+
+export class AvatarAnimationData implements IFigureSetData
+{
+ private _actions: Map;
+
+ constructor()
+ {
+ this._actions = new Map();
+ }
+
+ public parse(data: any): boolean
+ {
+ if(data && (data.length > 0))
+ {
+ for(const animation of data)
+ {
+ if(!animation) continue;
+
+ const newAnimation = new AnimationAction(animation);
+
+ this._actions.set(newAnimation.id, newAnimation);
+ }
+ }
+
+ return true;
+ }
+
+ public appendJSON(k: any): boolean
+ {
+ for(const _local_2 of k.action)
+ {
+ this._actions.set(_local_2.id, new AnimationAction(_local_2));
+ }
+
+ return true;
+ }
+
+ public getAction(action: IActionDefinition): AnimationAction
+ {
+ const existing = this._actions.get(action.id);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getFrameCount(k: IActionDefinition): number
+ {
+ const animationAction = this.getAction(k);
+
+ if(!animationAction) return 0;
+
+ return animationAction.frameCount;
+ }
+}
diff --git a/packages/avatar/src/structure/AvatarCanvas.ts b/packages/avatar/src/structure/AvatarCanvas.ts
new file mode 100644
index 0000000..69a01a6
--- /dev/null
+++ b/packages/avatar/src/structure/AvatarCanvas.ts
@@ -0,0 +1,47 @@
+import { AvatarScaleType } from '@nitrots/api';
+import { Point } from 'pixi.js';
+
+export class AvatarCanvas
+{
+ private _id: string;
+ private _width: number;
+ private _height: number;
+ private _offset: Point;
+ private _regPoint: Point;
+
+ constructor(k: any, _arg_2: string)
+ {
+ this._id = k.id;
+ this._width = k.width;
+ this._height = k.height;
+ this._offset = new Point(k.dx, k.dy);
+
+ if(_arg_2 == AvatarScaleType.LARGE) this._regPoint = new Point(((this._width - 64) / 2), 0);
+ else this._regPoint = new Point(((this._width - 32) / 2), 0);
+ }
+
+ public get width(): number
+ {
+ return this._width;
+ }
+
+ public get height(): number
+ {
+ return this._height;
+ }
+
+ public get offset(): Point
+ {
+ return this._offset;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get regPoint(): Point
+ {
+ return this._regPoint;
+ }
+}
diff --git a/packages/avatar/src/structure/FigureSetData.ts b/packages/avatar/src/structure/FigureSetData.ts
new file mode 100644
index 0000000..ff7d218
--- /dev/null
+++ b/packages/avatar/src/structure/FigureSetData.ts
@@ -0,0 +1,129 @@
+import { IFigureData, IFigurePartSet, IFigureSetData, IPalette, ISetType, IStructureData } from '@nitrots/api';
+import { Palette, SetType } from './figure';
+
+export class FigureSetData implements IFigureSetData, IStructureData
+{
+ private _palettes: Map;
+ private _setTypes: Map;
+
+ constructor()
+ {
+ this._palettes = new Map();
+ this._setTypes = new Map();
+ }
+
+ public dispose(): void
+ {
+
+ }
+
+ public parse(data: IFigureData): boolean
+ {
+ if(!data) return false;
+
+ for(const palette of data.palettes)
+ {
+ const newPalette = new Palette(palette);
+
+ if(!newPalette) continue;
+
+ this._palettes.set(newPalette.id.toString(), newPalette);
+ }
+
+ for(const set of data.setTypes)
+ {
+ const newSet = new SetType(set);
+
+ if(!newSet) continue;
+
+ this._setTypes.set(newSet.type, newSet);
+ }
+
+ return true;
+ }
+
+ public injectJSON(data: IFigureData): void
+ {
+ for(const setType of data.setTypes)
+ {
+ const existingSetType = this._setTypes.get(setType.type);
+
+ if(existingSetType) existingSetType.cleanUp(setType);
+ else this._setTypes.set(setType.type, new SetType(setType));
+ }
+
+ this.appendJSON(data);
+ }
+
+ public appendJSON(data: IFigureData): boolean
+ {
+ if(!data) return false;
+
+ for(const palette of data.palettes)
+ {
+ const id = palette.id.toString();
+ const existingPalette = this._palettes.get(id);
+
+ if(!existingPalette) this._palettes.set(id, new Palette(palette));
+ else existingPalette.append(palette);
+ }
+
+ for(const setType of data.setTypes)
+ {
+ const type = setType.type;
+ const existingSetType = this._setTypes.get(type);
+
+ if(!existingSetType) this._setTypes.set(type, new SetType(setType));
+ else existingSetType.append(setType);
+ }
+
+ return false;
+ }
+
+ public getMandatorySetTypeIds(k: string, _arg_2: number): string[]
+ {
+ const types: string[] = [];
+
+ for(const set of this._setTypes.values())
+ {
+ if(!set || !set.isMandatory(k, _arg_2)) continue;
+
+ types.push(set.type);
+ }
+
+ return types;
+ }
+
+ public getDefaultPartSet(type: string, gender: string): IFigurePartSet
+ {
+ const setType = this._setTypes.get(type);
+
+ if(!setType) return null;
+
+ return setType.getDefaultPartSet(gender);
+ }
+
+ public getSetType(k: string): ISetType
+ {
+ return (this._setTypes.get(k) || null);
+ }
+
+ public getPalette(k: number): IPalette
+ {
+ return (this._palettes.get(k.toString()) || null);
+ }
+
+ public getFigurePartSet(k: number): IFigurePartSet
+ {
+ for(const set of this._setTypes.values())
+ {
+ const partSet = set.getPartSet(k);
+
+ if(!partSet) continue;
+
+ return partSet;
+ }
+
+ return null;
+ }
+}
diff --git a/packages/avatar/src/structure/PartSetsData.ts b/packages/avatar/src/structure/PartSetsData.ts
new file mode 100644
index 0000000..6e80742
--- /dev/null
+++ b/packages/avatar/src/structure/PartSetsData.ts
@@ -0,0 +1,118 @@
+import { IActionDefinition, IFigureSetData } from '@nitrots/api';
+import { ActionDefinition } from '../actions';
+import { ActivePartSet, PartDefinition } from './parts';
+
+export class PartSetsData implements IFigureSetData
+{
+ private _parts: Map;
+ private _activePartSets: Map;
+
+ constructor()
+ {
+ this._parts = new Map();
+ this._activePartSets = new Map();
+ }
+
+ public parse(data: any): boolean
+ {
+ if(data.partSet && (data.partSet.length > 0))
+ {
+ for(const part of data.partSet)
+ {
+ if(!part) continue;
+
+ this._parts.set(part.setType, new PartDefinition(part));
+ }
+ }
+
+ if(data.activePartSets && (data.activePartSets.length > 0))
+ {
+ for(const activePart of data.activePartSets)
+ {
+ if(!activePart) continue;
+
+ this._activePartSets.set(activePart.id, new ActivePartSet(activePart));
+ }
+ }
+
+ return true;
+ }
+
+ public appendJSON(data: any): boolean
+ {
+ if(data.partSet && (data.partSet.length > 0))
+ {
+ for(const part of data.partSet)
+ {
+ if(!part) continue;
+
+ this._parts.set(part.setType, new PartDefinition(part));
+ }
+ }
+
+ if(data.activePartSets && (data.activePartSets.length > 0))
+ {
+ for(const activePart of data.activePartSets)
+ {
+ if(!activePart) continue;
+
+ this._activePartSets.set(activePart.id, new ActivePartSet(activePart));
+ }
+ }
+
+ return false;
+ }
+
+ public getActiveParts(k: IActionDefinition): string[]
+ {
+ const activePartSet = this._activePartSets.get(k.activePartSet);
+
+ if(!activePartSet) return [];
+
+ return activePartSet.parts;
+ }
+
+ public getPartDefinition(part: string): PartDefinition
+ {
+ const existing = this._parts.get(part);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public addPartDefinition(k: any): PartDefinition
+ {
+ const _local_2 = k.setType as string;
+
+ let existing = this._parts.get(_local_2);
+
+ if(!existing)
+ {
+ existing = new PartDefinition(k);
+
+ this._parts.set(_local_2, existing);
+ }
+
+ return existing;
+ }
+
+ public getActivePartSet(k: ActionDefinition): ActivePartSet
+ {
+ const existing = this._activePartSets.get(k.activePartSet);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public get parts(): Map
+ {
+ return this._parts;
+ }
+
+ public get activePartSets(): Map
+ {
+ return this._activePartSets;
+ }
+}
diff --git a/packages/avatar/src/structure/animation/AnimationAction.ts b/packages/avatar/src/structure/animation/AnimationAction.ts
new file mode 100644
index 0000000..9e38ac1
--- /dev/null
+++ b/packages/avatar/src/structure/animation/AnimationAction.ts
@@ -0,0 +1,138 @@
+import { Point } from 'pixi.js';
+import { AnimationActionPart } from './AnimationActionPart';
+
+export class AnimationAction
+{
+ public static DEFAULT_OFFSET: Point = new Point(0, 0);
+
+ private _id: string;
+ private _actionParts: Map;
+ private _bodyPartOffsets: Map>>;
+ private _frameCount: number;
+ private _frameIndexes: number[];
+
+ constructor(data: any)
+ {
+ this._id = data.id;
+ this._actionParts = new Map();
+ this._bodyPartOffsets = new Map();
+ this._frameCount = 0;
+ this._frameIndexes = [];
+
+ if(data.parts && (data.parts.length > 0))
+ {
+ for(const part of data.parts)
+ {
+ if(!part) continue;
+
+ const newPart = new AnimationActionPart(part);
+
+ this._actionParts.set(part.setType, newPart);
+
+ this._frameCount = Math.max(this._frameCount, newPart.frames.length);
+ }
+ }
+
+ if(data.offsets && data.offsets.frames && (data.offsets.frames.length > 0))
+ {
+ for(const frame of data.offsets.frames)
+ {
+ if(!frame) continue;
+
+ const frameId = frame.id;
+
+ this._frameCount = Math.max(this._frameCount, frameId);
+
+ const directions: Map> = new Map();
+
+ this._bodyPartOffsets.set(frameId, directions);
+
+ if(frame.directions && (frame.directions.length > 0))
+ {
+ for(const direction of frame.directions)
+ {
+ if(!direction) continue;
+
+ const directionId = direction.id;
+
+ const offsets: Map = new Map();
+
+ directions.set(directionId, offsets);
+
+ if(direction.bodyParts && (direction.bodyParts.length > 0))
+ {
+ for(const part of direction.bodyParts)
+ {
+ if(!part) continue;
+
+ const partId = part.id;
+
+ let dx = 0;
+ let dy = 0;
+
+ if(part.dx !== undefined) dx = part.dx;
+ if(part.dy !== undefined) dy = part.dy;
+
+ offsets.set(partId, new Point(dx, dy));
+ }
+ }
+ }
+ }
+
+ this._frameIndexes.push(frameId);
+
+ if(frame.repeats !== undefined)
+ {
+ let repeats = frame.repeats || 0;
+
+ if(repeats > 1) while(--repeats > 0) this._frameIndexes.push(frameId);
+ }
+ }
+ }
+ }
+
+ public getPart(type: string): AnimationActionPart
+ {
+ if(!type) return null;
+
+ const existing = this._actionParts.get(type);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public getFrameBodyPartOffset(frameId: number, frameCount: number, partId: string): Point
+ {
+ const frameIndex = (frameCount % this._frameIndexes.length);
+ const frameNumber = this._frameIndexes[frameIndex];
+ const offsets = this._bodyPartOffsets.get(frameNumber);
+
+ if(!offsets) return AnimationAction.DEFAULT_OFFSET;
+
+ const frameOffset = offsets.get(frameId);
+
+ if(!frameOffset) return AnimationAction.DEFAULT_OFFSET;
+
+ const offset = frameOffset.get(partId);
+
+ if(!offset) return AnimationAction.DEFAULT_OFFSET;
+
+ return offset;
+ }
+
+ public get id(): string
+ {
+ return this._id;
+ }
+
+ public get parts(): Map
+ {
+ return this._actionParts;
+ }
+
+ public get frameCount(): number
+ {
+ return this._frameCount;
+ }
+}
diff --git a/packages/avatar/src/structure/animation/AnimationActionPart.ts b/packages/avatar/src/structure/animation/AnimationActionPart.ts
new file mode 100644
index 0000000..ea16687
--- /dev/null
+++ b/packages/avatar/src/structure/animation/AnimationActionPart.ts
@@ -0,0 +1,30 @@
+import { AvatarAnimationFrame } from './AvatarAnimationFrame';
+
+export class AnimationActionPart
+{
+ private _frames: AvatarAnimationFrame[];
+
+ constructor(data: any)
+ {
+ this._frames = [];
+
+ if(data.frames && (data.frames.length > 0))
+ {
+ for(const frame of data.frames)
+ {
+ if(!frame) continue;
+
+ this._frames.push(new AvatarAnimationFrame(frame));
+
+ let repeats = frame.repeats || 0;
+
+ if(repeats > 1) while(--repeats > 0) this._frames.push(this._frames[(this._frames.length - 1)]);
+ }
+ }
+ }
+
+ public get frames(): AvatarAnimationFrame[]
+ {
+ return this._frames;
+ }
+}
diff --git a/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts b/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts
new file mode 100644
index 0000000..3b9ec35
--- /dev/null
+++ b/packages/avatar/src/structure/animation/AvatarAnimationFrame.ts
@@ -0,0 +1,21 @@
+export class AvatarAnimationFrame
+{
+ private _number: number;
+ private _assetPartDefinition: string;
+
+ constructor(data: any)
+ {
+ this._number = data.number;
+ this._assetPartDefinition = data.assetPartDefinition || null;
+ }
+
+ public get number(): number
+ {
+ return this._number;
+ }
+
+ public get assetPartDefinition(): string
+ {
+ return this._assetPartDefinition;
+ }
+}
diff --git a/packages/avatar/src/structure/animation/index.ts b/packages/avatar/src/structure/animation/index.ts
new file mode 100644
index 0000000..98af842
--- /dev/null
+++ b/packages/avatar/src/structure/animation/index.ts
@@ -0,0 +1,3 @@
+export * from './AnimationAction';
+export * from './AnimationActionPart';
+export * from './AvatarAnimationFrame';
diff --git a/packages/avatar/src/structure/figure/FigurePart.ts b/packages/avatar/src/structure/figure/FigurePart.ts
new file mode 100644
index 0000000..09c0a1c
--- /dev/null
+++ b/packages/avatar/src/structure/figure/FigurePart.ts
@@ -0,0 +1,53 @@
+import { IFigureDataPart, IFigurePart } from '@nitrots/api';
+
+export class FigurePart implements IFigurePart
+{
+ private _id: number;
+ private _type: string;
+ private _breed: number;
+ private _index: number;
+ private _colorLayerIndex: number;
+ private _paletteMapId: number;
+
+ constructor(data: IFigureDataPart)
+ {
+ if(!data) throw new Error('invalid_data');
+
+ this._id = data.id;
+ this._type = data.type;
+ this._index = data.index;
+ this._colorLayerIndex = data.colorindex;
+ this._paletteMapId = -1;
+ this._breed = -1;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get breed(): number
+ {
+ return this._breed;
+ }
+
+ public get index(): number
+ {
+ return this._index;
+ }
+
+ public get colorLayerIndex(): number
+ {
+ return this._colorLayerIndex;
+ }
+
+ public get paletteMap(): number
+ {
+ return this._paletteMapId;
+ }
+}
diff --git a/packages/avatar/src/structure/figure/FigurePartSet.ts b/packages/avatar/src/structure/figure/FigurePartSet.ts
new file mode 100644
index 0000000..5cb2f79
--- /dev/null
+++ b/packages/avatar/src/structure/figure/FigurePartSet.ts
@@ -0,0 +1,134 @@
+import { IFigureDataSet, IFigurePart, IFigurePartSet } from '@nitrots/api';
+import { FigurePart } from './FigurePart';
+
+export class FigurePartSet implements IFigurePartSet
+{
+ private _id: number;
+ private _type: string;
+ private _gender: string;
+ private _clubLevel: number;
+ private _isColorable: boolean;
+ private _isSelectable: boolean;
+ private _parts: IFigurePart[];
+ private _hiddenLayers: string[];
+ private _isPreSelectable: boolean;
+ private _isSellable: boolean;
+
+ constructor(type: string, data: IFigureDataSet)
+ {
+ if(!type || !data) throw new Error('invalid_data');
+
+ this._id = data.id;
+ this._type = type;
+ this._gender = data.gender;
+ this._clubLevel = data.club;
+ this._isColorable = data.colorable;
+ this._isSelectable = data.selectable;
+ this._parts = [];
+ this._hiddenLayers = [];
+ this._isPreSelectable = data.preselectable;
+ this._isSellable = data.sellable;
+
+ for(const part of data.parts)
+ {
+ const newPart = new FigurePart(part);
+ const partIndex = this.getPartIndex(newPart);
+
+ if(partIndex !== -1) this._parts.splice(partIndex, 0, newPart);
+ else this._parts.push(newPart);
+ }
+
+ if(data.hiddenLayers)
+ {
+ for(const hiddenLayer of data.hiddenLayers) this._hiddenLayers.push(hiddenLayer.partType);
+ }
+ }
+
+ public dispose(): void
+ {
+ this._parts = null;
+ this._hiddenLayers = null;
+ }
+
+ private getPartIndex(part: FigurePart): number
+ {
+ const totalParts = this._parts.length;
+
+ if(!totalParts) return -1;
+
+ for(let i = 0; i < totalParts; i++)
+ {
+ const existingPart = this._parts[i];
+
+ if(!existingPart) continue;
+
+ if(existingPart.type !== part.type || existingPart.index > part.index) continue;
+
+ return i;
+ }
+
+ return -1;
+ }
+
+ public getPart(k: string, _arg_2: number): IFigurePart
+ {
+ for(const part of this._parts)
+ {
+ if((part.type !== k) || (part.id !== _arg_2)) continue;
+
+ return part;
+ }
+
+ return null;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get gender(): string
+ {
+ return this._gender;
+ }
+
+ public get clubLevel(): number
+ {
+ return this._clubLevel;
+ }
+
+ public get isColorable(): boolean
+ {
+ return this._isColorable;
+ }
+
+ public get isSelectable(): boolean
+ {
+ return this._isSelectable;
+ }
+
+ public get parts(): IFigurePart[]
+ {
+ return this._parts;
+ }
+
+ public get hiddenLayers(): string[]
+ {
+ return this._hiddenLayers;
+ }
+
+ public get isPreSelectable(): boolean
+ {
+ return this._isPreSelectable;
+ }
+
+ public get isSellable(): boolean
+ {
+ return this._isSellable;
+ }
+}
diff --git a/packages/avatar/src/structure/figure/Palette.ts b/packages/avatar/src/structure/figure/Palette.ts
new file mode 100644
index 0000000..33fed5e
--- /dev/null
+++ b/packages/avatar/src/structure/figure/Palette.ts
@@ -0,0 +1,46 @@
+import { IAdvancedMap, IFigureDataPalette, IPalette, IPartColor } from '@nitrots/api';
+import { AdvancedMap } from '@nitrots/utils';
+import { PartColor } from './PartColor';
+
+export class Palette implements IPalette
+{
+ private _id: number;
+ private _colors: IAdvancedMap;
+
+ constructor(data: IFigureDataPalette)
+ {
+ if(!data) throw new Error('invalid_data');
+
+ this._id = data.id;
+ this._colors = new AdvancedMap();
+
+ this.append(data);
+ }
+
+ public append(data: IFigureDataPalette): void
+ {
+ for(const color of data.colors)
+ {
+ const newColor = new PartColor(color);
+
+ this._colors.add(color.id.toString(), newColor);
+ }
+ }
+
+ public getColor(id: number): IPartColor
+ {
+ if((id === undefined) || id < 0) return null;
+
+ return (this._colors.getValue(id.toString()) || null);
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get colors(): IAdvancedMap
+ {
+ return this._colors;
+ }
+}
diff --git a/packages/avatar/src/structure/figure/PartColor.ts b/packages/avatar/src/structure/figure/PartColor.ts
new file mode 100644
index 0000000..af96476
--- /dev/null
+++ b/packages/avatar/src/structure/figure/PartColor.ts
@@ -0,0 +1,46 @@
+import { IFigureDataColor, IPartColor } from '@nitrots/api';
+
+export class PartColor implements IPartColor
+{
+ private _id: number;
+ private _index: number;
+ private _clubLevel: number;
+ private _isSelectable: boolean;
+ private _rgb: number;
+
+ constructor(data: IFigureDataColor)
+ {
+ if(!data) throw new Error('invalid_data');
+
+ this._id = data.id;
+ this._index = data.index;
+ this._clubLevel = (data.club || 0);
+ this._isSelectable = data.selectable;
+ this._rgb = parseInt('0x' + data.hexCode, 16);
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get index(): number
+ {
+ return this._index;
+ }
+
+ public get clubLevel(): number
+ {
+ return this._clubLevel;
+ }
+
+ public get isSelectable(): boolean
+ {
+ return this._isSelectable;
+ }
+
+ public get rgb(): number
+ {
+ return this._rgb;
+ }
+}
diff --git a/packages/avatar/src/structure/figure/SetType.ts b/packages/avatar/src/structure/figure/SetType.ts
new file mode 100644
index 0000000..e24dfad
--- /dev/null
+++ b/packages/avatar/src/structure/figure/SetType.ts
@@ -0,0 +1,104 @@
+import { IAdvancedMap, IFigureDataSetType, IFigurePartSet, ISetType } from '@nitrots/api';
+import { AdvancedMap } from '@nitrots/utils';
+import { FigurePartSet } from './FigurePartSet';
+
+export class SetType implements ISetType
+{
+ private _type: string;
+ private _paletteId: number;
+ private _isMandatory: { [index: string]: boolean[] };
+ private _partSets: IAdvancedMap;
+
+ constructor(data: IFigureDataSetType)
+ {
+ if(!data) throw new Error('invalid_data');
+
+ this._type = data.type;
+ this._paletteId = data.paletteId;
+ this._isMandatory = {};
+ this._isMandatory['F'] = [data.mandatory_f_0, data.mandatory_f_1];
+ this._isMandatory['M'] = [data.mandatory_m_0, data.mandatory_m_1];
+ this._partSets = new AdvancedMap();
+
+ this.append(data);
+ }
+
+ public dispose(): void
+ {
+ for(const set of this._partSets.getValues())
+ {
+ const partSet = set as FigurePartSet;
+
+ partSet.dispose();
+ }
+
+ this._partSets = null;
+ }
+
+ public cleanUp(data: IFigureDataSetType): void
+ {
+ for(const set of data.sets)
+ {
+ const setId = set.id.toString();
+ const partSet = (this._partSets.getValue(setId) as FigurePartSet);
+
+ if(partSet)
+ {
+ partSet.dispose();
+
+ this._partSets.remove(setId);
+ }
+ }
+ }
+
+ public append(setType: IFigureDataSetType): void
+ {
+ if(!setType || !setType.sets) return;
+
+ for(const set of setType.sets) this._partSets.add(set.id.toString(), new FigurePartSet(this._type, set));
+ }
+
+ public getDefaultPartSet(gender: string): IFigurePartSet
+ {
+ for(const set of this._partSets.getValues())
+ {
+ if(!set) continue;
+
+ if((set.clubLevel === 0) && ((set.gender === gender) || (set.gender === 'U'))) return set;
+ }
+
+ return null;
+ }
+
+ public getPartSet(k: number): IFigurePartSet
+ {
+ return this._partSets.getValue(k.toString());
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get paletteID(): number
+ {
+ return this._paletteId;
+ }
+
+ public isMandatory(k: string, _arg_2: number): boolean
+ {
+ return this._isMandatory[k.toUpperCase()][Math.min(_arg_2, 1)];
+ }
+
+ public optionalFromClubLevel(k: string): number
+ {
+ const _local_2 = this._isMandatory[k.toUpperCase()];
+
+ return _local_2.indexOf(false);
+ }
+
+ public get partSets(): IAdvancedMap
+ {
+ return this._partSets;
+ }
+}
diff --git a/packages/avatar/src/structure/figure/index.ts b/packages/avatar/src/structure/figure/index.ts
new file mode 100644
index 0000000..1b9ebc3
--- /dev/null
+++ b/packages/avatar/src/structure/figure/index.ts
@@ -0,0 +1,5 @@
+export * from './FigurePart';
+export * from './FigurePartSet';
+export * from './Palette';
+export * from './PartColor';
+export * from './SetType';
diff --git a/packages/avatar/src/structure/index.ts b/packages/avatar/src/structure/index.ts
new file mode 100644
index 0000000..9d2754f
--- /dev/null
+++ b/packages/avatar/src/structure/index.ts
@@ -0,0 +1,7 @@
+export * from './AvatarAnimationData';
+export * from './AvatarCanvas';
+export * from './FigureSetData';
+export * from './PartSetsData';
+export * from './animation';
+export * from './figure';
+export * from './parts';
diff --git a/packages/avatar/src/structure/parts/ActivePartSet.ts b/packages/avatar/src/structure/parts/ActivePartSet.ts
new file mode 100644
index 0000000..4244308
--- /dev/null
+++ b/packages/avatar/src/structure/parts/ActivePartSet.ts
@@ -0,0 +1,26 @@
+export class ActivePartSet
+{
+ private _id: string;
+ private _parts: string[];
+
+ constructor(data: any)
+ {
+ this._id = data.id;
+ this._parts = [];
+
+ if(data.activeParts && (data.activeParts.length > 0))
+ {
+ for(const part of data.activeParts)
+ {
+ if(!part) continue;
+
+ this._parts.push(part.setType);
+ }
+ }
+ }
+
+ public get parts(): string[]
+ {
+ return this._parts;
+ }
+}
diff --git a/packages/avatar/src/structure/parts/PartDefinition.ts b/packages/avatar/src/structure/parts/PartDefinition.ts
new file mode 100644
index 0000000..19caa8c
--- /dev/null
+++ b/packages/avatar/src/structure/parts/PartDefinition.ts
@@ -0,0 +1,64 @@
+export class PartDefinition
+{
+ private _setType: string;
+ private _flippedSetType: string;
+ private _removeSetType: string;
+ private _appendToFigure: boolean;
+ private _staticId: number;
+
+ constructor(data: any)
+ {
+ if(!data) throw new Error('invalid_data');
+
+ this._setType = data.setType;
+ this._flippedSetType = data.flippedSetType || null;
+ this._removeSetType = data.removeSetType || null;
+ this._appendToFigure = false;
+ this._staticId = -1;
+ }
+
+ public hasStaticId(): boolean
+ {
+ return this._staticId >= 0;
+ }
+
+ public get staticId(): number
+ {
+ return this._staticId;
+ }
+
+ public set staticId(k: number)
+ {
+ this._staticId = k;
+ }
+
+ public get setType(): string
+ {
+ return this._setType;
+ }
+
+ public get flippedSetType(): string
+ {
+ return this._flippedSetType;
+ }
+
+ public set flippedSetType(type: string)
+ {
+ this._flippedSetType = type;
+ }
+
+ public get removeSetType(): string
+ {
+ return this._removeSetType;
+ }
+
+ public get appendToFigure(): boolean
+ {
+ return this._appendToFigure;
+ }
+
+ public set appendToFigure(flag: boolean)
+ {
+ this._appendToFigure = flag;
+ }
+}
diff --git a/packages/avatar/src/structure/parts/index.ts b/packages/avatar/src/structure/parts/index.ts
new file mode 100644
index 0000000..31faf62
--- /dev/null
+++ b/packages/avatar/src/structure/parts/index.ts
@@ -0,0 +1,2 @@
+export * from './ActivePartSet';
+export * from './PartDefinition';
diff --git a/packages/avatar/tsconfig.json b/packages/avatar/tsconfig.json
new file mode 100644
index 0000000..5e8757d
--- /dev/null
+++ b/packages/avatar/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./src",
+ "outDir": "./dist",
+ "sourceMap": false,
+ "declaration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "Node",
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ "downlevelIteration": true,
+ "allowSyntheticDefaultImports": true,
+ "allowJs": true,
+ "skipLibCheck": true,
+ "noEmit": true,
+ "strict": false,
+ "strictNullChecks": false,
+ "target": "ES6",
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "module": "ES6"
+ },
+ "include": [
+ "src" ]
+}
diff --git a/packages/camera/.eslintrc.json b/packages/camera/.eslintrc.json
new file mode 100644
index 0000000..ad92133
--- /dev/null
+++ b/packages/camera/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": [ "@nitrots/eslint-config" ]
+}
diff --git a/packages/camera/.gitignore b/packages/camera/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/packages/camera/.gitignore
@@ -0,0 +1,51 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
+/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+.git
+
+# System Files
+.DS_Store
+Thumbs.db
+
+*.zip
+*.as
+*.bin
diff --git a/packages/camera/index.ts b/packages/camera/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/packages/camera/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/camera/package.json b/packages/camera/package.json
new file mode 100644
index 0000000..1172279
--- /dev/null
+++ b/packages/camera/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@nitrots/camera",
+ "description": "Nitro camera module",
+ "version": "1.0.0",
+ "type": "module",
+ "license": "GPL-3.0",
+ "scripts": {
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "@nitrots/api": "1.0.0",
+ "@nitrots/configuration": "1.0.0",
+ "@nitrots/eslint-config": "1.0.0",
+ "@nitrots/events": "1.0.0",
+ "@nitrots/utils": "1.0.0",
+ "pixi.js": "^8.0.4"
+ },
+ "devDependencies": {
+ "typescript": "~5.4.2"
+ }
+}
diff --git a/packages/camera/src/GetRoomCameraWidgetManager.ts b/packages/camera/src/GetRoomCameraWidgetManager.ts
new file mode 100644
index 0000000..0f6f44f
--- /dev/null
+++ b/packages/camera/src/GetRoomCameraWidgetManager.ts
@@ -0,0 +1,5 @@
+import { RoomCameraWidgetManager } from './RoomCameraWidgetManager';
+
+const roomCameraWidgetManager = new RoomCameraWidgetManager();
+
+export const GetRoomCameraWidgetManager = () => roomCameraWidgetManager;
diff --git a/packages/camera/src/RoomCameraWidgetEffect.ts b/packages/camera/src/RoomCameraWidgetEffect.ts
new file mode 100644
index 0000000..f33e61b
--- /dev/null
+++ b/packages/camera/src/RoomCameraWidgetEffect.ts
@@ -0,0 +1,60 @@
+import { IRoomCameraWidgetEffect } from '@nitrots/api';
+import { BLEND_MODES, ColorMatrix, Texture } from 'pixi.js';
+
+export class RoomCameraWidgetEffect implements IRoomCameraWidgetEffect
+{
+ private _name: string;
+ private _minLevel: number = -1;
+ private _texture: Texture = null;
+ private _colorMatrix: ColorMatrix = null;
+ private _blendMode: BLEND_MODES = null;
+
+ constructor(name: string, minLevel: number = -1, texture: Texture = null, colorMatrix: ColorMatrix = null, blendMode: BLEND_MODES = null)
+ {
+ this._name = name;
+ this._minLevel = minLevel;
+ this._texture = texture;
+ this._colorMatrix = colorMatrix;
+ this._blendMode = blendMode;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get texture(): Texture
+ {
+ return this._texture;
+ }
+
+ public set texture(texture: Texture)
+ {
+ this._texture = texture;
+ }
+
+ public get colorMatrix(): ColorMatrix
+ {
+ return this._colorMatrix;
+ }
+
+ public set colorMatrix(colorMatrix: ColorMatrix)
+ {
+ this._colorMatrix = colorMatrix;
+ }
+
+ public get blendMode(): BLEND_MODES
+ {
+ return this._blendMode;
+ }
+
+ public set blendMode(blendMode: BLEND_MODES)
+ {
+ this._blendMode = blendMode;
+ }
+
+ public get minLevel(): number
+ {
+ return this._minLevel;
+ }
+}
diff --git a/packages/camera/src/RoomCameraWidgetManager.ts b/packages/camera/src/RoomCameraWidgetManager.ts
new file mode 100644
index 0000000..34ed50e
--- /dev/null
+++ b/packages/camera/src/RoomCameraWidgetManager.ts
@@ -0,0 +1,103 @@
+import { IRoomCameraWidgetEffect, IRoomCameraWidgetManager, IRoomCameraWidgetSelectedEffect } from '@nitrots/api';
+import { GetAssetManager } from '@nitrots/assets';
+import { GetConfiguration } from '@nitrots/configuration';
+import { GetEventDispatcher, RoomCameraWidgetManagerEvent } from '@nitrots/events';
+import { TextureUtils } from '@nitrots/utils';
+import { BLEND_MODES, ColorMatrix, ColorMatrixFilter, Container, Sprite, Texture } from 'pixi.js';
+import { RoomCameraWidgetEffect } from './RoomCameraWidgetEffect';
+
+export class RoomCameraWidgetManager implements IRoomCameraWidgetManager
+{
+ private _effects: Map;
+ private _isLoaded: boolean;
+
+ constructor()
+ {
+ this._effects = new Map();
+ this._isLoaded = false;
+ }
+
+ public async init(): Promise
+ {
+ if(this._isLoaded) return;
+
+ this._isLoaded = true;
+
+ const imagesUrl = GetConfiguration().getValue('image.library.url') + 'Habbo-Stories/';
+ const effects = GetConfiguration().getValue<{ name: string, colorMatrix?: ColorMatrix, minLevel: number, blendMode?: BLEND_MODES, enabled: boolean }[]>('camera.available.effects');
+
+ for(const effect of effects)
+ {
+ if(!effect.enabled) continue;
+
+ const cameraEffect = new RoomCameraWidgetEffect(effect.name, effect.minLevel);
+
+ if(effect.colorMatrix.length)
+ {
+ cameraEffect.colorMatrix = effect.colorMatrix;
+ }
+ else
+ {
+ const url = `${ imagesUrl }${ effect.name }.png`;
+
+ await GetAssetManager().downloadAsset(url);
+
+ cameraEffect.texture = GetAssetManager().getTexture(url);
+ cameraEffect.blendMode = effect.blendMode;
+ }
+
+ this._effects.set(cameraEffect.name, cameraEffect);
+ }
+
+ GetEventDispatcher().dispatchEvent(new RoomCameraWidgetManagerEvent(RoomCameraWidgetManagerEvent.INITIALIZED));
+ }
+
+ public async applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise
+ {
+ const container = new Container();
+ const sprite = new Sprite(texture);
+
+ container.addChild(sprite);
+
+ if(isZoomed) sprite.scale.set(2);
+
+ for(const selectedEffect of selectedEffects)
+ {
+ const effect = selectedEffect.effect;
+
+ if(!effect) continue;
+
+ if(effect.colorMatrix)
+ {
+ const filter = new ColorMatrixFilter();
+
+ filter.matrix = effect.colorMatrix;
+ filter.alpha = selectedEffect.alpha;
+
+ if(!Array.isArray(sprite.filters)) sprite.filters = [];
+
+ sprite.filters.push(filter);
+ }
+ else
+ {
+ const effectSprite = new Sprite(effect.texture);
+ effectSprite.alpha = selectedEffect.alpha;
+ effectSprite.blendMode = effect.blendMode;
+
+ container.addChild(effectSprite);
+ }
+ }
+
+ return await TextureUtils.generateImage(container);
+ }
+
+ public get effects(): Map
+ {
+ return this._effects;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return this._isLoaded;
+ }
+}
diff --git a/packages/camera/src/RoomCameraWidgetSelectedEffect.ts b/packages/camera/src/RoomCameraWidgetSelectedEffect.ts
new file mode 100644
index 0000000..c76ddeb
--- /dev/null
+++ b/packages/camera/src/RoomCameraWidgetSelectedEffect.ts
@@ -0,0 +1,23 @@
+import { IRoomCameraWidgetEffect } from '@nitrots/api';
+
+export class RoomCameraWidgetSelectedEffect
+{
+ private _effect: IRoomCameraWidgetEffect;
+ private _alpha: number;
+
+ constructor(effect: IRoomCameraWidgetEffect, alpha: number)
+ {
+ this._effect = effect;
+ this._alpha = alpha;
+ }
+
+ public get effect(): IRoomCameraWidgetEffect
+ {
+ return this._effect;
+ }
+
+ public get alpha(): number
+ {
+ return this._alpha;
+ }
+}
diff --git a/packages/camera/src/index.ts b/packages/camera/src/index.ts
new file mode 100644
index 0000000..a2f3069
--- /dev/null
+++ b/packages/camera/src/index.ts
@@ -0,0 +1,4 @@
+export * from './GetRoomCameraWidgetManager';
+export * from './RoomCameraWidgetEffect';
+export * from './RoomCameraWidgetManager';
+export * from './RoomCameraWidgetSelectedEffect';
diff --git a/packages/camera/tsconfig.json b/packages/camera/tsconfig.json
new file mode 100644
index 0000000..5e8757d
--- /dev/null
+++ b/packages/camera/tsconfig.json
@@ -0,0 +1,31 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "baseUrl": "./src",
+ "outDir": "./dist",
+ "sourceMap": false,
+ "declaration": true,
+ "experimentalDecorators": true,
+ "moduleResolution": "Node",
+ "esModuleInterop": true,
+ "importHelpers": true,
+ "isolatedModules": true,
+ "resolveJsonModule": true,
+ "downlevelIteration": true,
+ "allowSyntheticDefaultImports": true,
+ "allowJs": true,
+ "skipLibCheck": true,
+ "noEmit": true,
+ "strict": false,
+ "strictNullChecks": false,
+ "target": "ES6",
+ "lib": [
+ "DOM",
+ "DOM.Iterable",
+ "ESNext"
+ ],
+ "module": "ES6"
+ },
+ "include": [
+ "src" ]
+}
diff --git a/packages/communication/.eslintrc.json b/packages/communication/.eslintrc.json
new file mode 100644
index 0000000..ad92133
--- /dev/null
+++ b/packages/communication/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": [ "@nitrots/eslint-config" ]
+}
diff --git a/packages/communication/.gitignore b/packages/communication/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/packages/communication/.gitignore
@@ -0,0 +1,51 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+/out-tsc
+# Only exists if Bazel was run
+/bazel-out
+
+# dependencies
+/node_modules
+
+# profiling files
+chrome-profiler-events*.json
+speed-measure-plugin*.json
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# IDE - VSCode
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage
+/libpeerconnection.log
+npm-debug.log
+yarn-error.log
+testem.log
+/typings
+.git
+
+# System Files
+.DS_Store
+Thumbs.db
+
+*.zip
+*.as
+*.bin
diff --git a/packages/communication/index.ts b/packages/communication/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/packages/communication/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/packages/communication/package.json b/packages/communication/package.json
new file mode 100644
index 0000000..a4de308
--- /dev/null
+++ b/packages/communication/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "@nitrots/communication",
+ "description": "Nitro communication module",
+ "version": "1.0.0",
+ "type": "module",
+ "license": "GPL-3.0",
+ "scripts": {
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "@nitrots/api": "1.0.0",
+ "@nitrots/eslint-config": "1.0.0",
+ "@nitrots/events": "1.0.0",
+ "@nitrots/utils": "1.0.0"
+ },
+ "devDependencies": {
+ "typescript": "~5.4.2"
+ }
+}
diff --git a/packages/communication/src/CommunicationManager.ts b/packages/communication/src/CommunicationManager.ts
new file mode 100644
index 0000000..2389d76
--- /dev/null
+++ b/packages/communication/src/CommunicationManager.ts
@@ -0,0 +1,97 @@
+import { ICommunicationManager, IConnection, IMessageConfiguration, IMessageEvent } from '@nitrots/api';
+import { GetConfiguration } from '@nitrots/configuration';
+import { GetEventDispatcher, NitroEventType } from '@nitrots/events';
+import { GetTickerTime } from '@nitrots/utils';
+import { NitroMessages } from './NitroMessages';
+import { SocketConnection } from './SocketConnection';
+import { AuthenticatedEvent, ClientHelloMessageComposer, ClientPingEvent, InfoRetrieveMessageComposer, PongMessageComposer, SSOTicketMessageComposer } from './messages';
+
+export class CommunicationManager implements ICommunicationManager
+{
+ private _connection: IConnection = new SocketConnection();
+ private _messages: IMessageConfiguration = new NitroMessages();
+
+ private _pongInterval: any = null;
+
+ constructor()
+ {
+ this._connection.registerMessages(this._messages);
+ }
+
+ public async init(): Promise
+ {
+ GetEventDispatcher().addEventListener(NitroEventType.SOCKET_CLOSED, () =>
+ {
+ this.stopPong();
+ });
+
+ return new Promise((resolve, reject) =>
+ {
+ GetEventDispatcher().addEventListener(NitroEventType.SOCKET_OPENED, () =>
+ {
+ if(GetConfiguration().getValue('system.pong.manually', false)) this.startPong();
+
+ this._connection.send(new ClientHelloMessageComposer(null, null, null, null));
+ this._connection.send(new SSOTicketMessageComposer(GetConfiguration().getValue('sso.ticket', null), GetTickerTime()));
+ });
+
+ GetEventDispatcher().addEventListener(NitroEventType.SOCKET_ERROR, () =>
+ {
+ reject();
+ });
+
+ this._connection.addMessageEvent(new ClientPingEvent((event: ClientPingEvent) => this.sendPong()));
+
+ this._connection.addMessageEvent(new AuthenticatedEvent((event: AuthenticatedEvent) =>
+ {
+ this._connection.authenticated();
+
+ resolve();
+
+ event.connection.send(new InfoRetrieveMessageComposer());
+ }));
+
+ this._connection.init(GetConfiguration().getValue('socket.url'));
+ });
+ }
+
+ protected startPong(): void
+ {
+ if(this._pongInterval) this.stopPong();
+
+ this._pongInterval = setInterval(() => this.sendPong(), GetConfiguration().getValue('system.pong.interval.ms', 20000));
+ }
+
+ protected stopPong(): void
+ {
+ if(!this._pongInterval) return;
+
+ clearInterval(this._pongInterval);
+
+ this._pongInterval = null;
+ }
+
+ protected sendPong(): void
+ {
+ this._connection?.send(new PongMessageComposer());
+ }
+
+ public registerMessageEvent(event: IMessageEvent): IMessageEvent
+ {
+ if(this._connection) this._connection.addMessageEvent(event);
+
+ return event;
+ }
+
+ public removeMessageEvent(event: IMessageEvent): void
+ {
+ if(!this._connection) return;
+
+ this._connection.removeMessageEvent(event);
+ }
+
+ public get connection(): IConnection
+ {
+ return this._connection;
+ }
+}
diff --git a/packages/communication/src/GetCommunication.ts b/packages/communication/src/GetCommunication.ts
new file mode 100644
index 0000000..e6a2eed
--- /dev/null
+++ b/packages/communication/src/GetCommunication.ts
@@ -0,0 +1,5 @@
+import { CommunicationManager } from './CommunicationManager';
+
+const communication = new CommunicationManager();
+
+export const GetCommunication = () => communication;
diff --git a/packages/communication/src/NitroMessages.ts b/packages/communication/src/NitroMessages.ts
new file mode 100644
index 0000000..7b40517
--- /dev/null
+++ b/packages/communication/src/NitroMessages.ts
@@ -0,0 +1,1179 @@
+import { IMessageConfiguration } from '@nitrots/api';
+import { AcceptFriendMessageComposer, AcceptFriendResultEvent, AcceptGameInviteMessageComposer, AcceptQuestMessageComposer, AccountSafetyLockStatusChangeMessageEvent, AchievementEvent, AchievementNotificationMessageEvent, AchievementResolutionCompletedMessageEvent, AchievementResolutionProgressMessageEvent, AchievementResolutionsMessageEvent, AchievementsEvent, AchievementsScoreEvent, ActivateQuestMessageComposer, ActivityPointNotificationMessageEvent, AddFavouriteRoomMessageComposer, AddJukeboxDiskComposer, AddSpamWallPostItMessageComposer, ApplySnapshotMessageComposer, ApplyTonerComposer, ApproveAllMembershipRequestsMessageComposer, ApproveNameMessageComposer, ApproveNameMessageEvent, AuthenticatedEvent, AuthenticationMessageComposer, AvailabilityStatusMessageEvent, AvailabilityTimeMessageEvent, AvatarEffectActivatedComposer, AvatarEffectActivatedEvent, AvatarEffectAddedEvent, AvatarEffectExpiredEvent, AvatarEffectSelectedComposer, AvatarEffectSelectedEvent, AvatarEffectsEvent, BadgePointLimitsEvent, BadgeReceivedEvent, BadgesEvent, BannedUsersFromRoomEvent, BonusRareInfoMessageEvent, BotAddedToInventoryEvent, BotCommandConfigurationEvent, BotErrorEvent, BotForceOpenContextMenuEvent, BotInventoryMessageEvent, BotPlaceComposer, BotReceivedMessageEvent, BotRemoveComposer, BotRemovedFromInventoryEvent, BotSkillListUpdateEvent, BotSkillSaveComposer, BreedPetsMessageComposer, BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, BundleDiscountRulesetMessageEvent, BuyMarketplaceOfferMessageComposer, BuyMarketplaceTokensMessageComposer, CallForHelpDisabledNotifyMessageEvent, CallForHelpFromForumMessageMessageComposer, CallForHelpFromForumThreadMessageComposer, CallForHelpFromIMMessageComposer, CallForHelpFromPhotoMessageComposer, CallForHelpFromSelfieMessageComposer, CallForHelpMessageComposer, CallForHelpPendingCallsDeletedMessageEvent, CallForHelpPendingCallsMessageEvent, CallForHelpReplyMessageEvent, CallForHelpResultMessageEvent, CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraSnapshotMessageEvent, CameraStorageUrlMessageEvent, CampaignCalendarDataMessageEvent, CampaignCalendarDoorOpenedMessageEvent, CanCreateRoomEvent, CanCreateRoomEventEvent, CanCreateRoomMessageComposer, CancelEventMessageComposer, CancelMarketplaceOfferMessageComposer, CancelMysteryBoxWaitMessageEvent, CancelPetBreedingComposer, CancelQuestMessageComposer, CatalogGroupsComposer, CatalogPageExpirationEvent, CatalogPageMessageEvent, CatalogPageWithEarliestExpiryMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, CategoriesWithVisitorCountEvent, CfhChatlogEvent, CfhSanctionMessageEvent, CfhTopicsInitEvent, ChangeEmailComposer, ChangeEmailResultEvent, ChangeQueueMessageComposer, ChangeUserNameMessageComposer, ChangeUserNameResultMessageEvent, ChatReviewGuideDecidesOnOfferMessageComposer, ChatReviewGuideDetachedMessageComposer, ChatReviewGuideVoteMessageComposer, ChatReviewSessionCreateMessageComposer, ChatReviewSessionDetachedMessageEvent, ChatReviewSessionOfferedToGuideMessageEvent, ChatReviewSessionResultsMessageEvent, ChatReviewSessionStartedMessageEvent, ChatReviewSessionVotingStatusMessageEvent, CheckUserNameMessageComposer, CheckUserNameResultMessageEvent, ClientHelloMessageComposer, ClientPingEvent, CloseIssueDefaultActionMessageComposer, CloseIssuesMessageComposer, ClubGiftInfoEvent, ClubGiftNotificationEvent, ClubGiftSelectedEvent, CommunityGoalEarnedPrizesMessageEvent, CommunityGoalHallOfFameMessageEvent, CommunityGoalProgressMessageEvent, CommunityGoalVoteMessageComposer, CommunityGoalVoteMessageEvent, CompetitionEntrySubmitResultEvent, CompetitionRoomsDataMessageEvent, CompetitionRoomsSearchMessageComposer, CompetitionStatusMessageEvent, CompetitionVotingInfoMessageEvent, CompleteDiffieHandshakeEvent, CompleteDiffieHandshakeMessageComposer, CompostPlantMessageComposer, ConcurrentUsersGoalProgressMessageEvent, ConfirmPetBreedingComposer, ConnectionErrorEvent, ControlYoutubeDisplayPlaybackMessageComposer, ConvertGlobalRoomIdMessageComposer, ConvertedRoomIdEvent, CraftComposer, CraftSecretComposer, CraftableProductsEvent, CraftingRecipeEvent, CraftingRecipesAvailableEvent, CraftingResultEvent, CreateFlatMessageComposer, CurrentTimingCodeMessageEvent, CustomUserNotificationMessageEvent, DeclineFriendMessageComposer, DefaultSanctionMessageComposer, DeleteFavouriteRoomMessageComposer, DeletePendingCallsForHelpMessageComposer, DesktopViewComposer, DesktopViewEvent, DiceValueMessageEvent, DirectSMSClubBuyAvailableMessageEvent, DisconnectMessageComposer, DisconnectReasonEvent, DoorbellMessageEvent, EditEventMessageComposer, ElementPointerMessageEvent, EmailStatusResultEvent, EpicPopupMessageEvent, ExtendRentOrBuyoutFurniMessageComposer, ExtendRentOrBuyoutStripItemMessageComposer, ExtendedProfileChangedMessageEvent, FavoriteMembershipUpdateMessageEvent, FavouriteChangedEvent, FavouritesEvent, FigureSetIdsMessageEvent, FigureUpdateEvent, FindFriendsProcessResultEvent, FindNewFriendsMessageComposer, FireworkChargeDataEvent, FlatAccessDeniedMessageEvent, FlatControllerAddedEvent, FlatControllerRemovedEvent, FlatControllersEvent, FlatCreatedEvent, FloodControlEvent, FloorHeightMapEvent, FollowFriendFailedEvent, FollowFriendMessageComposer, ForumDataMessageEvent, ForumsListMessageEvent, ForwardToACompetitionRoomMessageComposer, ForwardToARandomPromotedRoomMessageComposer, ForwardToASubmittableRoomMessageComposer, ForwardToRandomCompetitionRoomMessageComposer, ForwardToSomeRoomMessageComposer, FriendFurniConfirmLockMessageComposer, FriendListFragmentEvent, FriendListUpdateComposer, FriendListUpdateEvent, FriendNotificationEvent, FriendRequestQuestCompleteMessageComposer, FriendRequestsEvent, FurniRentOrBuyoutOfferMessageEvent, FurnitureAliasesComposer, FurnitureAliasesEvent, FurnitureColorWheelComposer, FurnitureDataEvent, FurnitureDiceActivateComposer, FurnitureDiceDeactivateComposer, FurnitureExchangeComposer, FurnitureFloorAddEvent, FurnitureFloorEvent, FurnitureFloorRemoveEvent, FurnitureFloorUpdateComposer, FurnitureFloorUpdateEvent, FurnitureGroupInfoComposer, FurnitureListAddOrUpdateEvent, FurnitureListComposer, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListRemovedEvent, FurnitureMannequinSaveLookComposer, FurnitureMannequinSaveNameComposer, FurnitureMultiStateComposer, FurnitureOneWayDoorComposer, FurniturePickupComposer, FurniturePlaceComposer, FurniturePlacePaintComposer, FurniturePostItPlaceComposer, FurniturePostItPlacedEvent, FurnitureRandomStateComposer, FurnitureStackHeightComposer, FurnitureStackHeightEvent, FurnitureWallAddEvent, FurnitureWallEvent, FurnitureWallMultiStateComposer, FurnitureWallRemoveEvent, FurnitureWallUpdateComposer, FurnitureWallUpdateEvent, Game2AccountGameStatusMessageEvent, Game2CheckGameDirectoryStatusMessageComposer, Game2ExitGameMessageComposer, Game2GameChatMessageComposer, Game2GameDirectoryStatusMessageEvent, Game2GetAccountGameStatusMessageComposer, Game2GetWeeklyFriendsLeaderboardComposer, Game2GetWeeklyLeaderboardComposer, Game2InArenaQueueMessageEvent, Game2JoiningGameFailedMessageEvent, Game2LoadStageReadyMessageComposer, Game2PlayAgainMessageComposer, Game2RequestFullStatusUpdateMessageComposer, Game2StartingGameFailedMessageEvent, Game2StopCounterMessageEvent, Game2UserLeftGameMessageEvent, Game2WeeklyFriendsLeaderboardEvent, Game2WeeklyLeaderboardEvent, GameAchievementsMessageEvent, GameInviteMessageEvent, GameListMessageEvent, GameStatusMessageEvent, GameUnloadedMessageComposer, GenericErrorEvent, GetBadgePointLimitsComposer, GetBonusRareInfoMessageComposer, GetBotInventoryComposer, GetBundleDiscountRulesetComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetCatalogPageExpirationComposer, GetCatalogPageWithEarliestExpiryComposer, GetCategoriesWithUserCountMessageComposer, GetCfhChatlogMessageComposer, GetCfhStatusMessageComposer, GetClubGiftInfo, GetClubOffersMessageComposer, GetCommunityGoalEarnedPrizesMessageComposer, GetCommunityGoalHallOfFameMessageComposer, GetCommunityGoalProgressMessageComposer, GetConcurrentUsersGoalProgressMessageComposer, GetConcurrentUsersRewardMessageComposer, GetCraftableProductsComposer, GetCraftingRecipeComposer, GetCraftingRecipesAvailableComposer, GetCurrentTimingCodeMessageComposer, GetCustomRoomFilterMessageComposer, GetDailyQuestMessageComposer, GetDirectClubBuyAvailableComposer, GetEmailStatusComposer, GetExtendedProfileByNameMessageComposer, GetFaqCategoryMessageComposer, GetFaqTextMessageComposer, GetForumStatsMessageComposer, GetForumsListMessageComposer, GetFriendRequestsComposer, GetGameAchievementsMessageComposer, GetGameListMessageComposer, GetGameStatusMessageComposer, GetGiftMessageComposer, GetGiftWrappingConfigurationComposer, GetGuestRoomMessageComposer, GetGuestRoomResultEvent, GetGuideReportingStatusMessageComposer, GetHabboBasicMembershipExtendOfferComposer, GetHabboClubExtendOfferMessageComposer, GetHabboGroupBadgesMessageComposer, GetIgnoredUsersComposer, GetInterstitialMessageComposer, GetIsBadgeRequestFulfilledComposer, GetIsOfferGiftableComposer, GetIsUserPartOfCompetitionMessageComposer, GetItemDataComposer, GetJukeboxPlayListMessageComposer, GetLimitedOfferAppearingNextComposer, GetMarketplaceCanMakeOfferComposer, GetMarketplaceConfigurationMessageComposer, GetMarketplaceItemStatsComposer, GetMarketplaceOffersMessageComposer, GetMarketplaceOwnOffersMessageComposer, GetMessagesMessageComposer, GetModeratorRoomInfoMessageComposer, GetModeratorUserInfoMessageComposer, GetNextTargetedOfferComposer, GetNowPlayingMessageComposer, GetOccupiedTilesMessageComposer, GetOfficialRoomsMessageComposer, GetOfficialSongIdMessageComposer, GetPendingCallsForHelpMessageComposer, GetPetCommandsComposer, GetPopularRoomTagsMessageComposer, GetProductOfferComposer, GetPromoArticlesComposer, GetQuestsMessageComposer, GetQuizQuestionsComposer, GetRecyclerStatusMessageComposer, GetRentOrBuyoutOfferMessageComposer, GetResolutionAchievementsMessageComposer, GetRoomAdPurchaseInfoComposer, GetRoomChatlogMessageComposer, GetRoomEntryDataMessageComposer, GetRoomEntryTileMessageComposer, GetRoomVisitsMessageComposer, GetSeasonalCalendarDailyOfferComposer, GetSeasonalQuestsOnlyMessageComposer, GetSecondsUntilMessageComposer, GetSellablePetPalettesComposer, GetSongInfoMessageComposer, GetSoundMachinePlayListMessageComposer, GetSoundSettingsComposer, GetTalentTrackLevelMessageComposer, GetTargetedOfferComposer, GetThreadMessageComposer, GetThreadsMessageComposer, GetUnreadForumsCountMessageComposer, GetUserChatlogMessageComposer, GetUserEventCatsMessageComposer, GetUserFlatCatsMessageComposer, GetUserGameAchievementsMessageComposer, GetUserSongDisksMessageComposer, GetUserTagsComposer, GetWardrobeMessageComposer, GetWeeklyGameRewardComposer, GetWeeklyGameRewardWinnersComposer, GetYoutubeDisplayStatusMessageComposer, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, GoToFlatMessageComposer, GotMysteryBoxPrizeMessageEvent, GroupAdminGiveComposer, GroupAdminTakeComposer, GroupBadgePartsComposer, GroupBadgePartsEvent, GroupBuyComposer, GroupBuyDataComposer, GroupBuyDataEvent, GroupConfirmMemberRemoveEvent, GroupConfirmRemoveMemberComposer, GroupDeleteComposer, GroupDetailsChangedMessageEvent, GroupFavoriteComposer, GroupFurniContextMenuInfoMessageEvent, GroupInformationComposer, GroupInformationEvent, GroupJoinComposer, GroupMembersComposer, GroupMembersEvent, GroupMembershipAcceptComposer, GroupMembershipDeclineComposer, GroupMembershipRequestedMessageEvent, GroupPurchasedEvent, GroupRemoveMemberComposer, GroupSaveBadgeComposer, GroupSaveColorsComposer, GroupSaveInformationComposer, GroupSavePreferencesComposer, GroupSettingsComposer, GroupSettingsEvent, GroupUnfavoriteComposer, GuestRoomSearchResultEvent, GuideOnDutyStatusMessageEvent, GuideReportingStatusMessageEvent, GuideSessionAttachedMessageEvent, GuideSessionCreateMessageComposer, GuideSessionDetachedMessageEvent, GuideSessionEndedMessageEvent, GuideSessionErrorMessageEvent, GuideSessionFeedbackMessageComposer, GuideSessionGetRequesterRoomMessageComposer, GuideSessionGuideDecidesMessageComposer, GuideSessionInviteRequesterMessageComposer, GuideSessionInvitedToGuideRoomMessageEvent, GuideSessionIsTypingMessageComposer, GuideSessionMessageMessageComposer, GuideSessionMessageMessageEvent, GuideSessionOnDutyUpdateMessageComposer, GuideSessionPartnerIsTypingMessageEvent, GuideSessionReportMessageComposer, GuideSessionRequesterCancelsMessageComposer, GuideSessionRequesterRoomMessageEvent, GuideSessionResolvedMessageComposer, GuideSessionStartedMessageEvent, GuideTicketCreationResultMessageEvent, GuideTicketResolutionMessageEvent, GuildBaseSearchMessageComposer, GuildEditFailedMessageEvent, GuildForumThreadsEvent, GuildMemberMgmtFailedMessageEvent, GuildMembershipsMessageEvent, HabboBroadcastMessageEvent, HabboClubExtendOfferMessageEvent, HabboClubOffersMessageEvent, HabboGroupBadgesMessageEvent, HabboGroupDeactivatedMessageEvent, HabboGroupJoinFailedMessageEvent, HabboSearchComposer, HabboSearchResultEvent, HarvestPetMessageComposer, HotelClosedAndOpensEvent, HotelClosesAndWillOpenAtEvent, HotelMergeNameChangeEvent, HotelWillCloseInMinutesEvent, IdentityAccountsEvent, IgnoreResultEvent, IgnoreUserComposer, IgnoreUserIdComposer, IgnoredUsersEvent, InClientLinkEvent, IncomingHeader, InfoFeedEnableMessageEvent, InfoRetrieveMessageComposer, InitCameraMessageEvent, InitDiffieHandshakeEvent, InitDiffieHandshakeMessageComposer, InstantMessageErrorEvent, InterstitialMessageEvent, InterstitialShownMessageComposer, IsBadgeRequestFulfilledEvent, IsOfferGiftableMessageEvent, IsUserPartOfCompetitionMessageEvent, IssueCloseNotificationMessageEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssuePickFailedMessageEvent, ItemDataUpdateMessageEvent, JoinQueueMessageComposer, JoinedQueueMessageEvent, JoiningQueueFailedMessageEvent, JukeboxPlayListFullMessageEvent, JukeboxSongDisksMessageEvent, LagWarningReportMessageComposer, LeaveQueueMessageComposer, LeftQueueMessageEvent, LimitedEditionSoldOutEvent, LimitedOfferAppearingNextMessageEvent, LoadGameMessageEvent, LoadGameUrlEvent, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, MOTDNotificationEvent, MaintenanceStatusMessageEvent, MakeOfferMessageComposer, MarkCatalogNewAdditionsPageOpenedComposer, MarketPlaceOffersEvent, MarketplaceBuyOfferResultEvent, MarketplaceCanMakeOfferResult, MarketplaceCancelOfferResultEvent, MarketplaceConfigurationEvent, MarketplaceItemStatsEvent, MarketplaceMakeOfferResult, MarketplaceOwnOffersEvent, MessageErrorEvent, MessengerInitComposer, MessengerInitEvent, MiniMailNewMessageEvent, MiniMailUnreadCountEvent, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModToolPreferencesComposer, ModToolSanctionComposer, ModTradingLockMessageComposer, ModerateMessageMessageComposer, ModerateRoomMessageComposer, ModerateThreadMessageComposer, ModeratorActionMessageComposer, ModeratorActionResultMessageEvent, ModeratorCautionEvent, ModeratorInitMessageEvent, ModeratorMessageEvent, ModeratorRoomInfoEvent, ModeratorToolPreferencesEvent, ModeratorUserInfoEvent, MoodlightSettingsComposer, MoodlightSettingsSaveComposer, MoodlightTogggleStateComposer, MuteAllInRoomEvent, MyFavouriteRoomsSearchMessageComposer, MyFrequentRoomHistorySearchMessageComposer, MyFriendsRoomsSearchMessageComposer, MyGuildBasesSearchMessageComposer, MyRecommendedRoomsMessageComposer, MyRoomHistorySearchMessageComposer, MyRoomRightsSearchMessageComposer, MyRoomsSearchMessageComposer, MysteryBoxKeysEvent, MysteryBoxWaitingCanceledMessageComposer, NavigatorCategoryListModeComposer, NavigatorCollapsedEvent, NavigatorDeleteSavedSearchComposer, NavigatorHomeRoomEvent, NavigatorInitComposer, NavigatorLiftedEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchCloseComposer, NavigatorSearchComposer, NavigatorSearchEvent, NavigatorSearchOpenComposer, NavigatorSearchSaveComposer, NavigatorSearchesEvent, NavigatorSettingsEvent, NavigatorSettingsSaveComposer, NewConsoleMessageEvent, NewFriendRequestEvent, NewUserExperienceGetGiftsComposer, NewUserExperienceGiftOfferMessageEvent, NewUserExperienceNotCompleteEvent, NewUserExperienceScriptProceedComposer, NoOwnedRoomsAlertMessageEvent, NoSuchFlatEvent, NoobnessLevelMessageEvent, NotEnoughBalanceMessageEvent, NotificationDialogMessageEvent, NowPlayingMessageEvent, ObjectsDataUpdateEvent, ObjectsRollingEvent, OfferRewardDeliveredMessageEvent, OfficialSongIdMessageEvent, OneWayDoorStatusMessageEvent, OpenCampaignCalendarDoorAsStaffComposer, OpenCampaignCalendarDoorComposer, OpenMessageComposer, OpenMysteryTrophyMessageComposer, OpenPetPackageMessageComposer, OpenPetPackageRequestedMessageEvent, OpenPetPackageResultMessageEvent, OpenPresentComposer, OpenQuestTrackerMessageComposer, OpenWelcomeGiftComposer, OutgoingHeader, PeerUsersClassificationMessageComposer, PerformanceLogMessageComposer, PerkAllowancesMessageEvent, PetAddedToInventoryEvent, PetBreedingResultEvent, PetExperienceEvent, PetFigureUpdateEvent, PetInfoEvent, PetInventoryEvent, PetLevelNotificationEvent, PetLevelUpdateMessageEvent, PetMountComposer, PetMoveComposer, PetPlaceComposer, PetPlacingErrorEvent, PetReceivedMessageEvent, PetRemoveComposer, PetRemovedFromInventory, PetRespectComposer, PetRespectNoficationEvent, PetScratchFailedMessageEvent, PetSelectedMessageComposer, PetStatusUpdateEvent, PetSupplementComposer, PetSupplementedNotificationEvent, PetTrainingPanelMessageEvent, PhoneCollectionStateMessageEvent, PhotoCompetitionMessageComposer, PickIssuesMessageComposer, PlayListMessageEvent, PlayListSongAddedMessageEvent, PollAnswerComposer, PollContentsEvent, PollErrorEvent, PollOfferEvent, PollRejectComposer, PollStartComposer, PongMessageComposer, PopularRoomTagsResultEvent, PopularRoomsSearchMessageComposer, PostMessageMessageComposer, PostMessageMessageEvent, PostQuizAnswersComposer, PostThreadMessageEvent, PresentOpenedMessageEvent, ProductOfferEvent, PromoArticlesMessageEvent, PublishPhotoMessageComposer, PurchaseBasicMembershipExtensionComposer, PurchaseErrorMessageEvent, PurchaseFromCatalogAsGiftComposer, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, PurchasePhotoMessageComposer, PurchaseRoomAdMessageComposer, PurchaseTargetedOfferComposer, PurchaseVipMembershipExtensionComposer, QuestCancelledMessageEvent, QuestCompletedMessageEvent, QuestDailyMessageEvent, QuestMessageEvent, QuestionAnsweredEvent, QuestionEvent, QuestionFinishedEvent, QuestsMessageEvent, QuizDataMessageEvent, QuizResultsMessageEvent, RateFlatMessageComposer, RecycleItemsMessageComposer, RecyclerFinishedMessageEvent, RecyclerStatusMessageEvent, RedeemCommunityGoalPrizeMessageComposer, RedeemItemClothingComposer, RedeemMarketplaceOfferCreditsMessageComposer, RedeemVoucherMessageComposer, RejectQuestMessageComposer, RelationshipStatusInfoEvent, ReleaseIssuesMessageComposer, RemainingMuteEvent, RemoveAllRightsMessageComposer, RemoveFriendComposer, RemoveJukeboxDiskComposer, RemoveOwnRoomRightsRoomMessageComposer, RemovePetSaddleComposer, RemoveWallItemComposer, RenderRoomMessageComposer, RenderRoomThumbnailMessageComposer, RentableSpaceCancelRentMessageComposer, RentableSpaceRentFailedMessageEvent, RentableSpaceRentMessageComposer, RentableSpaceRentOkMessageEvent, RentableSpaceStatusMessageComposer, RentableSpaceStatusMessageEvent, RequestABadgeComposer, RequestAchievementsMessageComposer, RequestBadgesComposer, RequestBotCommandConfigurationComposer, RequestCameraConfigurationComposer, RequestFriendComposer, RequestFurniInventoryWhenNotInRoomComposer, RequestPetInfoComposer, RequestPetsComposer, RequestSpamWallPostItMessageEvent, ResetPhoneNumberStateMessageComposer, ResetResolutionAchievementMessageComposer, RespectReceivedEvent, RestoreClientMessageEvent, RoomAdErrorEvent, RoomAdEventTabAdClickedComposer, RoomAdEventTabViewedComposer, RoomAdPurchaseInfoEvent, RoomAdPurchaseInitiatedComposer, RoomAdSearchMessageComposer, RoomAmbassadorAlertComposer, RoomBanUserComposer, RoomBannedUsersComposer, RoomChatSettingsEvent, RoomChatlogEvent, RoomCompetitionInitMessageComposer, RoomDeleteComposer, RoomDimmerPresetsEvent, RoomDoorbellAcceptedEvent, RoomDoorbellAccessComposer, RoomEnterComposer, RoomEnterErrorEvent, RoomEnterEvent, RoomEntryInfoMessageEvent, RoomEntryTileMessageEvent, RoomEventCancelEvent, RoomEventEvent, RoomFilterSettingsMessageEvent, RoomForwardEvent, RoomGiveRightsComposer, RoomHeightMapEvent, RoomHeightMapUpdateEvent, RoomInviteErrorEvent, RoomInviteEvent, RoomKickUserComposer, RoomMessageNotificationMessageEvent, RoomMuteComposer, RoomMuteUserComposer, RoomNetworkOpenConnectionMessageComposer, RoomOccupiedTilesMessageEvent, RoomPaintEvent, RoomPollResultEvent, RoomReadyMessageEvent, RoomRightsClearEvent, RoomRightsEvent, RoomRightsOwnerEvent, RoomScoreEvent, RoomSettingsComposer, RoomSettingsDataEvent, RoomSettingsErrorEvent, RoomSettingsSaveErrorEvent, RoomSettingsSavedEvent, RoomSettingsUpdatedEvent, RoomTakeRightsComposer, RoomTextSearchMessageComposer, RoomThumbnailUpdateResultEvent, RoomUnbanUserComposer, RoomUnitActionComposer, RoomUnitChatComposer, RoomUnitChatEvent, RoomUnitChatShoutComposer, RoomUnitChatShoutEvent, RoomUnitChatStyleComposer, RoomUnitChatWhisperComposer, RoomUnitChatWhisperEvent, RoomUnitDanceComposer, RoomUnitDanceEvent, RoomUnitDropHandItemComposer, RoomUnitEffectEvent, RoomUnitEvent, RoomUnitExpressionEvent, RoomUnitGiveHandItemComposer, RoomUnitGiveHandItemPetComposer, RoomUnitHandItemEvent, RoomUnitHandItemReceivedEvent, RoomUnitIdleEvent, RoomUnitInfoEvent, RoomUnitLookComposer, RoomUnitNumberEvent, RoomUnitPostureComposer, RoomUnitRemoveEvent, RoomUnitSignComposer, RoomUnitStatusEvent, RoomUnitTypingEvent, RoomUnitTypingStartComposer, RoomUnitTypingStopComposer, RoomUnitWalkComposer, RoomUsersClassificationMessageComposer, RoomUsersWithRightsComposer, RoomVisitsEvent, RoomVisualizationSettingsEvent, RoomsWhereMyFriendsAreSearchMessageComposer, RoomsWithHighestScoreSearchMessageComposer, SSOTicketMessageComposer, SanctionStatusEvent, SaveRoomSettingsComposer, SaveWardrobeOutfitMessageComposer, ScrGetKickbackInfoMessageComposer, ScrSendKickbackInfoMessageEvent, SearchFaqsMessageComposer, SeasonalCalendarDailyOfferMessageEvent, SeasonalQuestsMessageEvent, SecondsUntilMessageEvent, SelectClubGiftComposer, SellablePetPalettesMessageEvent, SendMessageComposer, SendRoomInviteComposer, SetActivatedBadgesComposer, SetClothingChangeDataMessageComposer, SetItemDataMessageComposer, SetObjectDataMessageComposer, SetPhoneNumberVerificationStatusMessageComposer, SetRelationshipStatusComposer, SetRoomSessionTagsMessageComposer, SetTargetedOfferStateComposer, SetYoutubeDisplayPlaylistMessageComposer, ShopTargetedOfferViewedComposer, ShowEnforceRoomCategoryDialogEvent, ShowMysteryBoxWaitMessageEvent, SimpleAlertMessageEvent, StartCampaignMessageComposer, StartRoomPollEvent, SubmitRoomToCompetitionMessageComposer, TalentLevelUpEvent, TalentTrackComposer, TalentTrackLevelMessageEvent, TalentTrackMessageEvent, TargetedOfferEvent, TargetedOfferNotFoundEvent, ThreadMessagesMessageEvent, ThumbnailStatusMessageEvent, TogglePetBreedingComposer, TogglePetRidingComposer, ToggleStaffPickMessageComposer, TradingAcceptComposer, TradingAcceptEvent, TradingCancelComposer, TradingCloseComposer, TradingCloseEvent, TradingCompletedEvent, TradingConfirmationComposer, TradingConfirmationEvent, TradingListAddItemComposer, TradingListAddItemsComposer, TradingListItemEvent, TradingListItemRemoveComposer, TradingNoSuchItemEvent, TradingNotOpenEvent, TradingOpenComposer, TradingOpenEvent, TradingOpenFailedEvent, TradingOtherNotAllowedEvent, TradingUnacceptComposer, TradingYouAreNotAllowedEvent, TraxSongInfoMessageEvent, TryPhoneNumberMessageComposer, TryPhoneNumberResultMessageEvent, TryVerificationCodeResultMessageEvent, UnblockGroupMemberMessageComposer, UnignoreUserComposer, UniqueIDMessageComposer, UnloadGameMessageEvent, UnreadForumsCountMessageEvent, UnseenItemsEvent, UnseenResetCategoryComposer, UnseenResetItemsComposer, UpdateActionMessageComposer, UpdateConditionMessageComposer, UpdateFloorPropertiesMessageComposer, UpdateForumReadMarkerMessageComposer, UpdateForumSettingsMessageComposer, UpdateHomeRoomMessageComposer, UpdateMessageMessageEvent, UpdateRoomCategoryAndTradeSettingsComposer, UpdateRoomFilterMessageComposer, UpdateRoomThumbnailMessageComposer, UpdateThreadMessageComposer, UpdateThreadMessageEvent, UpdateTriggerMessageComposer, UsePetProductComposer, UserBannedMessageEvent, UserChatlogEvent, UserClassificationMessageEvent, UserCreditsEvent, UserCurrencyComposer, UserCurrencyEvent, UserCurrentBadgesComposer, UserCurrentBadgesEvent, UserEventCatsEvent, UserFigureComposer, UserFlatCatsEvent, UserGameAchievementsMessageEvent, UserInfoEvent, UserMottoComposer, UserNameChangeMessageEvent, UserPermissionsEvent, UserProfileComposer, UserProfileEvent, UserRelationshipsComposer, UserRespectComposer, UserSettingsCameraFollowComposer, UserSettingsEvent, UserSettingsOldChatComposer, UserSettingsRoomInvitesComposer, UserSettingsSoundComposer, UserSongDisksInventoryMessageEvent, UserSubscriptionComposer, UserSubscriptionEvent, UserTagsMessageEvent, UserUnbannedFromRoomEvent, UserWardrobePageEvent, VerifyCodeMessageComposer, VersionCheckMessageComposer, VisitUserComposer, VoteForRoomMessageComposer, VotePollCounterMessageComposer, VoucherRedeemErrorMessageEvent, VoucherRedeemOkMessageEvent, WardrobeMessageEvent, WeeklyCompetitiveFriendsLeaderboardEvent, WeeklyCompetitiveLeaderboardEvent, WeeklyGameRewardEvent, WeeklyGameRewardWinnersEvent, WelcomeGiftChangeEmailComposer, WelcomeGiftChangeEmailResultEvent, WelcomeGiftStatusEvent, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredRewardResultMessageEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent, YouArePlayingGameEvent, YouAreSpectatorMessageEvent, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent } from './messages';
+
+export class NitroMessages implements IMessageConfiguration
+{
+ private _events: Map;
+ private _composers: Map;
+
+ constructor()
+ {
+ this._events = new Map();
+ this._composers = new Map();
+
+ this.registerEvents();
+ this.registerComposers();
+ }
+
+ private registerEvents(): void
+ {
+ // ADVERTISEMENT
+ this._events.set(IncomingHeader.INTERSTITIAL_MESSAGE, InterstitialMessageEvent);
+ this._events.set(IncomingHeader.ROOM_AD_ERROR, RoomAdErrorEvent);
+
+ // AVAILABILITY
+ this._events.set(IncomingHeader.AVAILABILITY_STATUS, AvailabilityStatusMessageEvent);
+ this._events.set(IncomingHeader.AVAILABILITY_TIME, AvailabilityTimeMessageEvent);
+ this._events.set(IncomingHeader.HOTEL_CLOSED_AND_OPENS, HotelClosedAndOpensEvent);
+ this._events.set(IncomingHeader.HOTEL_CLOSES_AND_OPENS_AT, HotelClosesAndWillOpenAtEvent);
+ this._events.set(IncomingHeader.HOTEL_WILL_CLOSE_MINUTES, HotelWillCloseInMinutesEvent);
+ this._events.set(IncomingHeader.HOTEL_MAINTENANCE, MaintenanceStatusMessageEvent);
+
+ // AVATAR
+ this._events.set(IncomingHeader.USER_CHANGE_NAME, ChangeUserNameResultMessageEvent);
+ this._events.set(IncomingHeader.CHECK_USER_NAME, CheckUserNameResultMessageEvent);
+ this._events.set(IncomingHeader.USER_FIGURE, FigureUpdateEvent);
+ this._events.set(IncomingHeader.USER_OUTFITS, WardrobeMessageEvent);
+
+ // BOTS
+ this._events.set(IncomingHeader.ADD_BOT_TO_INVENTORY, BotAddedToInventoryEvent);
+ this._events.set(IncomingHeader.USER_BOTS, BotInventoryMessageEvent);
+ this._events.set(IncomingHeader.BOT_RECEIVED, BotReceivedMessageEvent);
+ this._events.set(IncomingHeader.REMOVE_BOT_FROM_INVENTORY, BotRemovedFromInventoryEvent);
+
+ // CALL FOR HELP
+ this._events.set(IncomingHeader.CFH_SANCTION, CfhSanctionMessageEvent);
+ this._events.set(IncomingHeader.CFH_TOPICS, CfhTopicsInitEvent);
+ this._events.set(IncomingHeader.CFH_SANCTION_STATUS, SanctionStatusEvent);
+
+ // CAMERA
+ this._events.set(IncomingHeader.CAMERA_PUBLISH_STATUS, CameraPublishStatusMessageEvent);
+ this._events.set(IncomingHeader.CAMERA_PURCHASE_OK, CameraPurchaseOKMessageEvent);
+ this._events.set(IncomingHeader.CAMERA_STORAGE_URL, CameraStorageUrlMessageEvent);
+ this._events.set(IncomingHeader.COMPETITION_STATUS, CompetitionStatusMessageEvent);
+ this._events.set(IncomingHeader.INIT_CAMERA, InitCameraMessageEvent);
+ this._events.set(IncomingHeader.THUMBNAIL_STATUS, ThumbnailStatusMessageEvent);
+ this._events.set(IncomingHeader.CAMERA_SNAPSHOT, CameraSnapshotMessageEvent);
+
+ // CAMPAIGN
+ this._events.set(IncomingHeader.CAMPAIGN_CALENDAR_DATA, CampaignCalendarDataMessageEvent);
+ this._events.set(IncomingHeader.CAMPAIGN_CALENDAR_DOOR_OPENED, CampaignCalendarDoorOpenedMessageEvent);
+
+ // CATALOG
+ this._events.set(IncomingHeader.BONUS_RARE_INFO, BonusRareInfoMessageEvent);
+ this._events.set(IncomingHeader.BUILDERS_CLUB_FURNI_COUNT, BuildersClubFurniCountMessageEvent);
+ this._events.set(IncomingHeader.BUILDERS_CLUB_SUBSCRIPTION, BuildersClubSubscriptionStatusMessageEvent);
+ this._events.set(IncomingHeader.BUNDLE_DISCOUNT_RULESET, BundleDiscountRulesetMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_PAGE_EXPIRATION, CatalogPageExpirationEvent);
+ this._events.set(IncomingHeader.CATALOG_PAGE, CatalogPageMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_PAGE_LIST, CatalogPagesListEvent);
+ this._events.set(IncomingHeader.CATALOG_EARLIEST_EXPIRY, CatalogPageWithEarliestExpiryMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_PUBLISHED, CatalogPublishedMessageEvent);
+ this._events.set(IncomingHeader.CLUB_GIFT_INFO, ClubGiftInfoEvent);
+ this._events.set(IncomingHeader.CLUB_GIFT_SELECTED, ClubGiftSelectedEvent);
+ this._events.set(IncomingHeader.DIRECT_SMS_CLUB_BUY, DirectSMSClubBuyAvailableMessageEvent);
+ this._events.set(IncomingHeader.GIFT_RECEIVER_NOT_FOUND, GiftReceiverNotFoundEvent);
+ this._events.set(IncomingHeader.GIFT_WRAPPER_CONFIG, GiftWrappingConfigurationEvent);
+ this._events.set(IncomingHeader.CLUB_EXTENDED_OFFER, HabboClubExtendOfferMessageEvent);
+ this._events.set(IncomingHeader.CLUB_OFFERS, HabboClubOffersMessageEvent);
+ this._events.set(IncomingHeader.IS_OFFER_GIFTABLE, IsOfferGiftableMessageEvent);
+ this._events.set(IncomingHeader.LIMITED_SOLD_OUT, LimitedEditionSoldOutEvent);
+ this._events.set(IncomingHeader.LIMITED_OFFER_APPEARING_NEXT, LimitedOfferAppearingNextMessageEvent);
+ this._events.set(IncomingHeader.NOT_ENOUGH_BALANCE, NotEnoughBalanceMessageEvent);
+ this._events.set(IncomingHeader.PRODUCT_OFFER, ProductOfferEvent);
+ this._events.set(IncomingHeader.CATALOG_PURCHASE_ERROR, PurchaseErrorMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_PURCHASE_NOT_ALLOWED, PurchaseNotAllowedMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_PURCHASE_OK, PurchaseOKMessageEvent);
+ this._events.set(IncomingHeader.ROOM_AD_PURCHASE, RoomAdPurchaseInfoEvent);
+ this._events.set(IncomingHeader.SEASONAL_CALENDAR_OFFER, SeasonalCalendarDailyOfferMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_RECEIVE_PET_BREEDS, SellablePetPalettesMessageEvent);
+ this._events.set(IncomingHeader.TARGET_OFFER, TargetedOfferEvent);
+ this._events.set(IncomingHeader.TARGET_OFFER_NOT_FOUND, TargetedOfferNotFoundEvent);
+ this._events.set(IncomingHeader.REDEEM_VOUCHER_ERROR, VoucherRedeemErrorMessageEvent);
+ this._events.set(IncomingHeader.REDEEM_VOUCHER_OK, VoucherRedeemOkMessageEvent);
+
+ // CLIENT
+ this._events.set(IncomingHeader.CLIENT_PING, ClientPingEvent);
+
+ // COMPETITION
+ this._events.set(IncomingHeader.COMPETITION_ENTRY_SUBMIT, CompetitionEntrySubmitResultEvent);
+ this._events.set(IncomingHeader.COMPETITION_VOTING_INFO, CompetitionVotingInfoMessageEvent);
+ this._events.set(IncomingHeader.COMPETITION_TIMING_CODE, CurrentTimingCodeMessageEvent);
+ this._events.set(IncomingHeader.COMPETITION_USER_PART_OF, IsUserPartOfCompetitionMessageEvent);
+ this._events.set(IncomingHeader.COMPETITION_NO_OWNED_ROOMS, NoOwnedRoomsAlertMessageEvent);
+ this._events.set(IncomingHeader.COMPETITION_SECONDS_UNTIL, SecondsUntilMessageEvent);
+
+ // CRAFTING
+ this._events.set(IncomingHeader.CRAFTABLE_PRODUCTS, CraftableProductsEvent);
+ this._events.set(IncomingHeader.CRAFTING_RECIPE, CraftingRecipeEvent);
+ this._events.set(IncomingHeader.CRAFTING_RECIPES_AVAILABLE, CraftingRecipesAvailableEvent);
+ this._events.set(IncomingHeader.CRAFTING_RESULT, CraftingResultEvent);
+
+ // DESKTOP
+ this._events.set(IncomingHeader.DESKTOP_VIEW, DesktopViewEvent);
+
+ // FRIENDLIST
+ this._events.set(IncomingHeader.MESSENGER_ACCEPT_FRIENDS, AcceptFriendResultEvent);
+ this._events.set(IncomingHeader.MESSENGER_FIND_FRIENDS, FindFriendsProcessResultEvent);
+ this._events.set(IncomingHeader.MESSENGER_FOLLOW_FAILED, FollowFriendFailedEvent);
+ this._events.set(IncomingHeader.MESSENGER_FRIENDS, FriendListFragmentEvent);
+ this._events.set(IncomingHeader.MESSENGER_UPDATE, FriendListUpdateEvent);
+ this._events.set(IncomingHeader.MESSENGER_FRIEND_NOTIFICATION, FriendNotificationEvent);
+ this._events.set(IncomingHeader.MESSENGER_REQUESTS, FriendRequestsEvent);
+ this._events.set(IncomingHeader.MESSENGER_SEARCH, HabboSearchResultEvent);
+ this._events.set(IncomingHeader.MESSENGER_INSTANCE_MESSAGE_ERROR, InstantMessageErrorEvent);
+ this._events.set(IncomingHeader.MESSENGER_MESSAGE_ERROR, MessageErrorEvent);
+ this._events.set(IncomingHeader.MESSENGER_INIT, MessengerInitEvent);
+ this._events.set(IncomingHeader.MESSENGER_MINIMAIL_NEW, MiniMailNewMessageEvent);
+ this._events.set(IncomingHeader.MESSENGER_MINIMAIL_COUNT, MiniMailUnreadCountEvent);
+ this._events.set(IncomingHeader.MESSENGER_CHAT, NewConsoleMessageEvent);
+ this._events.set(IncomingHeader.MESSENGER_REQUEST, NewFriendRequestEvent);
+ this._events.set(IncomingHeader.MESSENGER_INVITE_ERROR, RoomInviteErrorEvent);
+ this._events.set(IncomingHeader.MESSENGER_INVITE, RoomInviteEvent);
+
+ // GAMES
+ this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONCOMPLETED, AchievementResolutionCompletedMessageEvent);
+ this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONPROGRESS, AchievementResolutionProgressMessageEvent);
+ this._events.set(IncomingHeader.ACHIEVEMENTRESOLUTIONS, AchievementResolutionsMessageEvent);
+ this._events.set(IncomingHeader.LOAD_GAME_URL, LoadGameUrlEvent);
+ this._events.set(IncomingHeader.LOADGAME, LoadGameMessageEvent);
+ this._events.set(IncomingHeader.UNLOADGAME, UnloadGameMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_GAME_LIST, GameListMessageEvent);
+ this._events.set(IncomingHeader.GAMESTATUSMESSAGE, GameStatusMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_ACHIEVEMENTS, UserGameAchievementsMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_STATUS, Game2AccountGameStatusMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_IN_ARENA_QUEUE, Game2InArenaQueueMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_STOP_COUNTER, Game2StopCounterMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_USER_LEFT_GAME, Game2UserLeftGameMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_DIRECTORY_STATUS, Game2GameDirectoryStatusMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_STARTING_GAME_FAILED, Game2StartingGameFailedMessageEvent);
+ this._events.set(IncomingHeader.GAME_CENTER_JOINING_FAILED, Game2JoiningGameFailedMessageEvent);
+ this._events.set(IncomingHeader.GAMEACHIEVEMENTS, GameAchievementsMessageEvent);
+ this._events.set(IncomingHeader.GAMEINVITE, GameInviteMessageEvent);
+ this._events.set(IncomingHeader.JOINEDQUEUEMESSAGE, JoinedQueueMessageEvent);
+ this._events.set(IncomingHeader.JOININGQUEUEFAILED, JoiningQueueFailedMessageEvent);
+ this._events.set(IncomingHeader.LEFTQUEUE, LeftQueueMessageEvent);
+ this._events.set(IncomingHeader.WEEKLY_GAME_REWARD, WeeklyGameRewardEvent);
+ this._events.set(IncomingHeader.WEEKLY_GAME_REWARD_WINNERS, WeeklyGameRewardWinnersEvent);
+ this._events.set(IncomingHeader.WEEKLY_COMPETITIVE_LEADERBOARD, WeeklyCompetitiveLeaderboardEvent);
+ this._events.set(IncomingHeader.WEEKLY_COMPETITIVE_FRIENDS_LEADERBOARD, WeeklyCompetitiveFriendsLeaderboardEvent);
+ this._events.set(IncomingHeader.WEEKLY_GAME2_FRIENDS_LEADERBOARD, Game2WeeklyFriendsLeaderboardEvent);
+ this._events.set(IncomingHeader.WEEKLY_GAME2_LEADERBOARD, Game2WeeklyLeaderboardEvent);
+
+ // GROUP
+ this._events.set(IncomingHeader.GROUP_INFO, GroupInformationEvent);
+ this._events.set(IncomingHeader.GROUP_MEMBER_REMOVE_CONFIRM, GroupConfirmMemberRemoveEvent);
+ this._events.set(IncomingHeader.GROUP_MEMBERS, GroupMembersEvent);
+ this._events.set(IncomingHeader.GROUP_CREATE_OPTIONS, GroupBuyDataEvent);
+ this._events.set(IncomingHeader.GROUP_BADGE_PARTS, GroupBadgePartsEvent);
+ this._events.set(IncomingHeader.GROUP_SETTINGS, GroupSettingsEvent);
+ this._events.set(IncomingHeader.GROUP_PURCHASED, GroupPurchasedEvent);
+ this._events.set(IncomingHeader.GROUP_BADGES, HabboGroupBadgesMessageEvent);
+ this._events.set(IncomingHeader.GROUP_DEACTIVATE, HabboGroupDeactivatedMessageEvent);
+ this._events.set(IncomingHeader.GROUP_MEMBERSHIP_REQUESTED, GroupMembershipRequestedMessageEvent);
+ this._events.set(IncomingHeader.GROUP_DETAILS_CHANGED, GroupDetailsChangedMessageEvent);
+ this._events.set(IncomingHeader.GROUP_HABBO_JOIN_FAILED, HabboGroupJoinFailedMessageEvent);
+
+ // GROUP FORUMS
+ this._events.set(IncomingHeader.GROUP_FORUM_DATA, ForumDataMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_LIST, ForumsListMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_THREADS, GuildForumThreadsEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_POST, PostMessageMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_POST_THREAD, PostThreadMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_THREAD_MESSAGES, ThreadMessagesMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_UNREAD_COUNT, UnreadForumsCountMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_UPDATE_MESSAGE, UpdateMessageMessageEvent);
+ this._events.set(IncomingHeader.GROUP_FORUM_UPDATE_THREAD, UpdateThreadMessageEvent);
+
+ // HELP
+ this._events.set(IncomingHeader.CFH_DISABLED_NOTIFY, CallForHelpDisabledNotifyMessageEvent);
+ this._events.set(IncomingHeader.CFH_PENDING_CALLS_DELETED, CallForHelpPendingCallsDeletedMessageEvent);
+ this._events.set(IncomingHeader.CFH_PENDING_CALLS, CallForHelpPendingCallsMessageEvent);
+ this._events.set(IncomingHeader.CFH_REPLY, CallForHelpReplyMessageEvent);
+ this._events.set(IncomingHeader.CFH_RESULT_MESSAGE, CallForHelpResultMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_ON_DUTY_STATUS, GuideOnDutyStatusMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_ATTACHED, GuideSessionAttachedMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_DETACHED, GuideSessionDetachedMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_ENDED, GuideSessionEndedMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_ERROR, GuideSessionErrorMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_INVITED_TO_GUIDE_ROOM, GuideSessionInvitedToGuideRoomMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_MESSAGE, GuideSessionMessageMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_PARTNER_IS_TYPING, GuideSessionPartnerIsTypingMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_REQUESTER_ROOM, GuideSessionRequesterRoomMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_SESSION_STARTED, GuideSessionStartedMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_TICKET_CREATION_RESULT, GuideTicketCreationResultMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_TICKET_RESOLUTION, GuideTicketResolutionMessageEvent);
+ this._events.set(IncomingHeader.GUIDE_REPORTING_STATUS, GuideReportingStatusMessageEvent);
+ this._events.set(IncomingHeader.HOTEL_MERGE_NAME_CHANGE, HotelMergeNameChangeEvent);
+ this._events.set(IncomingHeader.ISSUE_CLOSE_NOTIFICATION, IssueCloseNotificationMessageEvent);
+ this._events.set(IncomingHeader.QUIZ_DATA, QuizDataMessageEvent);
+ this._events.set(IncomingHeader.QUIZ_RESULTS, QuizResultsMessageEvent);
+ this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_DETACHED, ChatReviewSessionDetachedMessageEvent);
+ this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_OFFERED_TO_GUIDE, ChatReviewSessionOfferedToGuideMessageEvent);
+ this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_RESULTS, ChatReviewSessionResultsMessageEvent);
+ this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_STARTED, ChatReviewSessionStartedMessageEvent);
+ this._events.set(IncomingHeader.CHAT_REVIEW_SESSION_VOTING_STATUS, ChatReviewSessionVotingStatusMessageEvent);
+
+ // INVENTORY
+ this._events.set(IncomingHeader.ACHIEVEMENT_PROGRESSED, AchievementEvent);
+ this._events.set(IncomingHeader.ACHIEVEMENT_LIST, AchievementsEvent);
+ this._events.set(IncomingHeader.USER_ACHIEVEMENT_SCORE, AchievementsScoreEvent);
+ this._events.set(IncomingHeader.USER_EFFECT_ACTIVATE, AvatarEffectActivatedEvent);
+ this._events.set(IncomingHeader.USER_EFFECT_LIST_ADD, AvatarEffectAddedEvent);
+ this._events.set(IncomingHeader.USER_EFFECT_LIST_REMOVE, AvatarEffectExpiredEvent);
+ this._events.set(IncomingHeader.USER_EFFECT_LIST, AvatarEffectsEvent);
+ this._events.set(IncomingHeader.AVATAR_EFFECT_SELECTED, AvatarEffectSelectedEvent);
+ this._events.set(IncomingHeader.USER_BADGES, BadgesEvent);
+ this._events.set(IncomingHeader.USER_BADGES_ADD, BadgeReceivedEvent);
+ this._events.set(IncomingHeader.BADGE_POINT_LIMITS, BadgePointLimitsEvent);
+ this._events.set(IncomingHeader.BADGE_REQUEST_FULFILLED, IsBadgeRequestFulfilledEvent);
+ this._events.set(IncomingHeader.USER_CLOTHING, FigureSetIdsMessageEvent);
+ this._events.set(IncomingHeader.USER_FURNITURE_ADD, FurnitureListAddOrUpdateEvent);
+ this._events.set(IncomingHeader.USER_FURNITURE, FurnitureListEvent);
+ this._events.set(IncomingHeader.USER_FURNITURE_REFRESH, FurnitureListInvalidateEvent);
+ this._events.set(IncomingHeader.USER_FURNITURE_REMOVE, FurnitureListRemovedEvent);
+ this._events.set(IncomingHeader.USER_FURNITURE_POSTIT_PLACED, FurniturePostItPlacedEvent);
+ this._events.set(IncomingHeader.USER_PETS, PetInventoryEvent);
+ this._events.set(IncomingHeader.USER_PET_REMOVE, PetRemovedFromInventory);
+ this._events.set(IncomingHeader.USER_PET_ADD, PetAddedToInventoryEvent);
+ this._events.set(IncomingHeader.PET_RECEIVED, PetReceivedMessageEvent);
+ this._events.set(IncomingHeader.PET_PLACING_ERROR, PetPlacingErrorEvent);
+ this._events.set(IncomingHeader.YOUTUBE_CONTROL_VIDEO, YoutubeControlVideoMessageEvent);
+ this._events.set(IncomingHeader.YOUTUBE_DISPLAY_PLAYLISTS, YoutubeDisplayPlaylistsEvent);
+ this._events.set(IncomingHeader.YOUTUBE_DISPLAY_VIDEO, YoutubeDisplayVideoMessageEvent);
+
+ // TRADING
+ this._events.set(IncomingHeader.TRADE_ACCEPTED, TradingAcceptEvent);
+ this._events.set(IncomingHeader.TRADE_CLOSED, TradingCloseEvent);
+ this._events.set(IncomingHeader.TRADE_COMPLETED, TradingCompletedEvent);
+ this._events.set(IncomingHeader.TRADE_CONFIRMATION, TradingConfirmationEvent);
+ this._events.set(IncomingHeader.TRADE_LIST_ITEM, TradingListItemEvent);
+ this._events.set(IncomingHeader.TRADE_NOT_OPEN, TradingNotOpenEvent);
+ this._events.set(IncomingHeader.TRADE_OPEN_FAILED, TradingOpenFailedEvent);
+ this._events.set(IncomingHeader.TRADE_OPEN, TradingOpenEvent);
+ this._events.set(IncomingHeader.TRADE_OTHER_NOT_ALLOWED, TradingOtherNotAllowedEvent);
+ this._events.set(IncomingHeader.TRADE_YOU_NOT_ALLOWED, TradingYouAreNotAllowedEvent);
+ this._events.set(IncomingHeader.TRADE_NO_SUCH_ITEM, TradingNoSuchItemEvent);
+
+ // LANDING VIEW
+ this._events.set(IncomingHeader.COMMUNITY_GOAL_VOTE_EVENT, CommunityGoalVoteMessageEvent);
+ this._events.set(IncomingHeader.PROMO_ARTICLES, PromoArticlesMessageEvent);
+
+ // MARKETPLACE
+ this._events.set(IncomingHeader.MARKETPLACE_AFTER_ORDER_STATUS, MarketplaceBuyOfferResultEvent);
+ this._events.set(IncomingHeader.MARKETPLACE_CANCEL_SALE, MarketplaceCancelOfferResultEvent);
+ this._events.set(IncomingHeader.MARKETPLACE_SELL_ITEM, MarketplaceCanMakeOfferResult);
+ this._events.set(IncomingHeader.MARKETPLACE_CONFIG, MarketplaceConfigurationEvent);
+ this._events.set(IncomingHeader.MARKETPLACE_ITEM_STATS, MarketplaceItemStatsEvent);
+ this._events.set(IncomingHeader.MARKETPLACE_ITEM_POSTED, MarketplaceMakeOfferResult);
+ this._events.set(IncomingHeader.MARKETPLACE_ITEMS_SEARCHED, MarketPlaceOffersEvent);
+ this._events.set(IncomingHeader.MARKETPLACE_OWN_ITEMS, MarketplaceOwnOffersEvent);
+
+ // MODERATION
+ this._events.set(IncomingHeader.USER_BANNED, UserBannedMessageEvent);
+ this._events.set(IncomingHeader.MODERATION_CAUTION, ModeratorCautionEvent);
+ this._events.set(IncomingHeader.MODTOOL_ROOM_INFO, ModeratorRoomInfoEvent);
+ this._events.set(IncomingHeader.MODTOOL_USER_CHATLOG, UserChatlogEvent);
+ this._events.set(IncomingHeader.MODTOOL_ROOM_CHATLOG, RoomChatlogEvent);
+ this._events.set(IncomingHeader.MODERATION_USER_INFO, ModeratorUserInfoEvent);
+ this._events.set(IncomingHeader.MODERATION_TOOL, ModeratorInitMessageEvent);
+ this._events.set(IncomingHeader.MODTOOL_VISITED_ROOMS_USER, RoomVisitsEvent);
+ this._events.set(IncomingHeader.CFH_CHATLOG, CfhChatlogEvent);
+ this._events.set(IncomingHeader.ISSUE_DELETED, IssueDeletedMessageEvent);
+ this._events.set(IncomingHeader.ISSUE_INFO, IssueInfoMessageEvent);
+ this._events.set(IncomingHeader.ISSUE_PICK_FAILED, IssuePickFailedMessageEvent);
+ this._events.set(IncomingHeader.MODERATOR_ACTION_RESULT, ModeratorActionResultMessageEvent);
+ this._events.set(IncomingHeader.MODERATOR_MESSAGE, ModeratorMessageEvent);
+ this._events.set(IncomingHeader.MODERATOR_TOOL_PREFERENCES, ModeratorToolPreferencesEvent);
+
+ // MYSTERY BOX
+ this._events.set(IncomingHeader.MYSTERY_BOX_KEYS, MysteryBoxKeysEvent);
+ this._events.set(IncomingHeader.GOTMYSTERYBOXPRIZEMESSAGE, GotMysteryBoxPrizeMessageEvent);
+ this._events.set(IncomingHeader.CANCELMYSTERYBOXWAITMESSAGE, CancelMysteryBoxWaitMessageEvent);
+ this._events.set(IncomingHeader.SHOWMYSTERYBOXWAITMESSAGE, ShowMysteryBoxWaitMessageEvent);
+
+ // NAVIGATOR
+ this._events.set(IncomingHeader.CAN_CREATE_ROOM, CanCreateRoomEvent);
+ this._events.set(IncomingHeader.CAN_CREATE_ROOM_EVENT, CanCreateRoomEventEvent);
+ this._events.set(IncomingHeader.CATEGORIES_WITH_VISITOR_COUNT, CategoriesWithVisitorCountEvent);
+ this._events.set(IncomingHeader.COMPETITION_ROOMS_DATA, CompetitionRoomsDataMessageEvent);
+ this._events.set(IncomingHeader.CONVERTED_ROOM_ID, ConvertedRoomIdEvent);
+ this._events.set(IncomingHeader.ROOM_DOORBELL, DoorbellMessageEvent);
+ this._events.set(IncomingHeader.USER_FAVORITE_ROOM, FavouriteChangedEvent);
+ this._events.set(IncomingHeader.USER_FAVORITE_ROOM_COUNT, FavouritesEvent);
+ this._events.set(IncomingHeader.ROOM_DOORBELL_REJECTED, FlatAccessDeniedMessageEvent);
+ this._events.set(IncomingHeader.ROOM_CREATED, FlatCreatedEvent);
+ this._events.set(IncomingHeader.ROOM_INFO, GetGuestRoomResultEvent);
+ this._events.set(IncomingHeader.GUEST_ROOM_SEARCH_RESULT, GuestRoomSearchResultEvent);
+ this._events.set(IncomingHeader.USER_HOME_ROOM, NavigatorHomeRoomEvent);
+ this._events.set(IncomingHeader.ROOM_EVENT_CANCEL, RoomEventCancelEvent);
+ this._events.set(IncomingHeader.ROOM_EVENT, RoomEventEvent);
+ this._events.set(IncomingHeader.ROOM_INFO_UPDATED, RoomSettingsUpdatedEvent);
+ this._events.set(IncomingHeader.THUMBNAIL_UPDATE_RESULT, RoomThumbnailUpdateResultEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_EVENT_CATEGORIES, UserEventCatsEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_CATEGORIES, UserFlatCatsEvent);
+
+ this._events.set(IncomingHeader.NAVIGATOR_COLLAPSED, NavigatorCollapsedEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_LIFTED, NavigatorLiftedEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_METADATA, NavigatorMetadataEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_OPEN_ROOM_CREATOR, NavigatorOpenRoomCreatorEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_SEARCHES, NavigatorSearchesEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_SEARCH, NavigatorSearchEvent);
+ this._events.set(IncomingHeader.NAVIGATOR_SETTINGS, NavigatorSettingsEvent);
+
+ // NOTIFICATIONS
+ this._events.set(IncomingHeader.GENERIC_ALERT, HabboBroadcastMessageEvent);
+ this._events.set(IncomingHeader.MOTD_MESSAGES, MOTDNotificationEvent);
+ this._events.set(IncomingHeader.NOTIFICATION_LIST, NotificationDialogMessageEvent);
+ this._events.set(IncomingHeader.UNSEEN_ITEMS, UnseenItemsEvent);
+ this._events.set(IncomingHeader.ACHIEVEMENT_NOTIFICATION, AchievementNotificationMessageEvent);
+ this._events.set(IncomingHeader.INFO_FEED_ENABLE, InfoFeedEnableMessageEvent);
+ this._events.set(IncomingHeader.CLUB_GIFT_NOTIFICATION, ClubGiftNotificationEvent);
+ this._events.set(IncomingHeader.ACTIVITY_POINT_NOTIFICATION, ActivityPointNotificationMessageEvent);
+ this._events.set(IncomingHeader.BOT_ERROR, BotErrorEvent);
+ this._events.set(IncomingHeader.PET_LEVEL_NOTIFICATION, PetLevelNotificationEvent);
+ this._events.set(IncomingHeader.NOTIFICATION_OFFER_REWARD_DELIVERED, OfferRewardDeliveredMessageEvent);
+ this._events.set(IncomingHeader.NOTIFICATION_SIMPLE_ALERT, SimpleAlertMessageEvent);
+ this._events.set(IncomingHeader.NOTIFICATION_ELEMENT_POINTER, ElementPointerMessageEvent);
+
+ // PERK
+ this._events.set(IncomingHeader.USER_PERKS, PerkAllowancesMessageEvent);
+
+ // PETS
+ this._events.set(IncomingHeader.PET_TRAINING_PANEL, PetTrainingPanelMessageEvent);
+ this._events.set(IncomingHeader.PET_LEVEL_UPDATE, PetLevelUpdateMessageEvent);
+ this._events.set(IncomingHeader.PET_SCRATCH_FAILED, PetScratchFailedMessageEvent);
+ this._events.set(IncomingHeader.PET_OPEN_PACKAGE_REQUESTED, OpenPetPackageRequestedMessageEvent);
+ this._events.set(IncomingHeader.PET_OPEN_PACKAGE_RESULT, OpenPetPackageResultMessageEvent);
+ this._events.set(IncomingHeader.PET_BREEDING_RESULT, PetBreedingResultEvent);
+
+ // POLL
+ this._events.set(IncomingHeader.QUESTION, QuestionEvent);
+ this._events.set(IncomingHeader.POLL_CONTENTS, PollContentsEvent);
+ this._events.set(IncomingHeader.POLL_ERROR, PollErrorEvent);
+ this._events.set(IncomingHeader.POLL_OFFER, PollOfferEvent);
+ this._events.set(IncomingHeader.POLL_START_ROOM, StartRoomPollEvent);
+ this._events.set(IncomingHeader.QUESTION_ANSWERED, QuestionAnsweredEvent);
+ this._events.set(IncomingHeader.QUESTION_FINISHED, QuestionFinishedEvent);
+ this._events.set(IncomingHeader.POLL_ROOM_RESULT, RoomPollResultEvent);
+
+ // QUEST
+ this._events.set(IncomingHeader.COMMUNITY_GOAL_EARNED_PRIZES, CommunityGoalEarnedPrizesMessageEvent);
+ this._events.set(IncomingHeader.COMMUNITY_GOAL_PROGRESS, CommunityGoalProgressMessageEvent);
+ this._events.set(IncomingHeader.CONCURRENT_USERS_GOAL_PROGRESS, ConcurrentUsersGoalProgressMessageEvent);
+ this._events.set(IncomingHeader.QUEST_DAILY, QuestDailyMessageEvent);
+ this._events.set(IncomingHeader.QUEST_CANCELLED, QuestCancelledMessageEvent);
+ this._events.set(IncomingHeader.QUEST_COMPLETED, QuestCompletedMessageEvent);
+ this._events.set(IncomingHeader.COMMUNITY_GOAL_HALL_OF_FAME, CommunityGoalHallOfFameMessageEvent);
+ this._events.set(IncomingHeader.EPIC_POPUP, EpicPopupMessageEvent);
+ this._events.set(IncomingHeader.SEASONAL_QUESTS, SeasonalQuestsMessageEvent);
+ this._events.set(IncomingHeader.QUESTS, QuestsMessageEvent);
+ this._events.set(IncomingHeader.QUEST, QuestMessageEvent);
+
+ // ROOM
+ this._events.set(IncomingHeader.ROOM_ENTER_ERROR, RoomEnterErrorEvent);
+ this._events.set(IncomingHeader.ROOM_ENTER, RoomEnterEvent);
+ this._events.set(IncomingHeader.ROOM_FORWARD, RoomForwardEvent);
+ this._events.set(IncomingHeader.ROOM_DOORBELL_ACCEPTED, RoomDoorbellAcceptedEvent);
+ this._events.set(IncomingHeader.ROOM_RIGHTS_CLEAR, RoomRightsClearEvent);
+ this._events.set(IncomingHeader.ROOM_RIGHTS_OWNER, RoomRightsOwnerEvent);
+ this._events.set(IncomingHeader.ROOM_RIGHTS, RoomRightsEvent);
+ this._events.set(IncomingHeader.BOT_COMMAND_CONFIGURATION, BotCommandConfigurationEvent);
+ this._events.set(IncomingHeader.BOT_SKILL_LIST_UPDATE, BotSkillListUpdateEvent);
+ this._events.set(IncomingHeader.BOT_FORCE_OPEN_CONTEXT_MENU, BotForceOpenContextMenuEvent);
+ this._events.set(IncomingHeader.ROOM_SETTINGS_CHAT, RoomChatSettingsEvent);
+ this._events.set(IncomingHeader.ROOM_INFO_OWNER, RoomEntryInfoMessageEvent);
+ this._events.set(IncomingHeader.ROOM_SCORE, RoomScoreEvent);
+ this._events.set(IncomingHeader.ROOM_ROLLING, ObjectsRollingEvent);
+ this._events.set(IncomingHeader.FURNITURE_FLOOR_ADD, FurnitureFloorAddEvent);
+ this._events.set(IncomingHeader.FURNITURE_FLOOR, FurnitureFloorEvent);
+ this._events.set(IncomingHeader.FURNITURE_FLOOR_REMOVE, FurnitureFloorRemoveEvent);
+ this._events.set(IncomingHeader.FURNITURE_FLOOR_UPDATE, FurnitureFloorUpdateEvent);
+ this._events.set(IncomingHeader.ITEM_WALL_ADD, FurnitureWallAddEvent);
+ this._events.set(IncomingHeader.ITEM_WALL, FurnitureWallEvent);
+ this._events.set(IncomingHeader.ITEM_WALL_REMOVE, FurnitureWallRemoveEvent);
+ this._events.set(IncomingHeader.ITEM_WALL_UPDATE, FurnitureWallUpdateEvent);
+ this._events.set(IncomingHeader.FURNITURE_ALIASES, FurnitureAliasesEvent);
+ this._events.set(IncomingHeader.FURNITURE_DATA, FurnitureDataEvent);
+ this._events.set(IncomingHeader.FURNITURE_ITEMDATA, ItemDataUpdateMessageEvent);
+ this._events.set(IncomingHeader.ITEM_STACK_HELPER, FurnitureStackHeightEvent);
+ this._events.set(IncomingHeader.FURNITURE_STATE, OneWayDoorStatusMessageEvent);
+ this._events.set(IncomingHeader.ITEM_DIMMER_SETTINGS, RoomDimmerPresetsEvent);
+ this._events.set(IncomingHeader.FURNITURE_STATE_2, DiceValueMessageEvent);
+ this._events.set(IncomingHeader.LOVELOCK_FURNI_FINISHED, LoveLockFurniFinishedEvent);
+ this._events.set(IncomingHeader.LOVELOCK_FURNI_FRIEND_COMFIRMED, LoveLockFurniFriendConfirmedEvent);
+ this._events.set(IncomingHeader.LOVELOCK_FURNI_START, LoveLockFurniStartEvent);
+ this._events.set(IncomingHeader.OBJECTS_DATA_UPDATE, ObjectsDataUpdateEvent);
+ this._events.set(IncomingHeader.FURNITURE_GROUP_CONTEXT_MENU_INFO, GroupFurniContextMenuInfoMessageEvent);
+ this._events.set(IncomingHeader.FURNITURE_POSTIT_STICKY_POLE_OPEN, RequestSpamWallPostItMessageEvent);
+ this._events.set(IncomingHeader.ROOM_SPECTATOR, YouAreSpectatorMessageEvent);
+ this._events.set(IncomingHeader.CUSTOM_USER_NOTIFICATION, CustomUserNotificationMessageEvent);
+ this._events.set(IncomingHeader.ROOM_MESSAGE_NOTIFICATION, RoomMessageNotificationMessageEvent);
+ this._events.set(IncomingHeader.ROOM_POPULAR_TAGS_RESULT, PopularRoomTagsResultEvent);
+
+ // ROOM SETTINGS
+ this._events.set(IncomingHeader.ROOM_RIGHTS_LIST, FlatControllersEvent);
+ this._events.set(IncomingHeader.ROOM_RIGHTS_LIST_ADD, FlatControllerAddedEvent);
+ this._events.set(IncomingHeader.ROOM_RIGHTS_LIST_REMOVE, FlatControllerRemovedEvent);
+ this._events.set(IncomingHeader.ROOM_BAN_LIST, BannedUsersFromRoomEvent);
+
+ this._events.set(IncomingHeader.ROOM_SETTINGS_SAVE_ERROR, RoomSettingsSaveErrorEvent);
+ this._events.set(IncomingHeader.ROOM_SETTINGS, RoomSettingsDataEvent);
+ this._events.set(IncomingHeader.ROOM_SETTINGS_SAVE, RoomSettingsSavedEvent);
+ this._events.set(IncomingHeader.ROOM_SETTINGS_ERROR, RoomSettingsErrorEvent);
+ this._events.set(IncomingHeader.SHOW_ENFORCE_ROOM_CATEGORY, ShowEnforceRoomCategoryDialogEvent);
+ this._events.set(IncomingHeader.ROOM_BAN_REMOVE, UserUnbannedFromRoomEvent);
+
+ this._events.set(IncomingHeader.ROOM_MUTED, MuteAllInRoomEvent);
+ this._events.set(IncomingHeader.NO_SUCH_FLAT, NoSuchFlatEvent);
+
+ this._events.set(IncomingHeader.FAVORITE_GROUP_UDPATE, FavoriteMembershipUpdateMessageEvent);
+
+ // MAPPING
+ this._events.set(IncomingHeader.ROOM_MODEL_DOOR, RoomEntryTileMessageEvent);
+ this._events.set(IncomingHeader.ROOM_HEIGHT_MAP, RoomHeightMapEvent);
+ this._events.set(IncomingHeader.ROOM_HEIGHT_MAP_UPDATE, RoomHeightMapUpdateEvent);
+ this._events.set(IncomingHeader.ROOM_MODEL, FloorHeightMapEvent);
+ this._events.set(IncomingHeader.ROOM_MODEL_NAME, RoomReadyMessageEvent);
+ this._events.set(IncomingHeader.ROOM_PAINT, RoomPaintEvent);
+ this._events.set(IncomingHeader.ROOM_THICKNESS, RoomVisualizationSettingsEvent);
+ this._events.set(IncomingHeader.ROOM_GET_FILTER_WORDS, RoomFilterSettingsMessageEvent);
+ this._events.set(IncomingHeader.ROOM_MODEL_BLOCKED_TILES, RoomOccupiedTilesMessageEvent);
+ this._events.set(IncomingHeader.PET_FIGURE_UPDATE, PetFigureUpdateEvent);
+ this._events.set(IncomingHeader.PET_INFO, PetInfoEvent);
+ this._events.set(IncomingHeader.PET_STATUS, PetStatusUpdateEvent);
+ this._events.set(IncomingHeader.PET_EXPERIENCE, PetExperienceEvent);
+ this._events.set(IncomingHeader.PLAYING_GAME, YouArePlayingGameEvent);
+ this._events.set(IncomingHeader.UNIT_DANCE, RoomUnitDanceEvent);
+ this._events.set(IncomingHeader.UNIT_EFFECT, RoomUnitEffectEvent);
+ this._events.set(IncomingHeader.UNIT, RoomUnitEvent);
+ this._events.set(IncomingHeader.UNIT_EXPRESSION, RoomUnitExpressionEvent);
+ this._events.set(IncomingHeader.UNIT_HAND_ITEM, RoomUnitHandItemEvent);
+ this._events.set(IncomingHeader.UNIT_IDLE, RoomUnitIdleEvent);
+ this._events.set(IncomingHeader.UNIT_INFO, RoomUnitInfoEvent);
+ this._events.set(IncomingHeader.UNIT_NUMBER, RoomUnitNumberEvent);
+ this._events.set(IncomingHeader.UNIT_REMOVE, RoomUnitRemoveEvent);
+ this._events.set(IncomingHeader.UNIT_STATUS, RoomUnitStatusEvent);
+ this._events.set(IncomingHeader.HAND_ITEM_RECEIVED, RoomUnitHandItemReceivedEvent);
+ this._events.set(IncomingHeader.FLOOD_CONTROL, FloodControlEvent);
+ this._events.set(IncomingHeader.REMAINING_MUTE, RemainingMuteEvent);
+ this._events.set(IncomingHeader.UNIT_CHAT, RoomUnitChatEvent);
+ this._events.set(IncomingHeader.UNIT_CHAT_SHOUT, RoomUnitChatShoutEvent);
+ this._events.set(IncomingHeader.UNIT_CHAT_WHISPER, RoomUnitChatWhisperEvent);
+ this._events.set(IncomingHeader.UNIT_TYPING, RoomUnitTypingEvent);
+
+ // ROOM EVENTS
+ this._events.set(IncomingHeader.WIRED_ACTION, WiredFurniActionEvent);
+ this._events.set(IncomingHeader.WIRED_CONDITION, WiredFurniConditionEvent);
+ this._events.set(IncomingHeader.WIRED_TRIGGER, WiredFurniTriggerEvent);
+ this._events.set(IncomingHeader.WIRED_OPEN, WiredOpenEvent);
+ this._events.set(IncomingHeader.WIRED_REWARD, WiredRewardResultMessageEvent);
+ this._events.set(IncomingHeader.WIRED_SAVE, WiredSaveSuccessEvent);
+ this._events.set(IncomingHeader.WIRED_ERROR, WiredValidationErrorEvent);
+
+ // SECURITY
+ this._events.set(IncomingHeader.AUTHENTICATED, AuthenticatedEvent);
+
+ // SOUNDS
+ this._events.set(IncomingHeader.JUKEBOX_PLAYLIST_FULL, JukeboxPlayListFullMessageEvent);
+ this._events.set(IncomingHeader.JUKEBOX_SONG_DISKS, JukeboxSongDisksMessageEvent);
+ this._events.set(IncomingHeader.NOW_PLAYING, NowPlayingMessageEvent);
+ this._events.set(IncomingHeader.OFFICIAL_SONG_ID, OfficialSongIdMessageEvent);
+ this._events.set(IncomingHeader.PLAYLIST, PlayListMessageEvent);
+ this._events.set(IncomingHeader.PLAYLIST_SONG_ADDED, PlayListSongAddedMessageEvent);
+ this._events.set(IncomingHeader.TRAX_SONG_INFO, TraxSongInfoMessageEvent);
+ this._events.set(IncomingHeader.USER_SONG_DISKS_INVENTORY, UserSongDisksInventoryMessageEvent);
+
+ // TALENT
+ this._events.set(IncomingHeader.HELPER_TALENT_TRACK, TalentTrackMessageEvent);
+ this._events.set(IncomingHeader.TALENT_TRACK_LEVEL, TalentTrackLevelMessageEvent);
+ this._events.set(IncomingHeader.TALENT_TRACK_LEVEL_UP, TalentLevelUpEvent);
+
+ // USER
+ this._events.set(IncomingHeader.IN_CLIENT_LINK, InClientLinkEvent);
+ this._events.set(IncomingHeader.USER_IGNORED, IgnoredUsersEvent);
+ this._events.set(IncomingHeader.USER_IGNORED_RESULT, IgnoreResultEvent);
+ this._events.set(IncomingHeader.USER_RESPECT, RespectReceivedEvent);
+ this._events.set(IncomingHeader.USER_PERMISSIONS, UserPermissionsEvent);
+ this._events.set(IncomingHeader.USER_BADGES_CURRENT, UserCurrentBadgesEvent);
+ this._events.set(IncomingHeader.USER_INFO, UserInfoEvent);
+ this._events.set(IncomingHeader.UNIT_CHANGE_NAME, UserNameChangeMessageEvent);
+ this._events.set(IncomingHeader.USER_SETTINGS, UserSettingsEvent);
+ this._events.set(IncomingHeader.USER_PROFILE, UserProfileEvent);
+ this._events.set(IncomingHeader.MESSENGER_RELATIONSHIPS, RelationshipStatusInfoEvent);
+ this._events.set(IncomingHeader.GIFT_OPENED, PresentOpenedMessageEvent);
+ this._events.set(IncomingHeader.USER_CREDITS, UserCreditsEvent);
+ this._events.set(IncomingHeader.USER_CURRENCY, UserCurrencyEvent);
+ this._events.set(IncomingHeader.USER_SUBSCRIPTION, UserSubscriptionEvent);
+ this._events.set(IncomingHeader.USER_WARDROBE_PAGE, UserWardrobePageEvent);
+ this._events.set(IncomingHeader.USER_CLASSIFICATION, UserClassificationMessageEvent);
+ this._events.set(IncomingHeader.GET_USER_TAGS, UserTagsMessageEvent);
+ this._events.set(IncomingHeader.SCR_SEND_KICKBACK_INFO, ScrSendKickbackInfoMessageEvent);
+ this._events.set(IncomingHeader.PET_RESPECTED, PetRespectNoficationEvent);
+ this._events.set(IncomingHeader.PET_SUPPLEMENT, PetSupplementedNotificationEvent);
+ this._events.set(IncomingHeader.ACCOUNT_SAFETY_LOCK_STATUS_CHANGE, AccountSafetyLockStatusChangeMessageEvent);
+
+ this._events.set(IncomingHeader.GENERIC_ERROR, GenericErrorEvent);
+ this._events.set(IncomingHeader.GROUP_LIST, GuildMembershipsMessageEvent);
+ this._events.set(IncomingHeader.CATALOG_APPROVE_NAME_RESULT, ApproveNameMessageEvent);
+ this._events.set(IncomingHeader.CONNECTION_ERROR, ConnectionErrorEvent);
+
+ // GUILD
+ this._events.set(IncomingHeader.GUILD_EDIT_FAILED, GuildEditFailedMessageEvent);
+ this._events.set(IncomingHeader.GUILD_MEMBER_MGMT_FAILED, GuildMemberMgmtFailedMessageEvent);
+ this._events.set(IncomingHeader.EXTENDED_PROFILE_CHANGED, ExtendedProfileChangedMessageEvent);
+
+ // HANDSHAKE
+ this._events.set(IncomingHeader.NOOBNESS_LEVEL, NoobnessLevelMessageEvent);
+ this._events.set(IncomingHeader.DISCONNECT_REASON, DisconnectReasonEvent);
+ this._events.set(IncomingHeader.HANDSHAKE_INIT_DIFFIE, InitDiffieHandshakeEvent);
+ this._events.set(IncomingHeader.HANDSHAKE_COMPLETE_DIFFIE, CompleteDiffieHandshakeEvent);
+ this._events.set(IncomingHeader.HANDSHAKE_IDENTITY_ACCOUNT, IdentityAccountsEvent);
+
+ // NUX
+ this._events.set(IncomingHeader.NEW_USER_EXPERIENCE_GIFT_OFFER, NewUserExperienceGiftOfferMessageEvent);
+ this._events.set(IncomingHeader.NEW_USER_EXPERIENCE_NOT_COMPLETE, NewUserExperienceNotCompleteEvent);
+
+ // RESTORE CLIENT
+ this._events.set(IncomingHeader.RESTORE_CLIENT, RestoreClientMessageEvent);
+
+ // FIREWORK
+ this._events.set(IncomingHeader.FIREWORK_CHARGE_DATA, FireworkChargeDataEvent);
+
+ // PHONE
+ this._events.set(IncomingHeader.PHONE_COLLECTION_STATE, PhoneCollectionStateMessageEvent);
+ this._events.set(IncomingHeader.PHONE_TRY_NUMBER_RESULT, TryPhoneNumberResultMessageEvent);
+ this._events.set(IncomingHeader.PHONE_TRY_VERIFICATION_CODE_RESULT, TryVerificationCodeResultMessageEvent);
+
+ // WELCOME
+ this._events.set(IncomingHeader.WELCOME_GIFT_CHANGE_EMAIL_RESULT, WelcomeGiftChangeEmailResultEvent);
+ this._events.set(IncomingHeader.WELCOME_GIFT_STATUS, WelcomeGiftStatusEvent);
+ // RENTABLE SPACE
+ this._events.set(IncomingHeader.RENTABLE_SPACE_RENT_OK, RentableSpaceRentOkMessageEvent);
+ this._events.set(IncomingHeader.RENTABLE_SPACE_STATUS, RentableSpaceStatusMessageEvent);
+ this._events.set(IncomingHeader.RENTABLE_SPACE_RENT_FAILED, RentableSpaceRentFailedMessageEvent);
+ // RECYCLER
+ this._events.set(IncomingHeader.RECYCLER_STATUS, RecyclerStatusMessageEvent);
+ this._events.set(IncomingHeader.RECYCLER_FINISHED, RecyclerFinishedMessageEvent);
+ // EMAIL
+ this._events.set(IncomingHeader.EMAIL_STATUS, EmailStatusResultEvent);
+ this._events.set(IncomingHeader.CHANGE_EMAIL_RESULT, ChangeEmailResultEvent);
+
+ // RENTABLE FURNI
+ this._events.set(IncomingHeader.RENTABLE_FURNI_RENT_OR_BUYOUT_OFFER, FurniRentOrBuyoutOfferMessageEvent);
+ }
+
+ private registerComposers(): void
+ {
+ // AUTHENTICATION
+ this._composers.set(OutgoingHeader.AUTHENTICATION, AuthenticationMessageComposer);
+
+ // ADVERTISEMENT
+ this._composers.set(OutgoingHeader.INTERSTITIAL_SHOWN, InterstitialShownMessageComposer);
+ this._composers.set(OutgoingHeader.GET_INTERSTITIAL, GetInterstitialMessageComposer);
+
+ // AVATAR
+ this._composers.set(OutgoingHeader.GET_WARDROBE, GetWardrobeMessageComposer);
+ this._composers.set(OutgoingHeader.SAVE_WARDROBE_OUTFIT, SaveWardrobeOutfitMessageComposer);
+ this._composers.set(OutgoingHeader.CHANGE_USERNAME, ChangeUserNameMessageComposer);
+ this._composers.set(OutgoingHeader.CHECK_USERNAME, CheckUserNameMessageComposer);
+
+ // CAMERA
+ this._composers.set(OutgoingHeader.REQUEST_CAMERA_CONFIGURATION, RequestCameraConfigurationComposer);
+ this._composers.set(OutgoingHeader.RENDER_ROOM, RenderRoomMessageComposer);
+ this._composers.set(OutgoingHeader.RENDER_ROOM_THUMBNAIL, RenderRoomThumbnailMessageComposer);
+ this._composers.set(OutgoingHeader.PURCHASE_PHOTO, PurchasePhotoMessageComposer);
+ this._composers.set(OutgoingHeader.PUBLISH_PHOTO, PublishPhotoMessageComposer);
+ this._composers.set(OutgoingHeader.PHOTO_COMPETITION, PhotoCompetitionMessageComposer);
+
+ // CAMPAIGN
+ this._composers.set(OutgoingHeader.OPEN_CAMPAIGN_CALENDAR_DOOR, OpenCampaignCalendarDoorComposer);
+ this._composers.set(OutgoingHeader.OPEN_CAMPAIGN_CALENDAR_DOOR_STAFF, OpenCampaignCalendarDoorAsStaffComposer);
+
+ // CATALOG
+ this._composers.set(OutgoingHeader.BUILDERS_CLUB_PLACE_ROOM_ITEM, BuildersClubPlaceRoomItemMessageComposer);
+ this._composers.set(OutgoingHeader.BUILDERS_CLUB_PLACE_WALL_ITEM, BuildersClubPlaceWallItemMessageComposer);
+ this._composers.set(OutgoingHeader.BUILDERS_CLUB_QUERY_FURNI_COUNT, BuildersClubQueryFurniCountMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CATALOG_INDEX, GetCatalogIndexComposer);
+ this._composers.set(OutgoingHeader.GET_CATALOG_PAGE, GetCatalogPageComposer);
+ this._composers.set(OutgoingHeader.CATALOG_PURCHASE, PurchaseFromCatalogComposer);
+ this._composers.set(OutgoingHeader.CATALOG_PURCHASE_GIFT, PurchaseFromCatalogAsGiftComposer);
+ this._composers.set(OutgoingHeader.GET_PRODUCT_OFFER, GetProductOfferComposer);
+ this._composers.set(OutgoingHeader.GET_CLUB_OFFERS, GetClubOffersMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CLUB_GIFT_INFO, GetClubGiftInfo);
+ this._composers.set(OutgoingHeader.CATALOG_REDEEM_VOUCHER, RedeemVoucherMessageComposer);
+ this._composers.set(OutgoingHeader.GROUP_MEMBERSHIPS, CatalogGroupsComposer);
+ this._composers.set(OutgoingHeader.GET_GIFT_WRAPPING_CONFIG, GetGiftWrappingConfigurationComposer);
+ this._composers.set(OutgoingHeader.CATALOG_SELECT_VIP_GIFT, SelectClubGiftComposer);
+ this._composers.set(OutgoingHeader.CATALOG_REQUESET_PET_BREEDS, GetSellablePetPalettesComposer);
+ this._composers.set(OutgoingHeader.GET_BONUS_RARE_INFO, GetBonusRareInfoMessageComposer);
+ this._composers.set(OutgoingHeader.GET_BUNDLE_DISCOUNT_RULESET, GetBundleDiscountRulesetComposer);
+ this._composers.set(OutgoingHeader.GET_CATALOG_PAGE_EXPIRATION, GetCatalogPageExpirationComposer);
+ this._composers.set(OutgoingHeader.GET_CATALOG_PAGE_WITH_EARLIEST_EXP, GetCatalogPageWithEarliestExpiryComposer);
+ this._composers.set(OutgoingHeader.GET_DIRECT_CLUB_BUY_AVAILABLE, GetDirectClubBuyAvailableComposer);
+ this._composers.set(OutgoingHeader.GET_HABBO_BASIC_MEMBERSHIP_EXTEND_OFFER, GetHabboBasicMembershipExtendOfferComposer);
+ this._composers.set(OutgoingHeader.GET_HABBO_CLUB_EXTEND_OFFER, GetHabboClubExtendOfferMessageComposer);
+ this._composers.set(OutgoingHeader.GET_IS_OFFER_GIFTABLE, GetIsOfferGiftableComposer);
+ this._composers.set(OutgoingHeader.GET_LIMITED_OFFER_APPEARING_NEXT, GetLimitedOfferAppearingNextComposer);
+ this._composers.set(OutgoingHeader.GET_NEXT_TARGETED_OFFER, GetNextTargetedOfferComposer);
+ this._composers.set(OutgoingHeader.GET_ROOM_AD_PURCHASE_INFO, GetRoomAdPurchaseInfoComposer);
+ this._composers.set(OutgoingHeader.GET_SEASONAL_CALENDAR_DAILY_OFFER, GetSeasonalCalendarDailyOfferComposer);
+ this._composers.set(OutgoingHeader.GET_TARGETED_OFFER, GetTargetedOfferComposer);
+ this._composers.set(OutgoingHeader.MARK_CATALOG_NEW_ADDITIONS_PAGE_OPENED, MarkCatalogNewAdditionsPageOpenedComposer);
+ this._composers.set(OutgoingHeader.PURCHASE_BASIC_MEMBERSHIP_EXTENSION, PurchaseBasicMembershipExtensionComposer);
+ this._composers.set(OutgoingHeader.PURCHASE_ROOM_AD, PurchaseRoomAdMessageComposer);
+ this._composers.set(OutgoingHeader.PURCHASE_TARGETED_OFFER, PurchaseTargetedOfferComposer);
+ this._composers.set(OutgoingHeader.PURCHASE_VIP_MEMBERSHIP_EXTENSION, PurchaseVipMembershipExtensionComposer);
+ this._composers.set(OutgoingHeader.ROOM_AD_PURCHASE_INITIATED, RoomAdPurchaseInitiatedComposer);
+ this._composers.set(OutgoingHeader.SET_TARGETTED_OFFER_STATE, SetTargetedOfferStateComposer);
+ this._composers.set(OutgoingHeader.SHOP_TARGETED_OFFER_VIEWED, ShopTargetedOfferViewedComposer);
+
+ // COMPETITION
+ this._composers.set(OutgoingHeader.FORWARD_TO_A_COMPETITION_ROOM, ForwardToACompetitionRoomMessageComposer);
+ this._composers.set(OutgoingHeader.FORWARD_TO_A_SUBMITTABLE_ROOM, ForwardToASubmittableRoomMessageComposer);
+ this._composers.set(OutgoingHeader.FORWARD_TO_RANDOM_COMPETITION_ROOM, ForwardToRandomCompetitionRoomMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CURRENT_TIMING_CODE, GetCurrentTimingCodeMessageComposer);
+ this._composers.set(OutgoingHeader.GET_IS_USER_PART_OF_COMPETITION, GetIsUserPartOfCompetitionMessageComposer);
+ this._composers.set(OutgoingHeader.GET_SECONDS_UNTIL, GetSecondsUntilMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_COMPETITION_INIT, RoomCompetitionInitMessageComposer);
+ this._composers.set(OutgoingHeader.SUBMIT_ROOM_TO_COMPETITION, SubmitRoomToCompetitionMessageComposer);
+ this._composers.set(OutgoingHeader.VOTE_FOR_ROOM, VoteForRoomMessageComposer);
+
+ // CRAFTING
+ this._composers.set(OutgoingHeader.CRAFT, CraftComposer);
+ this._composers.set(OutgoingHeader.CRAFT_SECRET, CraftSecretComposer);
+ this._composers.set(OutgoingHeader.GET_CRAFTABLE_PRODUCTS, GetCraftingRecipeComposer);
+ this._composers.set(OutgoingHeader.GET_CRAFTING_RECIPE, GetCraftableProductsComposer);
+ this._composers.set(OutgoingHeader.GET_CRAFTING_RECIPES_AVAILABLE, GetCraftingRecipesAvailableComposer);
+
+ // FRIENDFURNI
+ this._composers.set(OutgoingHeader.FRIEND_FURNI_CONFIRM_LOCK, FriendFurniConfirmLockMessageComposer);
+
+ // FRIENDLIST
+ this._composers.set(OutgoingHeader.ACCEPT_FRIEND, AcceptFriendMessageComposer);
+ this._composers.set(OutgoingHeader.DECLINE_FRIEND, DeclineFriendMessageComposer);
+ this._composers.set(OutgoingHeader.FIND_NEW_FRIENDS, FindNewFriendsMessageComposer);
+ this._composers.set(OutgoingHeader.FOLLOW_FRIEND, FollowFriendMessageComposer);
+ this._composers.set(OutgoingHeader.FRIEND_LIST_UPDATE, FriendListUpdateComposer);
+ this._composers.set(OutgoingHeader.GET_FRIEND_REQUESTS, GetFriendRequestsComposer);
+ this._composers.set(OutgoingHeader.HABBO_SEARCH, HabboSearchComposer);
+ this._composers.set(OutgoingHeader.MESSENGER_INIT, MessengerInitComposer);
+ this._composers.set(OutgoingHeader.REMOVE_FRIEND, RemoveFriendComposer);
+ this._composers.set(OutgoingHeader.REQUEST_FRIEND, RequestFriendComposer);
+ this._composers.set(OutgoingHeader.MESSENGER_CHAT, SendMessageComposer);
+ this._composers.set(OutgoingHeader.SEND_ROOM_INVITE, SendRoomInviteComposer);
+ this._composers.set(OutgoingHeader.SET_RELATIONSHIP_STATUS, SetRelationshipStatusComposer);
+ this._composers.set(OutgoingHeader.VISIT_USER, VisitUserComposer);
+
+ // GAME
+ this._composers.set(OutgoingHeader.ACHIEVEMENT_RESOLUTION_OPEN, GetResolutionAchievementsMessageComposer);
+ this._composers.set(OutgoingHeader.ACCEPTGAMEINVITE, AcceptGameInviteMessageComposer);
+ this._composers.set(OutgoingHeader.GAMEUNLOADEDMESSAGE, GameUnloadedMessageComposer);
+ this._composers.set(OutgoingHeader.GETGAMEACHIEVEMENTSMESSAGE, GetGameAchievementsMessageComposer);
+ this._composers.set(OutgoingHeader.GAMES_LIST, GetGameListMessageComposer);
+ this._composers.set(OutgoingHeader.GETGAMESTATUSMESSAGE, GetGameStatusMessageComposer);
+ this._composers.set(OutgoingHeader.GETUSERGAMEACHIEVEMENTSMESSAGE, GetUserGameAchievementsMessageComposer);
+ this._composers.set(OutgoingHeader.JOINQUEUEMESSAGE, JoinQueueMessageComposer);
+ this._composers.set(OutgoingHeader.LEAVEQUEUEMESSAGE, LeaveQueueMessageComposer);
+ this._composers.set(OutgoingHeader.RESETRESOLUTIONACHIEVEMENTMESSAGE, ResetResolutionAchievementMessageComposer);
+ this._composers.set(OutgoingHeader.GAMES_INIT, GetWeeklyGameRewardComposer);
+ this._composers.set(OutgoingHeader.GETWEEKLYGAMEREWARDWINNERS, GetWeeklyGameRewardWinnersComposer);
+ this._composers.set(OutgoingHeader.GAME2GETACCOUNTGAMESTATUSMESSAGE, Game2GetAccountGameStatusMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2CHECKGAMEDIRECTORYSTATUSMESSAGE, Game2CheckGameDirectoryStatusMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2EXITGAMEMESSAGE, Game2ExitGameMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2GAMECHATMESSAGE, Game2GameChatMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2LOADSTAGEREADYMESSAGE, Game2LoadStageReadyMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2PLAYAGAINMESSAGE, Game2PlayAgainMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2REQUESTFULLSTATUSUPDATEMESSAGE, Game2RequestFullStatusUpdateMessageComposer);
+ this._composers.set(OutgoingHeader.GAME2GETWEEKLYFRIENDSLEADERBOARD, Game2GetWeeklyFriendsLeaderboardComposer);
+ this._composers.set(OutgoingHeader.GAME2GETWEEKLYLEADERBOARD, Game2GetWeeklyLeaderboardComposer);
+
+ // GIFTS
+ this._composers.set(OutgoingHeader.GET_GIFT, GetGiftMessageComposer);
+ this._composers.set(OutgoingHeader.RESET_PHONE_NUMBER_STATE, ResetPhoneNumberStateMessageComposer);
+ this._composers.set(OutgoingHeader.SET_PHONE_NUMBER_VERIFICATION_STATUS, SetPhoneNumberVerificationStatusMessageComposer);
+ this._composers.set(OutgoingHeader.TRY_PHONE_NUMBER, TryPhoneNumberMessageComposer);
+ this._composers.set(OutgoingHeader.VERIFY_CODE, VerifyCodeMessageComposer);
+
+ // GROUPFORUMS
+ this._composers.set(OutgoingHeader.GET_FORUM_STATS, GetForumStatsMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FORUMS_LIST, GetForumsListMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FORUM_MESSAGES, GetMessagesMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FORUM_THREAD, GetThreadMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FORUM_THREADS, GetThreadsMessageComposer);
+ this._composers.set(OutgoingHeader.GET_UNREAD_FORUMS_COUNT, GetUnreadForumsCountMessageComposer);
+ this._composers.set(OutgoingHeader.FORUM_MODERATE_MESSAGE, ModerateMessageMessageComposer);
+ this._composers.set(OutgoingHeader.FORUM_MODERATE_THREAD, ModerateThreadMessageComposer);
+ this._composers.set(OutgoingHeader.FORUM_POST_MESSAGE, PostMessageMessageComposer);
+ this._composers.set(OutgoingHeader.UPDATE_FORUM_READ_MARKER, UpdateForumReadMarkerMessageComposer);
+ this._composers.set(OutgoingHeader.UPDATE_FORUM_SETTINGS, UpdateForumSettingsMessageComposer);
+ this._composers.set(OutgoingHeader.FORUM_UPDATE_THREAD, UpdateThreadMessageComposer);
+
+ // HANDSHAKE
+ this._composers.set(OutgoingHeader.CLIENT_PONG, PongMessageComposer);
+ this._composers.set(OutgoingHeader.RELEASE_VERSION, ClientHelloMessageComposer);
+ this._composers.set(OutgoingHeader.SECURITY_TICKET, SSOTicketMessageComposer);
+ this._composers.set(OutgoingHeader.USER_INFO, InfoRetrieveMessageComposer);
+ this._composers.set(OutgoingHeader.DISCONNECT, DisconnectMessageComposer);
+ this._composers.set(OutgoingHeader.SECURITY_MACHINE, UniqueIDMessageComposer);
+ this._composers.set(OutgoingHeader.CLIENT_VARIABLES, VersionCheckMessageComposer);
+ this._composers.set(OutgoingHeader.HANDSHAKE_INIT_DIFFIE, InitDiffieHandshakeMessageComposer);
+ this._composers.set(OutgoingHeader.HANDSHAKE_COMPLETE_DIFFIE, CompleteDiffieHandshakeMessageComposer);
+
+ // HELP
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_FORUM_MESSAGE, CallForHelpFromForumMessageMessageComposer);
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_FORUM_THREAD, CallForHelpFromForumThreadMessageComposer);
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_IM, CallForHelpFromIMMessageComposer);
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_PHOTO, CallForHelpFromPhotoMessageComposer);
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP_FROM_SELFIE, CallForHelpFromSelfieMessageComposer);
+ this._composers.set(OutgoingHeader.CALL_FOR_HELP, CallForHelpMessageComposer);
+ this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_DECIDES, ChatReviewGuideDecidesOnOfferMessageComposer);
+ this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_DETACHED, ChatReviewGuideDetachedMessageComposer);
+ this._composers.set(OutgoingHeader.CHAT_REVIEW_GUIDE_VOTE, ChatReviewGuideVoteMessageComposer);
+ this._composers.set(OutgoingHeader.CHAT_REVIEW_SESSION_CREATE, ChatReviewSessionCreateMessageComposer);
+ this._composers.set(OutgoingHeader.DELETE_PENDING_CALLS_FOR_HELP, DeletePendingCallsForHelpMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CFH_STATUS, GetCfhStatusMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FAQ_CATEGORY, GetFaqCategoryMessageComposer);
+ this._composers.set(OutgoingHeader.GET_FAQ_TEXT, GetFaqTextMessageComposer);
+ this._composers.set(OutgoingHeader.GET_GUIDE_REPORTING_STATUS, GetGuideReportingStatusMessageComposer);
+ this._composers.set(OutgoingHeader.GET_PENDING_CALLS_FOR_HELP, GetPendingCallsForHelpMessageComposer);
+ this._composers.set(OutgoingHeader.GET_QUIZ_QUESTIONS, GetQuizQuestionsComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_CREATE, GuideSessionCreateMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_FEEDBACK, GuideSessionFeedbackMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_GET_REQUESTER_ROOM, GuideSessionGetRequesterRoomMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_GUIDE_DECIDES, GuideSessionGuideDecidesMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_INVITE_REQUESTER, GuideSessionInviteRequesterMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_IS_TYPING, GuideSessionIsTypingMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_MESSAGE, GuideSessionMessageMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_ON_DUTY_UPDATE, GuideSessionOnDutyUpdateMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_REPORT, GuideSessionReportMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_REQUESTER_CANCELS, GuideSessionRequesterCancelsMessageComposer);
+ this._composers.set(OutgoingHeader.GUIDE_SESSION_RESOLVED, GuideSessionResolvedMessageComposer);
+ this._composers.set(OutgoingHeader.POST_QUIZ_ANSWERS, PostQuizAnswersComposer);
+ this._composers.set(OutgoingHeader.SEARCH_FAQS, SearchFaqsMessageComposer);
+
+ // DESKTOP
+ this._composers.set(OutgoingHeader.DESKTOP_VIEW, DesktopViewComposer);
+
+ // GROUP
+ this._composers.set(OutgoingHeader.GROUP_INFO, GroupInformationComposer);
+ this._composers.set(OutgoingHeader.GROUP_REQUEST, GroupJoinComposer);
+ this._composers.set(OutgoingHeader.GROUP_MEMBER_REMOVE_CONFIRM, GroupConfirmRemoveMemberComposer);
+ this._composers.set(OutgoingHeader.GROUP_MEMBER_REMOVE, GroupRemoveMemberComposer);
+ this._composers.set(OutgoingHeader.GROUP_MEMBERS, GroupMembersComposer);
+ this._composers.set(OutgoingHeader.GROUP_ADMIN_ADD, GroupAdminGiveComposer);
+ this._composers.set(OutgoingHeader.GROUP_ADMIN_REMOVE, GroupAdminTakeComposer);
+ this._composers.set(OutgoingHeader.GROUP_REQUEST_ACCEPT, GroupMembershipAcceptComposer);
+ this._composers.set(OutgoingHeader.GROUP_REQUEST_DECLINE, GroupMembershipDeclineComposer);
+ this._composers.set(OutgoingHeader.GROUP_DELETE, GroupDeleteComposer);
+ this._composers.set(OutgoingHeader.GROUP_CREATE_OPTIONS, GroupBuyDataComposer);
+ this._composers.set(OutgoingHeader.GROUP_PARTS, GroupBadgePartsComposer);
+ this._composers.set(OutgoingHeader.GROUP_BUY, GroupBuyComposer);
+ this._composers.set(OutgoingHeader.GROUP_SETTINGS, GroupSettingsComposer);
+ this._composers.set(OutgoingHeader.GROUP_SAVE_BADGE, GroupSaveBadgeComposer);
+ this._composers.set(OutgoingHeader.GROUP_SAVE_COLORS, GroupSaveColorsComposer);
+ this._composers.set(OutgoingHeader.GROUP_SAVE_INFORMATION, GroupSaveInformationComposer);
+ this._composers.set(OutgoingHeader.GROUP_SAVE_PREFERENCES, GroupSavePreferencesComposer);
+ this._composers.set(OutgoingHeader.GROUP_FAVORITE, GroupFavoriteComposer);
+ this._composers.set(OutgoingHeader.GROUP_UNFAVORITE, GroupUnfavoriteComposer);
+ this._composers.set(OutgoingHeader.GROUP_BADGES, GetHabboGroupBadgesMessageComposer);
+ this._composers.set(OutgoingHeader.APPROVE_ALL_MEMBERSHIP_REQUESTS, ApproveAllMembershipRequestsMessageComposer);
+ this._composers.set(OutgoingHeader.GROUP_UNBLOCK_MEMBER, UnblockGroupMemberMessageComposer);
+
+ // NAVIGATOR
+ this._composers.set(OutgoingHeader.ROOM_FAVORITE, AddFavouriteRoomMessageComposer);
+ this._composers.set(OutgoingHeader.CAN_CREATE_ROOM, CanCreateRoomMessageComposer);
+ this._composers.set(OutgoingHeader.CANCEL_ROOM_EVENT, CancelEventMessageComposer);
+ this._composers.set(OutgoingHeader.CONVERT_GLOBAL_ROOM_ID, ConvertGlobalRoomIdMessageComposer);
+ this._composers.set(OutgoingHeader.COMPETITION_ROOM_SEARCH, CompetitionRoomsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_CREATE, CreateFlatMessageComposer);
+ this._composers.set(OutgoingHeader.GET_USER_FLAT_CATS, GetUserFlatCatsMessageComposer);
+ this._composers.set(OutgoingHeader.GET_USER_EVENT_CATS, GetUserEventCatsMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_FAVORITE_REMOVE, DeleteFavouriteRoomMessageComposer);
+ this._composers.set(OutgoingHeader.EDIT_ROOM_EVENT, EditEventMessageComposer);
+ this._composers.set(OutgoingHeader.FORWARD_TO_RANDOM_PROMOTED_ROOM, ForwardToARandomPromotedRoomMessageComposer);
+ this._composers.set(OutgoingHeader.FORWARD_TO_SOME_ROOM, ForwardToSomeRoomMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CATEGORIES_WITH_USER_COUNT, GetCategoriesWithUserCountMessageComposer);
+ this._composers.set(OutgoingHeader.GET_GUEST_ROOM, GetGuestRoomMessageComposer);
+ this._composers.set(OutgoingHeader.GET_OFFICIAL_ROOMS, GetOfficialRoomsMessageComposer);
+ this._composers.set(OutgoingHeader.GET_POPULAR_ROOM_TAGS, GetPopularRoomTagsMessageComposer);
+ this._composers.set(OutgoingHeader.GUILD_BASE_SEARCH, GuildBaseSearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_FAVOURITE_ROOMS_SEARCH, MyFavouriteRoomsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_FREQUENT_ROOM_HISTORY_SEARCH, MyFrequentRoomHistorySearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_FRIENDS_ROOM_SEARCH, MyFriendsRoomsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_GUILD_BASES_SEARCH, MyGuildBasesSearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_RECOMMENDED_ROOMS, MyRecommendedRoomsMessageComposer);
+ this._composers.set(OutgoingHeader.MY_ROOM_HISTORY_SEARCH, MyRoomHistorySearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_ROOM_RIGHTS_SEARCH, MyRoomRightsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.MY_ROOMS_SEARCH, MyRoomsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.POPULAR_ROOMS_SEARCH, PopularRoomsSearchMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_LIKE, RateFlatMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE_OWN, RemoveOwnRoomRightsRoomMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_AD_EVENT_TAB_CLICKED, RoomAdEventTabAdClickedComposer);
+ this._composers.set(OutgoingHeader.ROOM_AD_EVENT_TAB_VIEWED, RoomAdEventTabViewedComposer);
+ this._composers.set(OutgoingHeader.ROOM_AD_SEARCH, RoomAdSearchMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_TEXT_SEARCH, RoomTextSearchMessageComposer);
+ this._composers.set(OutgoingHeader.ROOMS_WHERE_MY_FRIENDS_ARE, RoomsWhereMyFriendsAreSearchMessageComposer);
+ this._composers.set(OutgoingHeader.ROOMS_WITH_HIGHEST_SCORE_SEARCH, RoomsWithHighestScoreSearchMessageComposer);
+ this._composers.set(OutgoingHeader.SET_ROOM_SESSION_TAGS, SetRoomSessionTagsMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_STAFF_PICK, ToggleStaffPickMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_FILTER_WORDS, GetCustomRoomFilterMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_FILTER_WORDS_MODIFY, UpdateRoomFilterMessageComposer);
+ this._composers.set(OutgoingHeader.USER_HOME_ROOM, UpdateHomeRoomMessageComposer);
+ this._composers.set(OutgoingHeader.UPDATE_ROOM_THUMBNAIL, UpdateRoomThumbnailMessageComposer);
+ // NEW NAVIGATOR
+ this._composers.set(OutgoingHeader.NAVIGATOR_INIT, NavigatorInitComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_CLOSE, NavigatorSearchCloseComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH, NavigatorSearchComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_OPEN, NavigatorSearchOpenComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_SEARCH_SAVE, NavigatorSearchSaveComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_SETTINGS_SAVE, NavigatorSettingsSaveComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_CATEGORY_LIST_MODE, NavigatorCategoryListModeComposer);
+ this._composers.set(OutgoingHeader.NAVIGATOR_DELETE_SAVED_SEARCH, NavigatorDeleteSavedSearchComposer);
+
+ // POLL
+ this._composers.set(OutgoingHeader.POLL_ANSWER, PollAnswerComposer);
+ this._composers.set(OutgoingHeader.POLL_REJECT, PollRejectComposer);
+ this._composers.set(OutgoingHeader.POLL_START, PollStartComposer);
+ this._composers.set(OutgoingHeader.POLL_VOTE_COUNTER, VotePollCounterMessageComposer);
+
+ // INVENTORY
+
+ // EFFECTS
+ this._composers.set(OutgoingHeader.USER_EFFECT_ACTIVATE, AvatarEffectActivatedComposer);
+ this._composers.set(OutgoingHeader.USER_EFFECT_ENABLE, AvatarEffectSelectedComposer);
+
+ // BADGES
+ this._composers.set(OutgoingHeader.USER_BADGES, RequestBadgesComposer);
+ this._composers.set(OutgoingHeader.USER_BADGES_CURRENT_UPDATE, SetActivatedBadgesComposer);
+ this._composers.set(OutgoingHeader.GET_BADGE_POINTS_LIMITS, GetBadgePointLimitsComposer);
+ this._composers.set(OutgoingHeader.REQUESTABADGE, RequestABadgeComposer);
+ this._composers.set(OutgoingHeader.GETISBADGEREQUESTFULFILLED, GetIsBadgeRequestFulfilledComposer);
+
+ // BOTS
+ this._composers.set(OutgoingHeader.USER_BOTS, GetBotInventoryComposer);
+
+ // FURNI
+ this._composers.set(OutgoingHeader.USER_FURNITURE, FurnitureListComposer);
+ this._composers.set(OutgoingHeader.REQUESTFURNIINVENTORYWHENNOTINROOM, RequestFurniInventoryWhenNotInRoomComposer);
+
+ // PETS
+ this._composers.set(OutgoingHeader.USER_PETS, RequestPetsComposer);
+
+ // TRADING
+ this._composers.set(OutgoingHeader.TRADE_ACCEPT, TradingAcceptComposer);
+ this._composers.set(OutgoingHeader.TRADE_CANCEL, TradingCancelComposer);
+ this._composers.set(OutgoingHeader.TRADE_CLOSE, TradingCloseComposer);
+ this._composers.set(OutgoingHeader.TRADE_CONFIRM, TradingConfirmationComposer);
+ this._composers.set(OutgoingHeader.TRADE_ITEM, TradingListAddItemComposer);
+ this._composers.set(OutgoingHeader.TRADE_ITEMS, TradingListAddItemsComposer);
+ this._composers.set(OutgoingHeader.TRADE_ITEM_REMOVE, TradingListItemRemoveComposer);
+ this._composers.set(OutgoingHeader.TRADE, TradingOpenComposer);
+ this._composers.set(OutgoingHeader.TRADE_UNACCEPT, TradingUnacceptComposer);
+
+ // UNSEEN
+ this._composers.set(OutgoingHeader.UNSEEN_RESET_CATEGORY, UnseenResetCategoryComposer);
+ this._composers.set(OutgoingHeader.UNSEEN_RESET_ITEMS, UnseenResetItemsComposer);
+
+ // ACHIVEMENTS
+ this._composers.set(OutgoingHeader.ACHIEVEMENT_LIST, RequestAchievementsMessageComposer);
+
+ // PET
+ this._composers.set(OutgoingHeader.PET_MOUNT, PetMountComposer);
+ this._composers.set(OutgoingHeader.PET_RESPECT, PetRespectComposer);
+ this._composers.set(OutgoingHeader.PET_SUPPLEMENT, PetSupplementComposer);
+ this._composers.set(OutgoingHeader.REMOVE_PET_SADDLE, RemovePetSaddleComposer);
+ this._composers.set(OutgoingHeader.PET_INFO, RequestPetInfoComposer);
+ this._composers.set(OutgoingHeader.TOGGLE_PET_BREEDING, TogglePetBreedingComposer);
+ this._composers.set(OutgoingHeader.TOGGLE_PET_RIDING, TogglePetRidingComposer);
+ this._composers.set(OutgoingHeader.USE_PET_PRODUCT, UsePetProductComposer);
+ this._composers.set(OutgoingHeader.GET_PET_TRAINING_PANEL, GetPetCommandsComposer);
+ this._composers.set(OutgoingHeader.PET_OPEN_PACKAGE, OpenPetPackageMessageComposer);
+ this._composers.set(OutgoingHeader.PET_SELECTED, PetSelectedMessageComposer);
+ this._composers.set(OutgoingHeader.PETS_BREED, BreedPetsMessageComposer);
+ this._composers.set(OutgoingHeader.PET_CANCEL_BREEDING, CancelPetBreedingComposer);
+ this._composers.set(OutgoingHeader.PET_CONFIRM_BREEDING, ConfirmPetBreedingComposer);
+
+ // ROOM
+
+ // ACCESS
+ this._composers.set(OutgoingHeader.ROOM_ENTER, RoomEnterComposer);
+ this._composers.set(OutgoingHeader.ROOM_DOORBELL, RoomDoorbellAccessComposer);
+ this._composers.set(OutgoingHeader.GO_TO_FLAT, GoToFlatMessageComposer);
+ this._composers.set(OutgoingHeader.CHANGE_QUEUE, ChangeQueueMessageComposer);
+
+ // ACTION
+ this._composers.set(OutgoingHeader.ROOM_AMBASSADOR_ALERT, RoomAmbassadorAlertComposer);
+ this._composers.set(OutgoingHeader.ROOM_BAN_GIVE, RoomBanUserComposer);
+ this._composers.set(OutgoingHeader.ROOM_BAN_REMOVE, RoomUnbanUserComposer);
+ this._composers.set(OutgoingHeader.ROOM_RIGHTS_GIVE, RoomGiveRightsComposer);
+ this._composers.set(OutgoingHeader.ROOM_KICK, RoomKickUserComposer);
+ this._composers.set(OutgoingHeader.ROOM_MUTE_USER, RoomMuteUserComposer);
+ this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE, RoomTakeRightsComposer);
+ this._composers.set(OutgoingHeader.ROOM_RIGHTS_REMOVE_ALL, RemoveAllRightsMessageComposer);
+
+ this._composers.set(OutgoingHeader.ROOM_DELETE, RoomDeleteComposer);
+
+ // DATA
+ this._composers.set(OutgoingHeader.ROOM_SETTINGS, RoomSettingsComposer);
+ this._composers.set(OutgoingHeader.ROOM_SETTINGS_SAVE, SaveRoomSettingsComposer);
+ this._composers.set(OutgoingHeader.ROOM_RIGHTS_LIST, RoomUsersWithRightsComposer);
+ this._composers.set(OutgoingHeader.ROOM_BAN_LIST, RoomBannedUsersComposer);
+ this._composers.set(OutgoingHeader.ROOM_SETTINGS_UPDATE_ROOM_CATEGORY_AND_TRADE, UpdateRoomCategoryAndTradeSettingsComposer);
+
+ // BOTS
+ this._composers.set(OutgoingHeader.BOT_CONFIGURATION, RequestBotCommandConfigurationComposer);
+
+ // ENGINE
+ this._composers.set(OutgoingHeader.GET_ITEM_DATA, GetItemDataComposer);
+ this._composers.set(OutgoingHeader.REMOVE_WALL_ITEM, RemoveWallItemComposer);
+ this._composers.set(OutgoingHeader.BOT_PLACE, BotPlaceComposer);
+ this._composers.set(OutgoingHeader.BOT_PICKUP, BotRemoveComposer);
+ this._composers.set(OutgoingHeader.BOT_SKILL_SAVE, BotSkillSaveComposer);
+ this._composers.set(OutgoingHeader.PET_PLACE, PetPlaceComposer);
+ this._composers.set(OutgoingHeader.PET_MOVE, PetMoveComposer);
+ this._composers.set(OutgoingHeader.PET_PICKUP, PetRemoveComposer);
+ this._composers.set(OutgoingHeader.SET_ITEM_DATA, SetItemDataMessageComposer);
+ this._composers.set(OutgoingHeader.SET_OBJECT_DATA, SetObjectDataMessageComposer);
+ this._composers.set(OutgoingHeader.COMPOST_PLANT, CompostPlantMessageComposer);
+ this._composers.set(OutgoingHeader.HARVEST_PET, HarvestPetMessageComposer);
+ this._composers.set(OutgoingHeader.SET_CLOTHING_CHANGE_DATA, SetClothingChangeDataMessageComposer);
+
+ // FURNITURE
+ this._composers.set(OutgoingHeader.FURNITURE_ALIASES, FurnitureAliasesComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_GROUP_INFO, FurnitureGroupInfoComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_PICKUP, FurniturePickupComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_PLACE, FurniturePlaceComposer);
+ this._composers.set(OutgoingHeader.ITEM_PAINT, FurniturePlacePaintComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_POSTIT_PLACE, FurniturePostItPlaceComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_POSTIT_SAVE_STICKY_POLE, AddSpamWallPostItMessageComposer);
+ this._composers.set(OutgoingHeader.CONTROL_YOUTUBE_DISPLAY_PLAYBACK, ControlYoutubeDisplayPlaybackMessageComposer);
+ this._composers.set(OutgoingHeader.GET_YOUTUBE_DISPLAY_STATUS, GetYoutubeDisplayStatusMessageComposer);
+ this._composers.set(OutgoingHeader.SET_YOUTUBE_DISPLAY_PLAYLIST, SetYoutubeDisplayPlaylistMessageComposer);
+
+ // FLOOR
+ this._composers.set(OutgoingHeader.FURNITURE_FLOOR_UPDATE, FurnitureFloorUpdateComposer);
+
+ // WALL
+ this._composers.set(OutgoingHeader.FURNITURE_WALL_UPDATE, FurnitureWallUpdateComposer);
+
+ // Dimmers
+ this._composers.set(OutgoingHeader.ITEM_DIMMER_SETTINGS, MoodlightSettingsComposer);
+ this._composers.set(OutgoingHeader.ITEM_DIMMER_SAVE, MoodlightSettingsSaveComposer);
+ this._composers.set(OutgoingHeader.ITEM_DIMMER_TOGGLE, MoodlightTogggleStateComposer);
+
+ // Toners
+ this._composers.set(OutgoingHeader.ROOM_TONER_APPLY, ApplyTonerComposer);
+
+ // LOGIC
+ this._composers.set(OutgoingHeader.ITEM_COLOR_WHEEL_CLICK, FurnitureColorWheelComposer);
+ this._composers.set(OutgoingHeader.ITEM_DICE_CLICK, FurnitureDiceActivateComposer);
+ this._composers.set(OutgoingHeader.ITEM_DICE_CLOSE, FurnitureDiceDeactivateComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_MULTISTATE, FurnitureMultiStateComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_RANDOMSTATE, FurnitureRandomStateComposer);
+ this._composers.set(OutgoingHeader.ITEM_STACK_HELPER, FurnitureStackHeightComposer);
+ this._composers.set(OutgoingHeader.FURNITURE_WALL_MULTISTATE, FurnitureWallMultiStateComposer);
+ this._composers.set(OutgoingHeader.ONE_WAY_DOOR_CLICK, FurnitureOneWayDoorComposer);
+ this._composers.set(OutgoingHeader.ITEM_EXCHANGE_REDEEM, FurnitureExchangeComposer);
+ this._composers.set(OutgoingHeader.ITEM_CLOTHING_REDEEM, RedeemItemClothingComposer);
+
+ // LAYOUT
+ this._composers.set(OutgoingHeader.ROOM_MODEL, GetRoomEntryDataMessageComposer);
+ this._composers.set(OutgoingHeader.GET_OCCUPIED_TILES, GetOccupiedTilesMessageComposer);
+ this._composers.set(OutgoingHeader.GET_ROOM_ENTRY_TILE, GetRoomEntryTileMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_MODEL_SAVE, UpdateFloorPropertiesMessageComposer);
+
+ // UNIT
+ this._composers.set(OutgoingHeader.UNIT_ACTION, RoomUnitActionComposer);
+ this._composers.set(OutgoingHeader.UNIT_DANCE, RoomUnitDanceComposer);
+ this._composers.set(OutgoingHeader.UNIT_DROP_HAND_ITEM, RoomUnitDropHandItemComposer);
+ this._composers.set(OutgoingHeader.UNIT_GIVE_HANDITEM, RoomUnitGiveHandItemComposer);
+ this._composers.set(OutgoingHeader.UNIT_GIVE_HANDITEM_PET, RoomUnitGiveHandItemPetComposer);
+ this._composers.set(OutgoingHeader.UNIT_LOOK, RoomUnitLookComposer);
+ this._composers.set(OutgoingHeader.UNIT_SIGN, RoomUnitSignComposer);
+ this._composers.set(OutgoingHeader.UNIT_POSTURE, RoomUnitPostureComposer);
+ this._composers.set(OutgoingHeader.UNIT_WALK, RoomUnitWalkComposer);
+
+ // CHAT
+ this._composers.set(OutgoingHeader.UNIT_CHAT, RoomUnitChatComposer);
+ this._composers.set(OutgoingHeader.UNIT_CHAT_SHOUT, RoomUnitChatShoutComposer);
+ this._composers.set(OutgoingHeader.USER_SETTINGS_CHAT_STYLE, RoomUnitChatStyleComposer);
+ this._composers.set(OutgoingHeader.UNIT_CHAT_WHISPER, RoomUnitChatWhisperComposer);
+ this._composers.set(OutgoingHeader.UNIT_TYPING, RoomUnitTypingStartComposer);
+ this._composers.set(OutgoingHeader.UNIT_TYPING_STOP, RoomUnitTypingStopComposer);
+
+ // ROOM EVENTS
+ this._composers.set(OutgoingHeader.WIRED_APPLY_SNAPSHOT, ApplySnapshotMessageComposer);
+ this._composers.set(OutgoingHeader.WIRED_OPEN, OpenMessageComposer);
+ this._composers.set(OutgoingHeader.WIRED_ACTION_SAVE, UpdateActionMessageComposer);
+ this._composers.set(OutgoingHeader.WIRED_CONDITION_SAVE, UpdateConditionMessageComposer);
+ this._composers.set(OutgoingHeader.WIRED_TRIGGER_SAVE, UpdateTriggerMessageComposer);
+ this._composers.set(OutgoingHeader.ROOM_MUTE, RoomMuteComposer);
+
+ // USER
+ this._composers.set(OutgoingHeader.APPROVE_NAME, ApproveNameMessageComposer);
+ this._composers.set(OutgoingHeader.USER_RESPECT, UserRespectComposer);
+ this._composers.set(OutgoingHeader.SCR_GET_KICKBACK_INFO, ScrGetKickbackInfoMessageComposer);
+
+ // USER CLASSIFICATION
+ this._composers.set(OutgoingHeader.PEER_USERS_CLASSIFICATION, PeerUsersClassificationMessageComposer);
+ this._composers.set(OutgoingHeader.USER_CLASSIFICATION, RoomUsersClassificationMessageComposer);
+
+ // DATA
+ this._composers.set(OutgoingHeader.USER_IGNORED, GetIgnoredUsersComposer);
+ this._composers.set(OutgoingHeader.USER_IGNORE, IgnoreUserComposer);
+ this._composers.set(OutgoingHeader.USER_IGNORE_ID, IgnoreUserIdComposer);
+ this._composers.set(OutgoingHeader.USER_UNIGNORE, UnignoreUserComposer);
+ this._composers.set(OutgoingHeader.USER_BADGES_CURRENT, UserCurrentBadgesComposer);
+ this._composers.set(OutgoingHeader.USER_FIGURE, UserFigureComposer);
+ this._composers.set(OutgoingHeader.USER_MOTTO, UserMottoComposer);
+ this._composers.set(OutgoingHeader.USER_PROFILE, UserProfileComposer);
+ this._composers.set(OutgoingHeader.USER_PROFILE_BY_NAME, GetExtendedProfileByNameMessageComposer);
+ this._composers.set(OutgoingHeader.USER_TAGS, GetUserTagsComposer);
+ this._composers.set(OutgoingHeader.MESSENGER_RELATIONSHIPS, UserRelationshipsComposer);
+
+ // MANNEQUIN
+ this._composers.set(OutgoingHeader.MANNEQUIN_SAVE_NAME, FurnitureMannequinSaveNameComposer);
+ this._composers.set(OutgoingHeader.MANNEQUIN_SAVE_LOOK, FurnitureMannequinSaveLookComposer);
+
+ // GIFTS
+ this._composers.set(OutgoingHeader.PRESENT_OPEN_PRESENT, OpenPresentComposer);
+
+ // INVENTORY
+
+ // MARKETPLACE
+ this._composers.set(OutgoingHeader.MARKETPLACE_CONFIG, GetMarketplaceConfigurationMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_SELL_ITEM, MakeOfferMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_REQUEST_OWN_ITEMS, GetMarketplaceOwnOffersMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_TAKE_BACK_ITEM, CancelMarketplaceOfferMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_REQUEST_OFFERS, GetMarketplaceOffersMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_BUY_OFFER, BuyMarketplaceOfferMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_REDEEM_CREDITS, RedeemMarketplaceOfferCreditsMessageComposer);
+ this._composers.set(OutgoingHeader.MARKETPLACE_BUY_TOKENS, BuyMarketplaceTokensMessageComposer);
+ this._composers.set(OutgoingHeader.REQUEST_SELL_ITEM, GetMarketplaceCanMakeOfferComposer);
+ this._composers.set(OutgoingHeader.REQUEST_MARKETPLACE_ITEM_STATS, GetMarketplaceItemStatsComposer);
+
+ // BOTS
+ this._composers.set(OutgoingHeader.USER_BOTS, GetBotInventoryComposer);
+
+ // PETS
+ this._composers.set(OutgoingHeader.USER_PETS, RequestPetsComposer);
+
+ // CURRENCY
+ this._composers.set(OutgoingHeader.USER_CURRENCY, UserCurrencyComposer);
+
+ // SUBSCRIPTION
+ this._composers.set(OutgoingHeader.USER_SUBSCRIPTION, UserSubscriptionComposer);
+
+ // MODERATION
+ this._composers.set(OutgoingHeader.MODTOOL_REQUEST_ROOM_INFO, GetModeratorRoomInfoMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_CHANGE_ROOM_SETTINGS, ModerateRoomMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_REQUEST_USER_CHATLOG, GetUserChatlogMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_REQUEST_ROOM_CHATLOG, GetRoomChatlogMessageComposer);
+ this._composers.set(OutgoingHeader.MOD_TOOL_USER_INFO, GetModeratorUserInfoMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION_ALERT, ModAlertMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION_BAN, ModBanMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION_KICK, ModKickMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION_TRADELOCK, ModTradingLockMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_ALERTEVENT, ModMessageMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION_MUTE, ModMuteMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_REQUEST_USER_ROOMS, GetRoomVisitsMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_ROOM_ALERT, ModeratorActionMessageComposer);
+ this._composers.set(OutgoingHeader.CLOSE_ISSUE_DEFAULT_ACTION, CloseIssueDefaultActionMessageComposer);
+ this._composers.set(OutgoingHeader.CLOSE_ISSUES, CloseIssuesMessageComposer);
+ this._composers.set(OutgoingHeader.DEFAULT_SANCTION, DefaultSanctionMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CFH_CHATLOG, GetCfhChatlogMessageComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_PREFERENCES, ModToolPreferencesComposer);
+ this._composers.set(OutgoingHeader.MODTOOL_SANCTION, ModToolSanctionComposer);
+ this._composers.set(OutgoingHeader.PICK_ISSUES, PickIssuesMessageComposer);
+ this._composers.set(OutgoingHeader.RELEASE_ISSUES, ReleaseIssuesMessageComposer);
+
+ // MYSTERYBOX
+ this._composers.set(OutgoingHeader.MYSTERYBOXWAITINGCANCELEDMESSAGE, MysteryBoxWaitingCanceledMessageComposer);
+ this._composers.set(OutgoingHeader.MYSTERYBOX_OPEN_TROPHY, OpenMysteryTrophyMessageComposer);
+
+ // SETTINGS
+ this._composers.set(OutgoingHeader.USER_SETTINGS_CAMERA, UserSettingsCameraFollowComposer);
+ this._composers.set(OutgoingHeader.USER_SETTINGS_OLD_CHAT, UserSettingsOldChatComposer);
+ this._composers.set(OutgoingHeader.USER_SETTINGS_INVITES, UserSettingsRoomInvitesComposer);
+ this._composers.set(OutgoingHeader.USER_SETTINGS_VOLUME, UserSettingsSoundComposer);
+
+ // LANDING VIEW
+ this._composers.set(OutgoingHeader.COMMUNITY_GOAL_VOTE_COMPOSER, CommunityGoalVoteMessageComposer);
+ this._composers.set(OutgoingHeader.GET_PROMO_ARTICLES, GetPromoArticlesComposer);
+
+ // QUEST
+ this._composers.set(OutgoingHeader.ACCEPT_QUEST, AcceptQuestMessageComposer);
+ this._composers.set(OutgoingHeader.ACTIVATE_QUEST, ActivateQuestMessageComposer);
+ this._composers.set(OutgoingHeader.CANCEL_QUEST, CancelQuestMessageComposer);
+ this._composers.set(OutgoingHeader.FRIEND_REQUEST_QUEST_COMPLETE, FriendRequestQuestCompleteMessageComposer);
+ this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_EARNED_PRIZES, GetCommunityGoalEarnedPrizesMessageComposer);
+ this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_HALL_OF_FAME, GetCommunityGoalHallOfFameMessageComposer);
+ this._composers.set(OutgoingHeader.GET_COMMUNITY_GOAL_PROGRESS, GetCommunityGoalProgressMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CONCURRENT_USERS_GOAL_PROGRESS, GetConcurrentUsersGoalProgressMessageComposer);
+ this._composers.set(OutgoingHeader.GET_CONCURRENT_USERS_REWARD, GetConcurrentUsersRewardMessageComposer);
+ this._composers.set(OutgoingHeader.GET_DAILY_QUEST, GetDailyQuestMessageComposer);
+ this._composers.set(OutgoingHeader.GET_QUESTS, GetQuestsMessageComposer);
+ this._composers.set(OutgoingHeader.GET_SEASONAL_QUESTS_ONLY, GetSeasonalQuestsOnlyMessageComposer);
+ this._composers.set(OutgoingHeader.OPEN_QUEST_TRACKER, OpenQuestTrackerMessageComposer);
+ this._composers.set(OutgoingHeader.REDEEM_COMMUNITY_GOAL_PRIZE, RedeemCommunityGoalPrizeMessageComposer);
+ this._composers.set(OutgoingHeader.REJECT_QUEST, RejectQuestMessageComposer);
+ this._composers.set(OutgoingHeader.START_CAMPAIGN, StartCampaignMessageComposer);
+
+ // SOUNDS
+ this._composers.set(OutgoingHeader.GET_SOUND_SETTINGS, GetSoundSettingsComposer);
+ this._composers.set(OutgoingHeader.ADD_JUKEBOX_DISK, AddJukeboxDiskComposer);
+ this._composers.set(OutgoingHeader.GET_JUKEBOX_PLAYLIST, GetJukeboxPlayListMessageComposer);
+ this._composers.set(OutgoingHeader.GET_NOW_PLAYING, GetNowPlayingMessageComposer);
+ this._composers.set(OutgoingHeader.GET_OFFICIAL_SONG_ID, GetOfficialSongIdMessageComposer);
+ this._composers.set(OutgoingHeader.GET_SONG_INFO, GetSongInfoMessageComposer);
+ this._composers.set(OutgoingHeader.GET_SOUND_MACHINE_PLAYLIST, GetSoundMachinePlayListMessageComposer);
+ this._composers.set(OutgoingHeader.GET_USER_SONG_DISKS, GetUserSongDisksMessageComposer);
+ this._composers.set(OutgoingHeader.REMOVE_JUKEBOX_DISK, RemoveJukeboxDiskComposer);
+
+ // TALENT
+ this._composers.set(OutgoingHeader.HELPER_TALENT_TRACK, TalentTrackComposer);
+ this._composers.set(OutgoingHeader.TALENT_TRACK_GET_LEVEL, GetTalentTrackLevelMessageComposer);
+
+ //NUX
+ this._composers.set(OutgoingHeader.NEW_USER_EXPERIENCE_GET_GIFTS, NewUserExperienceGetGiftsComposer);
+ this._composers.set(OutgoingHeader.NEW_USER_EXPERIENCE_SCRIPT_PROCEED, NewUserExperienceScriptProceedComposer);
+
+ // WELCOME
+ this._composers.set(OutgoingHeader.WELCOME_OPEN_GIFT, OpenWelcomeGiftComposer);
+ this._composers.set(OutgoingHeader.WELCOME_GIFT_CHANGE_EMAIL, WelcomeGiftChangeEmailComposer);
+
+ // EMAIL
+ this._composers.set(OutgoingHeader.EMAIL_GET_STATUS, GetEmailStatusComposer);
+ this._composers.set(OutgoingHeader.EMAIL_CHANGE, ChangeEmailComposer);
+ // RENTABLE
+ this._composers.set(OutgoingHeader.RENTABLE_SPACE_CANCEL_RENT, RentableSpaceCancelRentMessageComposer);
+ this._composers.set(OutgoingHeader.RENTABLE_SPACE_RENT, RentableSpaceRentMessageComposer);
+ this._composers.set(OutgoingHeader.RENTABLE_SPACE_STATUS, RentableSpaceStatusMessageComposer);
+ // RECYCLER
+ this._composers.set(OutgoingHeader.RECYCLER_STATUS, GetRecyclerStatusMessageComposer);
+ this._composers.set(OutgoingHeader.RECYCLER_ITEMS, RecycleItemsMessageComposer);
+
+ // TRACKING
+ this._composers.set(OutgoingHeader.TRACKING_PERFORMANCE_LOG, PerformanceLogMessageComposer);
+ this._composers.set(OutgoingHeader.TRACKING_LAG_WARNING_REPORT, LagWarningReportMessageComposer);
+
+ // ROOM DIRECTORY
+ this._composers.set(OutgoingHeader.ROOM_DIRECTORY_ROOM_NETWORK_OPEN_CONNECTION, RoomNetworkOpenConnectionMessageComposer);
+
+ // RENTABLE
+ this._composers.set(OutgoingHeader.RENTABLE_EXTEND_RENT_OR_BUYOUT_STRIP_ITEM, ExtendRentOrBuyoutStripItemMessageComposer);
+ this._composers.set(OutgoingHeader.RENTABLE_EXTEND_RENT_OR_BUYOUT_FURNI, ExtendRentOrBuyoutFurniMessageComposer);
+ this._composers.set(OutgoingHeader.RENTABLE_GET_RENT_OR_BUYOUT_OFFER, GetRentOrBuyoutOfferMessageComposer);
+ }
+
+ public get events(): Map
+ {
+ return this._events;
+ }
+
+ public get composers(): Map
+ {
+ return this._composers;
+ }
+}
diff --git a/packages/communication/src/SocketConnection.ts b/packages/communication/src/SocketConnection.ts
new file mode 100644
index 0000000..5055295
--- /dev/null
+++ b/packages/communication/src/SocketConnection.ts
@@ -0,0 +1,261 @@
+import { ICodec, IConnection, IMessageComposer, IMessageConfiguration, IMessageDataWrapper, IMessageEvent, WebSocketEventEnum } from '@nitrots/api';
+import { GetEventDispatcher, NitroEvent, NitroEventType } from '@nitrots/events';
+import { NitroLogger } from '@nitrots/utils';
+import { EvaWireFormat } from './codec';
+import { MessageClassManager } from './messages';
+
+export class SocketConnection implements IConnection
+{
+ private _socket: WebSocket = null;
+ private _messages: MessageClassManager = new MessageClassManager();
+ private _codec: ICodec = new EvaWireFormat();
+ private _dataBuffer: ArrayBuffer = null;
+ private _isReady: boolean = false;
+
+ private _pendingClientMessages: IMessageComposer[] = [];
+ private _pendingServerMessages: IMessageDataWrapper[] = [];
+
+ private _isAuthenticated: boolean = false;
+
+ public init(socketUrl: string): void
+ {
+ if(!socketUrl || !socketUrl.length) return;
+
+ this._dataBuffer = new ArrayBuffer(0);
+
+ this._socket = new WebSocket(socketUrl);
+ this._socket.binaryType = 'arraybuffer';
+
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_OPENED, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_OPENED)));
+
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_CLOSED, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_CLOSED)));
+
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_ERROR, event => GetEventDispatcher().dispatchEvent(new NitroEvent(NitroEventType.SOCKET_ERROR)));
+
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_MESSAGE, (event: MessageEvent) =>
+ {
+ this._dataBuffer = this.concatArrayBuffers(this._dataBuffer, event.data);
+
+ this.processReceivedData();
+ });
+ }
+
+ public ready(): void
+ {
+ if(this._isReady) return;
+
+ this._isReady = true;
+
+ if(this._pendingServerMessages && this._pendingServerMessages.length) this.processWrappers(...this._pendingServerMessages);
+
+ if(this._pendingClientMessages && this._pendingClientMessages.length) this.send(...this._pendingClientMessages);
+
+ this._pendingServerMessages = [];
+ this._pendingClientMessages = [];
+ }
+
+ public authenticated(): void
+ {
+ this._isAuthenticated = true;
+ }
+
+ public send(...composers: IMessageComposer[]): boolean
+ {
+ if(!composers) return false;
+
+ composers = [...composers];
+
+ if(this._isAuthenticated && !this._isReady)
+ {
+ this._pendingClientMessages.push(...composers);
+
+ return false;
+ }
+
+ for(const composer of composers)
+ {
+ if(!composer) continue;
+
+ const header = this._messages.getComposerId(composer);
+
+ if(header === -1)
+ {
+ NitroLogger.packets('Unknown Composer', composer.constructor.name);
+
+ continue;
+ }
+
+ const message = composer.getMessageArray();
+ const encoded = this._codec.encode(header, message);
+
+ if(!encoded)
+ {
+ NitroLogger.packets('Encoding Failed', composer.constructor.name);
+
+ continue;
+ }
+
+ NitroLogger.packets('OutgoingComposer', header, composer.constructor.name, message);
+
+ this.write(encoded.getBuffer());
+ }
+
+ return true;
+ }
+
+ private write(buffer: ArrayBuffer): void
+ {
+ if(this._socket.readyState !== WebSocket.OPEN) return;
+
+ this._socket.send(buffer);
+ }
+
+ public processReceivedData(): void
+ {
+ try
+ {
+ this.processData();
+ }
+
+ catch (err)
+ {
+ NitroLogger.error(err);
+ }
+ }
+
+ private processData(): void
+ {
+ const wrappers = this.splitReceivedMessages();
+
+ if(!wrappers || !wrappers.length) return;
+
+ if(this._isAuthenticated && !this._isReady)
+ {
+ if(!this._pendingServerMessages) this._pendingServerMessages = [];
+
+ this._pendingServerMessages.push(...wrappers);
+
+ return;
+ }
+
+ this.processWrappers(...wrappers);
+ }
+
+ private processWrappers(...wrappers: IMessageDataWrapper[]): void
+ {
+ if(!wrappers || !wrappers.length) return;
+
+ for(const wrapper of wrappers)
+ {
+ if(!wrapper) continue;
+
+ const messages = this.getMessagesForWrapper(wrapper);
+
+ if(!messages || !messages.length) continue;
+
+ NitroLogger.packets('IncomingMessage', wrapper.header, messages[0].constructor.name, messages[0].parser);
+
+ this.handleMessages(...messages);
+ }
+ }
+
+ private splitReceivedMessages(): IMessageDataWrapper[]
+ {
+ if(!this._dataBuffer || !this._dataBuffer.byteLength) return null;
+
+ return this._codec.decode(this);
+ }
+
+ private concatArrayBuffers(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBuffer
+ {
+ const array = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
+
+ array.set(new Uint8Array(buffer1), 0);
+ array.set(new Uint8Array(buffer2), buffer1.byteLength);
+
+ return array.buffer;
+ }
+
+ private getMessagesForWrapper(wrapper: IMessageDataWrapper): IMessageEvent[]
+ {
+ if(!wrapper) return null;
+
+ const events = this._messages.getEvents(wrapper.header);
+
+ if(!events || !events.length)
+ {
+ NitroLogger.packets('IncomingMessage', wrapper.header, 'UNREGISTERED', wrapper);
+
+ return null;
+ }
+
+ try
+ {
+ //@ts-ignore
+ const parser = new events[0].parserClass();
+
+ if(!parser || !parser.flush() || !parser.parse(wrapper)) return null;
+
+ for(const event of events) (event.parser = parser);
+ }
+
+ catch (e)
+ {
+ NitroLogger.error('Error parsing message', e, events[0].constructor.name);
+
+ return null;
+ }
+
+ return events;
+ }
+
+ private handleMessages(...messages: IMessageEvent[]): void
+ {
+ messages = [...messages];
+
+ for(const message of messages)
+ {
+ if(!message) continue;
+
+ message.connection = this;
+
+ if(message.callBack) message.callBack(message);
+ }
+ }
+
+ public registerMessages(configuration: IMessageConfiguration): void
+ {
+ if(!configuration) return;
+
+ this._messages.registerMessages(configuration);
+ }
+
+ public addMessageEvent(event: IMessageEvent): void
+ {
+ if(!event || !this._messages) return;
+
+ this._messages.registerMessageEvent(event);
+ }
+
+ public removeMessageEvent(event: IMessageEvent): void
+ {
+ if(!event || !this._messages) return;
+
+ this._messages.removeMessageEvent(event);
+ }
+
+ public get isAuthenticated(): boolean
+ {
+ return this._isAuthenticated;
+ }
+
+ public get dataBuffer(): ArrayBuffer
+ {
+ return this._dataBuffer;
+ }
+
+ public set dataBuffer(buffer: ArrayBuffer)
+ {
+ this._dataBuffer = buffer;
+ }
+}
diff --git a/packages/communication/src/codec/Byte.ts b/packages/communication/src/codec/Byte.ts
new file mode 100644
index 0000000..dbcb29c
--- /dev/null
+++ b/packages/communication/src/codec/Byte.ts
@@ -0,0 +1,14 @@
+export class Byte
+{
+ private _value: number;
+
+ constructor(value: number)
+ {
+ this._value = value;
+ }
+
+ public get value(): number
+ {
+ return this._value;
+ }
+}
\ No newline at end of file
diff --git a/packages/communication/src/codec/Short.ts b/packages/communication/src/codec/Short.ts
new file mode 100644
index 0000000..f23125e
--- /dev/null
+++ b/packages/communication/src/codec/Short.ts
@@ -0,0 +1,14 @@
+export class Short
+{
+ private _value: number;
+
+ constructor(value: number)
+ {
+ this._value = value;
+ }
+
+ public get value(): number
+ {
+ return this._value;
+ }
+}
\ No newline at end of file
diff --git a/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts b/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts
new file mode 100644
index 0000000..06888c7
--- /dev/null
+++ b/packages/communication/src/codec/evawire/EvaWireDataWrapper.ts
@@ -0,0 +1,78 @@
+import { IBinaryReader, IMessageDataWrapper } from '@nitrots/api';
+
+export class EvaWireDataWrapper implements IMessageDataWrapper
+{
+ private _header: number;
+ private _buffer: IBinaryReader;
+
+ constructor(header: number, buffer: IBinaryReader)
+ {
+ this._header = header;
+ this._buffer = buffer;
+ }
+
+ public readBytes(length: number): IBinaryReader
+ {
+ if(!this._buffer) return null;
+
+ return this._buffer.readBytes(length);
+ }
+
+ public readByte(): number
+ {
+ if(!this._buffer) return -1;
+
+ return this._buffer.readByte();
+ }
+
+ public readBoolean(): boolean
+ {
+ return (this.readByte() === 1);
+ }
+
+ public readShort(): number
+ {
+ if(!this._buffer) return -1;
+
+ return this._buffer.readShort();
+ }
+
+ public readInt(): number
+ {
+ if(!this._buffer) return -1;
+
+ return this._buffer.readInt();
+ }
+
+ public readFloat(): number
+ {
+ if(!this._buffer) return -1;
+
+ return this._buffer.readFloat();
+ }
+
+ public readDouble(): number
+ {
+ if(!this._buffer) return -1;
+
+ return this._buffer.readDouble();
+ }
+
+ public readString(): string
+ {
+ const length = this.readShort();
+ const buffer = this._buffer.readBytes(length);
+
+ return buffer.toString('utf8');
+ }
+
+ public get header(): number
+ {
+ return this._header;
+ }
+
+ public get bytesAvailable(): boolean
+ {
+ return (this._buffer && (this._buffer.remaining() > 0));
+ }
+}
diff --git a/packages/communication/src/codec/evawire/EvaWireFormat.ts b/packages/communication/src/codec/evawire/EvaWireFormat.ts
new file mode 100644
index 0000000..1d3a72b
--- /dev/null
+++ b/packages/communication/src/codec/evawire/EvaWireFormat.ts
@@ -0,0 +1,89 @@
+import { IBinaryWriter, ICodec, IConnection, IMessageDataWrapper } from '@nitrots/api';
+import { BinaryReader, BinaryWriter } from '@nitrots/utils';
+import { Byte } from '../Byte';
+import { Short } from '../Short';
+import { EvaWireDataWrapper } from './EvaWireDataWrapper';
+
+export class EvaWireFormat implements ICodec
+{
+ public encode(header: number, messages: any[]): IBinaryWriter
+ {
+ const writer = new BinaryWriter();
+
+ writer.writeShort(header);
+
+ for(const value of messages)
+ {
+ let type: string = typeof value;
+
+ if(type === 'object')
+ {
+ if(value === null) type = 'null';
+ else if(value instanceof Byte) type = 'byte';
+ else if(value instanceof Short) type = 'short';
+ else if(value instanceof ArrayBuffer) type = 'arraybuffer';
+ }
+
+ switch(type)
+ {
+ case 'undefined':
+ case 'null':
+ writer.writeShort(0);
+ break;
+ case 'byte':
+ writer.writeByte(value.value);
+ break;
+ case 'short':
+ writer.writeShort(value.value);
+ break;
+ case 'number':
+ writer.writeInt(value);
+ break;
+ case 'boolean':
+ writer.writeByte(value ? 1 : 0);
+ break;
+ case 'string':
+ if(!value) writer.writeShort(0);
+ else
+ {
+ writer.writeString(value, true);
+ }
+ break;
+ case 'arraybuffer':
+ writer.writeBytes(value);
+ break;
+ }
+ }
+
+ const buffer = writer.getBuffer();
+
+ if(!buffer) return null;
+
+ return new BinaryWriter().writeInt(buffer.byteLength).writeBytes(buffer);
+ }
+
+ public decode(connection: IConnection): IMessageDataWrapper[]
+ {
+ if(!connection || !connection.dataBuffer || !connection.dataBuffer.byteLength) return null;
+
+ const wrappers: IMessageDataWrapper[] = [];
+
+ while(connection.dataBuffer.byteLength)
+ {
+ if(connection.dataBuffer.byteLength < 4) break;
+
+ const container = new BinaryReader(connection.dataBuffer);
+ const length = container.readInt();
+
+ if(length > (connection.dataBuffer.byteLength - 4)) break;
+
+ const extracted = container.readBytes(length);
+
+ wrappers.push(new EvaWireDataWrapper(extracted.readShort(), extracted));
+
+ connection.dataBuffer = connection.dataBuffer.slice(length + 4);
+ }
+
+ return wrappers;
+ }
+}
diff --git a/packages/communication/src/codec/evawire/index.ts b/packages/communication/src/codec/evawire/index.ts
new file mode 100644
index 0000000..6b63cda
--- /dev/null
+++ b/packages/communication/src/codec/evawire/index.ts
@@ -0,0 +1,2 @@
+export * from './EvaWireDataWrapper';
+export * from './EvaWireFormat';
diff --git a/packages/communication/src/codec/index.ts b/packages/communication/src/codec/index.ts
new file mode 100644
index 0000000..cb49e18
--- /dev/null
+++ b/packages/communication/src/codec/index.ts
@@ -0,0 +1,3 @@
+export * from './Byte';
+export * from './evawire';
+export * from './Short';
diff --git a/packages/communication/src/index.ts b/packages/communication/src/index.ts
new file mode 100644
index 0000000..7fa2659
--- /dev/null
+++ b/packages/communication/src/index.ts
@@ -0,0 +1,235 @@
+export * from './CommunicationManager';
+export * from './GetCommunication';
+export * from './NitroMessages';
+export * from './SocketConnection';
+export * from './codec';
+export * from './codec/evawire';
+export * from './messages';
+export * from './messages/incoming';
+export * from './messages/incoming/advertisement';
+export * from './messages/incoming/availability';
+export * from './messages/incoming/avatar';
+export * from './messages/incoming/bots';
+export * from './messages/incoming/callforhelp';
+export * from './messages/incoming/camera';
+export * from './messages/incoming/campaign';
+export * from './messages/incoming/catalog';
+export * from './messages/incoming/client';
+export * from './messages/incoming/competition';
+export * from './messages/incoming/crafting';
+export * from './messages/incoming/desktop';
+export * from './messages/incoming/friendlist';
+export * from './messages/incoming/game';
+export * from './messages/incoming/game/directory';
+export * from './messages/incoming/game/lobby';
+export * from './messages/incoming/game/score';
+export * from './messages/incoming/generic';
+export * from './messages/incoming/gifts';
+export * from './messages/incoming/group';
+export * from './messages/incoming/groupforums';
+export * from './messages/incoming/handshake';
+export * from './messages/incoming/help';
+export * from './messages/incoming/inventory';
+export * from './messages/incoming/inventory/achievements';
+export * from './messages/incoming/inventory/avatareffect';
+export * from './messages/incoming/inventory/badges';
+export * from './messages/incoming/inventory/clothes';
+export * from './messages/incoming/inventory/furni';
+export * from './messages/incoming/inventory/furni/gifts';
+export * from './messages/incoming/inventory/pets';
+export * from './messages/incoming/inventory/trading';
+export * from './messages/incoming/landingview';
+export * from './messages/incoming/landingview/votes';
+export * from './messages/incoming/marketplace';
+export * from './messages/incoming/moderation';
+export * from './messages/incoming/mysterybox';
+export * from './messages/incoming/navigator';
+export * from './messages/incoming/notifications';
+export * from './messages/incoming/nux';
+export * from './messages/incoming/perk';
+export * from './messages/incoming/pet';
+export * from './messages/incoming/pet/breeding';
+export * from './messages/incoming/poll';
+export * from './messages/incoming/quest';
+export * from './messages/incoming/recycler';
+export * from './messages/incoming/room';
+export * from './messages/incoming/room/access';
+export * from './messages/incoming/room/access/doorbell';
+export * from './messages/incoming/room/access/rights';
+export * from './messages/incoming/room/bots';
+export * from './messages/incoming/room/data';
+export * from './messages/incoming/room/engine';
+export * from './messages/incoming/room/furniture';
+export * from './messages/incoming/room/furniture/floor';
+export * from './messages/incoming/room/furniture/wall';
+export * from './messages/incoming/room/furniture/youtube';
+export * from './messages/incoming/room/mapping';
+export * from './messages/incoming/room/pet';
+export * from './messages/incoming/room/session';
+export * from './messages/incoming/room/unit';
+export * from './messages/incoming/room/unit/chat';
+export * from './messages/incoming/roomevents';
+export * from './messages/incoming/roomsettings';
+export * from './messages/incoming/security';
+export * from './messages/incoming/sound';
+export * from './messages/incoming/talent';
+export * from './messages/incoming/user';
+export * from './messages/incoming/user/access';
+export * from './messages/incoming/user/data';
+export * from './messages/incoming/user/inventory';
+export * from './messages/incoming/user/inventory/currency';
+export * from './messages/incoming/user/inventory/subscription';
+export * from './messages/incoming/user/wardrobe';
+export * from './messages/incoming/userclassification';
+export * from './messages/outgoing';
+export * from './messages/outgoing/advertisement';
+export * from './messages/outgoing/avatar';
+export * from './messages/outgoing/camera';
+export * from './messages/outgoing/campaign';
+export * from './messages/outgoing/catalog';
+export * from './messages/outgoing/competition';
+export * from './messages/outgoing/crafting';
+export * from './messages/outgoing/desktop';
+export * from './messages/outgoing/friendfurni';
+export * from './messages/outgoing/friendlist';
+export * from './messages/outgoing/game';
+export * from './messages/outgoing/game/arena';
+export * from './messages/outgoing/game/directory';
+export * from './messages/outgoing/game/ingame';
+export * from './messages/outgoing/game/lobby';
+export * from './messages/outgoing/game/score';
+export * from './messages/outgoing/gifts';
+export * from './messages/outgoing/group';
+export * from './messages/outgoing/groupforums';
+export * from './messages/outgoing/handshake';
+export * from './messages/outgoing/help';
+export * from './messages/outgoing/inventory';
+export * from './messages/outgoing/inventory/avatareffect';
+export * from './messages/outgoing/inventory/badges';
+export * from './messages/outgoing/inventory/bots';
+export * from './messages/outgoing/inventory/furni';
+export * from './messages/outgoing/inventory/pets';
+export * from './messages/outgoing/inventory/trading';
+export * from './messages/outgoing/inventory/unseen';
+export * from './messages/outgoing/landingview';
+export * from './messages/outgoing/landingview/votes';
+export * from './messages/outgoing/marketplace';
+export * from './messages/outgoing/moderation';
+export * from './messages/outgoing/mysterybox';
+export * from './messages/outgoing/navigator';
+export * from './messages/outgoing/nux';
+export * from './messages/outgoing/pet';
+export * from './messages/outgoing/poll';
+export * from './messages/outgoing/quest';
+export * from './messages/outgoing/recycler';
+export * from './messages/outgoing/room';
+export * from './messages/outgoing/room/access';
+export * from './messages/outgoing/room/action';
+export * from './messages/outgoing/room/bots';
+export * from './messages/outgoing/room/data';
+export * from './messages/outgoing/room/engine';
+export * from './messages/outgoing/room/furniture';
+export * from './messages/outgoing/room/furniture/dimmer';
+export * from './messages/outgoing/room/furniture/floor';
+export * from './messages/outgoing/room/furniture/logic';
+export * from './messages/outgoing/room/furniture/mannequin';
+export * from './messages/outgoing/room/furniture/presents';
+export * from './messages/outgoing/room/furniture/toner';
+export * from './messages/outgoing/room/furniture/wall';
+export * from './messages/outgoing/room/furniture/youtube';
+export * from './messages/outgoing/room/layout';
+export * from './messages/outgoing/room/pets';
+export * from './messages/outgoing/room/session';
+export * from './messages/outgoing/room/unit';
+export * from './messages/outgoing/room/unit/chat';
+export * from './messages/outgoing/roomdirectory';
+export * from './messages/outgoing/roomevents';
+export * from './messages/outgoing/roomsettings';
+export * from './messages/outgoing/sound';
+export * from './messages/outgoing/talent';
+export * from './messages/outgoing/tracking';
+export * from './messages/outgoing/user';
+export * from './messages/outgoing/user/data';
+export * from './messages/outgoing/user/inventory';
+export * from './messages/outgoing/user/inventory/currency';
+export * from './messages/outgoing/user/inventory/subscription';
+export * from './messages/outgoing/user/settings';
+export * from './messages/outgoing/userclassification';
+export * from './messages/parser';
+export * from './messages/parser/advertisement';
+export * from './messages/parser/availability';
+export * from './messages/parser/avatar';
+export * from './messages/parser/bots';
+export * from './messages/parser/callforhelp';
+export * from './messages/parser/camera';
+export * from './messages/parser/campaign';
+export * from './messages/parser/catalog';
+export * from './messages/parser/client';
+export * from './messages/parser/competition';
+export * from './messages/parser/crafting';
+export * from './messages/parser/desktop';
+export * from './messages/parser/friendlist';
+export * from './messages/parser/game';
+export * from './messages/parser/game/directory';
+export * from './messages/parser/game/lobby';
+export * from './messages/parser/game/score';
+export * from './messages/parser/generic';
+export * from './messages/parser/gifts';
+export * from './messages/parser/group';
+export * from './messages/parser/group/utils';
+export * from './messages/parser/groupforums';
+export * from './messages/parser/handshake';
+export * from './messages/parser/help';
+export * from './messages/parser/inventory';
+export * from './messages/parser/inventory/achievements';
+export * from './messages/parser/inventory/avatareffect';
+export * from './messages/parser/inventory/badges';
+export * from './messages/parser/inventory/clothing';
+export * from './messages/parser/inventory/furniture';
+export * from './messages/parser/inventory/pets';
+export * from './messages/parser/inventory/purse';
+export * from './messages/parser/inventory/trading';
+export * from './messages/parser/landingview';
+export * from './messages/parser/landingview/votes';
+export * from './messages/parser/marketplace';
+export * from './messages/parser/moderation';
+export * from './messages/parser/mysterybox';
+export * from './messages/parser/navigator';
+export * from './messages/parser/navigator/utils';
+export * from './messages/parser/notifications';
+export * from './messages/parser/nux';
+export * from './messages/parser/perk';
+export * from './messages/parser/perk/common';
+export * from './messages/parser/pet';
+export * from './messages/parser/poll';
+export * from './messages/parser/quest';
+export * from './messages/parser/recycler';
+export * from './messages/parser/room';
+export * from './messages/parser/room/access';
+export * from './messages/parser/room/access/doorbell';
+export * from './messages/parser/room/access/rights';
+export * from './messages/parser/room/bots';
+export * from './messages/parser/room/data';
+export * from './messages/parser/room/engine';
+export * from './messages/parser/room/furniture';
+export * from './messages/parser/room/furniture/floor';
+export * from './messages/parser/room/furniture/wall';
+export * from './messages/parser/room/furniture/youtube';
+export * from './messages/parser/room/mapping';
+export * from './messages/parser/room/pet';
+export * from './messages/parser/room/session';
+export * from './messages/parser/room/unit';
+export * from './messages/parser/room/unit/chat';
+export * from './messages/parser/roomevents';
+export * from './messages/parser/roomsettings';
+export * from './messages/parser/security';
+export * from './messages/parser/sound';
+export * from './messages/parser/talent';
+export * from './messages/parser/user';
+export * from './messages/parser/user/access';
+export * from './messages/parser/user/data';
+export * from './messages/parser/user/inventory';
+export * from './messages/parser/user/inventory/currency';
+export * from './messages/parser/user/inventory/subscription';
+export * from './messages/parser/user/wardrobe';
+export * from './messages/parser/userclassification';
diff --git a/packages/communication/src/messages/MessageClassManager.ts b/packages/communication/src/messages/MessageClassManager.ts
new file mode 100644
index 0000000..3de5e77
--- /dev/null
+++ b/packages/communication/src/messages/MessageClassManager.ts
@@ -0,0 +1,128 @@
+import { IMessageComposer, IMessageConfiguration, IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+
+export class MessageClassManager
+{
+ private _messageIdByEvent: Map;
+ private _messageIdByComposer: Map;
+ private _messageInstancesById: Map;
+
+ constructor()
+ {
+ this._messageIdByEvent = new Map();
+ this._messageIdByComposer = new Map();
+ this._messageInstancesById = new Map();
+ }
+
+ public dispose(): void
+ {
+ this._messageIdByEvent.clear();
+ this._messageIdByComposer.clear();
+ this._messageInstancesById.clear();
+ }
+
+ public registerMessages(configuration: IMessageConfiguration): void
+ {
+ for(const [header, handler] of configuration.events) this.registerMessageEventClass(header, handler);
+
+ for(const [header, handler] of configuration.composers) this.registerMessageComposerClass(header, handler);
+ }
+
+ private registerMessageEventClass(header: number, handler: Function): void
+ {
+ if(!header || !handler) return;
+
+ this._messageIdByEvent.set(handler, header);
+ }
+
+ private registerMessageComposerClass(header: number, handler: Function): void
+ {
+ if(!header || !handler) return;
+
+ this._messageIdByComposer.set(handler, header);
+ }
+
+ public registerMessageEvent(event: IMessageEvent): void
+ {
+ if(!event) return;
+
+ const header = this.getEventId(event);
+
+ if(!header) return;
+
+ let existing = this._messageInstancesById.get(header);
+
+ if(!existing || !existing.length)
+ {
+ existing = [];
+
+ this._messageInstancesById.set(header, existing);
+ }
+
+ existing.push(event);
+ }
+
+ public removeMessageEvent(event: IMessageEvent): void
+ {
+ if(!event) return;
+
+ const header = this.getEventId(event);
+
+ if(!header) return;
+
+ const existing = this._messageInstancesById.get(header);
+
+ if(!existing) return;
+
+ for(const [index, message] of existing.entries())
+ {
+ if(!message) continue;
+
+ if(message !== event) continue;
+
+ existing.splice(index, 1);
+
+ if(existing.length === 0) this._messageInstancesById.delete(header);
+
+ message.dispose();
+
+ return;
+ }
+ }
+
+ public getEvents(header: number): IMessageEvent[]
+ {
+ if(!header) return;
+
+ const existing = this._messageInstancesById.get(header);
+
+ if(!existing) return;
+
+ return existing;
+ }
+
+ public getEventId(event: IMessageEvent): number
+ {
+ if(!event) return -1;
+
+ //@ts-ignore
+ const name = (event instanceof MessageEvent ? event.constructor : event) as Function;
+
+ const existing = this._messageIdByEvent.get(name);
+
+ if(!existing) return -1;
+
+ return existing;
+ }
+
+ public getComposerId(composer: IMessageComposer): number
+ {
+ if(!composer) return -1;
+
+ const existing = this._messageIdByComposer.get(composer.constructor);
+
+ if(!existing) return -1;
+
+ return existing;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/IncomingHeader.ts b/packages/communication/src/messages/incoming/IncomingHeader.ts
new file mode 100644
index 0000000..f7ae0fd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/IncomingHeader.ts
@@ -0,0 +1,473 @@
+export class IncomingHeader
+{
+ public static ACHIEVEMENT_LIST = 305;
+ public static AUTHENTICATED = 2491;
+ public static AUTHENTICATION = -1;
+ public static AVAILABILITY_STATUS = 2033;
+ public static BUILDERS_CLUB_EXPIRED = 1452;
+ public static CLUB_OFFERS = 2405;
+ public static CATALOG_PAGE = 804;
+ public static CATALOG_PAGE_LIST = 1032;
+ public static CATALOG_PURCHASE_OK = 869;
+ public static CATALOG_PURCHASE_ERROR = 1404;
+ public static CATALOG_PURCHASE_NOT_ALLOWED = 3770;
+ public static PRODUCT_OFFER = 3388;
+ public static LIMITED_SOLD_OUT = 377;
+ public static CATALOG_PUBLISHED = 1866;
+ public static CFH_RESULT_MESSAGE = 3635;
+ public static CLIENT_LATENCY = 10;
+ public static CLIENT_PING = 3928;
+ public static DESKTOP_CAMPAIGN = 1745;
+ public static DESKTOP_NEWS = 286;
+ public static DESKTOP_VIEW = 122;
+ public static BUNDLE_DISCOUNT_RULESET = 2347;
+ public static FIRST_LOGIN_OF_DAY = 793;
+ public static FURNITURE_ALIASES = 1723;
+ public static FURNITURE_DATA = 2547;
+ public static FURNITURE_FLOOR = 1778;
+ public static FURNITURE_FLOOR_ADD = 1534;
+ public static FURNITURE_FLOOR_REMOVE = 2703;
+ public static FURNITURE_FLOOR_UPDATE = 3776;
+ public static FURNITURE_ITEMDATA = 2202;
+ public static FURNITURE_STATE = 2376;
+ public static FURNITURE_GROUP_CONTEXT_MENU_INFO = 3293;
+ public static FURNITURE_POSTIT_STICKY_POLE_OPEN = 2366;
+ public static GAME_CENTER_ACHIEVEMENTS = 2265;
+ public static GAME_CENTER_GAME_LIST = 222;
+ public static GAME_CENTER_STATUS = 2893;
+ public static GAME_CENTER_IN_ARENA_QUEUE = 872;
+ public static GAME_CENTER_STOP_COUNTER = 3191;
+ public static GAME_CENTER_USER_LEFT_GAME = 3138;
+ public static GAME_CENTER_DIRECTORY_STATUS = 2246;
+ public static GAME_CENTER_STARTING_GAME_FAILED = 2142;
+ public static GAME_CENTER_JOINING_FAILED = 1730;
+ public static GAMESTATUSMESSAGE = 3805;
+ public static GAMEACHIEVEMENTS = 1689;
+ public static GAMEINVITE = 904;
+ public static JOININGQUEUEFAILED = 3035;
+ public static JOINEDQUEUEMESSAGE = 2260;
+ public static LEFTQUEUE = 1477;
+ public static LOAD_GAME_URL = 2624;
+ public static LOADGAME = 3654;
+ public static UNLOADGAME = 1715;
+ public static ACHIEVEMENTRESOLUTIONCOMPLETED = 740;
+ public static ACHIEVEMENTRESOLUTIONPROGRESS = 3370;
+ public static ACHIEVEMENTRESOLUTIONS = 66;
+ public static GENERIC_ALERT = 3801;
+ public static MODERATOR_MESSAGE = 2030;
+ public static GENERIC_ERROR = 1600;
+ public static GIFT_WRAPPER_CONFIG = 2234;
+ public static GROUP_BADGES = 2402;
+ public static GROUP_CREATE_OPTIONS = 2159;
+ public static GROUP_FORUM_DATA = 3011;
+ public static GROUP_FORUM_LIST = 3001;
+ public static GROUP_FORUM_THREADS = 1073;
+ public static GROUP_FORUM_POST = 2049;
+ public static GROUP_FORUM_POST_THREAD = 1862;
+ public static GROUP_FORUM_THREAD_MESSAGES = 509;
+ public static GROUP_FORUM_UNREAD_COUNT = 2379;
+ public static GROUP_FORUM_UPDATE_MESSAGE = 324;
+ public static GROUP_FORUM_UPDATE_THREAD = 2528;
+ public static GROUP_INFO = 1702;
+ public static GROUP_LIST = 420;
+ public static GROUP_MEMBER = 265;
+ public static GROUP_MEMBERS = 1200;
+ public static GROUP_MEMBERS_REFRESH = 2445;
+ public static GROUP_MEMBER_REMOVE_CONFIRM = 1876;
+ public static GROUP_PURCHASED = 2808;
+ public static GROUP_SETTINGS = 3965;
+ public static GROUP_BADGE_PARTS = 2238;
+ public static GROUP_MEMBERSHIP_REQUESTED = 1180;
+ public static GROUP_DETAILS_CHANGED = 1459;
+ public static GROUP_HABBO_JOIN_FAILED = 762;
+ public static GUILD_EDIT_FAILED = 3988;
+ public static GUILD_MEMBER_MGMT_FAILED = 818;
+ public static ITEM_DIMMER_SETTINGS = 2710;
+ public static ITEM_STACK_HELPER = 2816;
+ public static ITEM_WALL = 1369;
+ public static ITEM_WALL_ADD = 2187;
+ public static ITEM_WALL_REMOVE = 3208;
+ public static ITEM_WALL_UPDATE = 2009;
+ public static MARKETPLACE_CONFIG = 1823;
+ public static MESSENGER_ACCEPT_FRIENDS = 896;
+ public static MESSENGER_CHAT = 1587;
+ public static MESSENGER_FIND_FRIENDS = 1210;
+ public static MESSENGER_FOLLOW_FAILED = 3048;
+ public static MESSENGER_FRIEND_NOTIFICATION = 3082;
+ public static MESSENGER_FRIENDS = 3130;
+ public static MESSENGER_INIT = 1605;
+ public static MESSENGER_INSTANCE_MESSAGE_ERROR = 3359;
+ public static MESSENGER_INVITE = 3870;
+ public static MESSENGER_INVITE_ERROR = 462;
+ public static MESSENGER_MESSAGE_ERROR = 892;
+ public static MESSENGER_MINIMAIL_COUNT = 2803;
+ public static MESSENGER_MINIMAIL_NEW = 1911;
+ public static MESSENGER_RELATIONSHIPS = 2016;
+ public static MESSENGER_REQUEST = 2219;
+ public static MESSENGER_REQUEST_ERROR = 892;
+ public static MESSENGER_REQUESTS = 280;
+ public static MESSENGER_SEARCH = 973;
+ public static MESSENGER_UPDATE = 2800;
+ public static MODERATION_REPORT_DISABLED = 1651;
+ public static MODERATION_TOOL = 2696;
+ public static MODERATION_USER_INFO = 2866;
+ public static MOTD_MESSAGES = 2035;
+ public static NAVIGATOR_CATEGORIES = 1562;
+ public static NAVIGATOR_COLLAPSED = 1543;
+ public static NAVIGATOR_EVENT_CATEGORIES = 3244;
+ public static NAVIGATOR_LIFTED = 3104;
+ public static NAVIGATOR_METADATA = 3052;
+ public static NAVIGATOR_OPEN_ROOM_CREATOR = 2064;
+ public static NAVIGATOR_SEARCH = 2690;
+ public static NAVIGATOR_SEARCHES = 3984;
+ public static NAVIGATOR_SETTINGS = 518;
+ public static THUMBNAIL_UPDATE_RESULT = 1927;
+ public static CAN_CREATE_ROOM = 378;
+ public static CATEGORIES_WITH_VISITOR_COUNT = 1455;
+ public static COMPETITION_ROOMS_DATA = 3954;
+ public static CONVERTED_ROOM_ID = 1331;
+ public static GUEST_ROOM_SEARCH_RESULT = 52;
+ public static NOTIFICATION_LIST = 1992;
+ public static NOTIFICATION_OFFER_REWARD_DELIVERED = 2125;
+ public static NOTIFICATION_SIMPLE_ALERT = 5100;
+ public static NOTIFICATION_ELEMENT_POINTER = 1787;
+ public static PET_FIGURE_UPDATE = 1924;
+ public static PET_INFO = 2901;
+ public static PET_TRAINING_PANEL = 1164;
+ public static PET_LEVEL_UPDATE = 2824;
+ public static PET_SCRATCH_FAILED = 1130;
+ public static PET_OPEN_PACKAGE_REQUESTED = 2380;
+ public static PET_OPEN_PACKAGE_RESULT = 546;
+ public static PET_BREEDING = 1746;
+ public static PET_CONFIRM_BREEDING_RESULT = 1625;
+ public static PET_GO_TO_BREEDING_NEST_FAILURE = 2621;
+ public static PET_NEST_BREEDING_SUCCESS = 2527;
+ public static PET_CONFIRM_BREEDING_REQUEST = 634;
+ public static PET_BREEDING_RESULT = 1553;
+ public static RECYCLER_PRIZES = 3164;
+ public static RECYCLER_STATUS = 3433;
+ public static RECYCLER_FINISHED = 468;
+ public static ROOM_BAN_LIST = 1869;
+ public static ROOM_BAN_REMOVE = 3429;
+ public static ROOM_CREATED = 1304;
+ public static ROOM_DOORBELL = 2309;
+ public static ROOM_DOORBELL_ACCEPTED = 3783;
+ public static ROOM_DOORBELL_REJECTED = 878;
+ public static ROOM_ENTER = 758;
+ public static ROOM_ENTER_ERROR = 899;
+ public static ROOM_FORWARD = 160;
+ public static ROOM_HEIGHT_MAP = 2753;
+ public static ROOM_HEIGHT_MAP_UPDATE = 558;
+ public static ROOM_INFO = 687;
+ public static ROOM_INFO_OWNER = 749;
+ public static ROOM_MODEL = 1301;
+ public static ROOM_MODEL_BLOCKED_TILES = 3990;
+ public static ROOM_MODEL_DOOR = 1664;
+ public static ROOM_MODEL_NAME = 2031;
+ public static ROOM_MUTED = 2533;
+ public static ROOM_MUTE_USER = 826;
+ public static ROOM_PAINT = 2454;
+ public static ROOM_PROMOTION = 2274;
+ public static ROOM_QUEUE_STATUS = 2208;
+ public static ROOM_RIGHTS = 780;
+ public static ROOM_RIGHTS_CLEAR = 2392;
+ public static ROOM_RIGHTS_LIST = 1284;
+ public static ROOM_RIGHTS_LIST_ADD = 2088;
+ public static ROOM_RIGHTS_LIST_REMOVE = 1327;
+ public static ROOM_RIGHTS_OWNER = 339;
+ public static ROOM_ROLLING = 3207;
+ public static ROOM_SCORE = 482;
+ public static ROOM_SETTINGS = 1498;
+ public static ROOM_SETTINGS_CHAT = 1191;
+ public static ROOM_SETTINGS_SAVE = 948;
+ public static ROOM_SETTINGS_SAVE_ERROR = 1555;
+ public static ROOM_INFO_UPDATED = 3297;
+ public static ROOM_SPECTATOR = 1033;
+ public static ROOM_THICKNESS = 3547;
+ public static ROOM_GET_FILTER_WORDS = 2937;
+ public static ROOM_MESSAGE_NOTIFICATION = 1634;
+ public static ROOM_POPULAR_TAGS_RESULT = 2012;
+ public static INFO_FEED_ENABLE = 3284;
+ public static SECURITY_MACHINE = 1488;
+ public static MYSTERY_BOX_KEYS = 2833;
+ public static GOTMYSTERYBOXPRIZEMESSAGE = 3712;
+ public static CANCELMYSTERYBOXWAITMESSAGE = 596;
+ public static SHOWMYSTERYBOXWAITMESSAGE = 3201;
+ public static TRADE_ACCEPTED = 2568;
+ public static TRADE_CLOSED = 1373;
+ public static TRADE_COMPLETED = 1001;
+ public static TRADE_CONFIRMATION = 2720;
+ public static TRADE_LIST_ITEM = 2024;
+ public static TRADE_NOT_OPEN = 3128;
+ public static TRADE_OPEN = 2505;
+ public static TRADE_OPEN_FAILED = 217;
+ public static TRADE_OTHER_NOT_ALLOWED = 1254;
+ public static TRADE_YOU_NOT_ALLOWED = 3058;
+ public static TRADE_NO_SUCH_ITEM = 2873;
+ public static UNIT = 374;
+ public static UNIT_CHANGE_NAME = 2182;
+ public static UNIT_CHAT = 1446;
+ public static UNIT_CHAT_SHOUT = 1036;
+ public static UNIT_CHAT_WHISPER = 2704;
+ public static UNIT_DANCE = 2233;
+ public static UNIT_EFFECT = 1167;
+ public static UNIT_EXPRESSION = 1631;
+ public static UNIT_HAND_ITEM = 1474;
+ public static UNIT_IDLE = 1797;
+ public static UNIT_INFO = 3920;
+ public static UNIT_NUMBER = 2324;
+ public static UNIT_REMOVE = 2661;
+ public static UNIT_STATUS = 1640;
+ public static UNIT_TYPING = 1717;
+ public static UNSEEN_ITEMS = 2103;
+ public static USER_ACHIEVEMENT_SCORE = 1968;
+ public static USER_BADGES = 717;
+ public static USER_BADGES_ADD = 2493;
+ public static USER_BADGES_CURRENT = 1087;
+ public static USER_BOT_REMOVE = 233;
+ public static USER_BOTS = 3086;
+ public static USER_CHANGE_NAME = 118;
+ public static USER_CLOTHING = 1450;
+ public static USER_CREDITS = 3475;
+ public static USER_CURRENCY = 2018;
+ public static ACTIVITY_POINT_NOTIFICATION = 2275;
+ public static USER_EFFECTS = 340;
+ public static USER_FAVORITE_ROOM = 2524;
+ public static USER_FAVORITE_ROOM_COUNT = 151;
+ public static USER_FIGURE = 2429;
+ public static USER_FURNITURE = 994;
+ public static USER_FURNITURE_ADD = 104;
+ public static USER_FURNITURE_POSTIT_PLACED = 1501;
+ public static USER_FURNITURE_REFRESH = 3151;
+ public static USER_FURNITURE_REMOVE = 159;
+ public static USER_HOME_ROOM = 2875;
+ public static ROOM_EVENT_CANCEL = 3479;
+ public static ROOM_EVENT = 1840;
+ public static USER_IGNORED = 126;
+ public static USER_IGNORED_RESULT = 207;
+ public static USER_INFO = 2725;
+ public static USER_OUTFITS = 3315;
+ public static USER_PERKS = 2586;
+ public static USER_PERMISSIONS = 411;
+ public static USER_PET_ADD = 2101;
+ public static USER_PET_REMOVE = 3253;
+ public static USER_PETS = 3522;
+ public static USER_PROFILE = 3898;
+ public static USER_RESPECT = 2815;
+ public static USER_SANCTION_STATUS = 3679;
+ public static USER_SETTINGS = 513;
+ public static USER_SUBSCRIPTION = 954;
+ public static USER_WARDROBE_PAGE = 3315;
+ public static USER_CLASSIFICATION = 966;
+ public static GET_USER_TAGS = 1255;
+ public static WIRED_ACTION = 1434;
+ public static WIRED_CONDITION = 1108;
+ public static WIRED_ERROR = 156;
+ public static WIRED_OPEN = 1830;
+ public static WIRED_REWARD = 178;
+ public static WIRED_SAVE = 1155;
+ public static WIRED_TRIGGER = 383;
+ public static PLAYING_GAME = 448;
+ public static FURNITURE_STATE_2 = 3431;
+ public static REMOVE_BOT_FROM_INVENTORY = 233;
+ public static ADD_BOT_TO_INVENTORY = 1352;
+ public static ACHIEVEMENT_PROGRESSED = 2107;
+ public static MODTOOL_ROOM_INFO = 1333;
+ public static MODTOOL_USER_CHATLOG = 3377;
+ public static MODTOOL_ROOM_CHATLOG = 3434;
+ public static MODTOOL_VISITED_ROOMS_USER = 1752;
+ public static MODERATOR_ACTION_RESULT = 2335;
+ public static ISSUE_DELETED = 3192;
+ public static ISSUE_INFO = 3609;
+ public static ISSUE_PICK_FAILED = 3150;
+ public static CFH_CHATLOG = 607;
+ public static MODERATOR_TOOL_PREFERENCES = 1576;
+ public static LOVELOCK_FURNI_START = 3753;
+ public static LOVELOCK_FURNI_FRIEND_COMFIRMED = 382;
+ public static LOVELOCK_FURNI_FINISHED = 770;
+ public static GIFT_RECEIVER_NOT_FOUND = 1517;
+ public static GIFT_OPENED = 56;
+ public static FLOOD_CONTROL = 566;
+ public static REMAINING_MUTE = 826;
+ public static USER_EFFECT_LIST = 340;
+ public static USER_EFFECT_LIST_ADD = 2867;
+ public static USER_EFFECT_LIST_REMOVE = 2228;
+ public static USER_EFFECT_ACTIVATE = 1959;
+ public static AVATAR_EFFECT_SELECTED = 3473;
+ public static CLUB_GIFT_INFO = 619;
+ public static REDEEM_VOUCHER_ERROR = 714;
+ public static REDEEM_VOUCHER_OK = 3336;
+ public static IN_CLIENT_LINK = 2023;
+ public static BOT_COMMAND_CONFIGURATION = 1618;
+ public static BOT_SKILL_LIST_UPDATE = 69;
+ public static BOT_FORCE_OPEN_CONTEXT_MENU = 296;
+ public static HAND_ITEM_RECEIVED = 354;
+ public static PET_PLACING_ERROR = 2913;
+ public static BOT_ERROR = 639;
+ public static MARKETPLACE_SELL_ITEM = 54;
+ public static MARKETPLACE_ITEM_STATS = 725;
+ public static MARKETPLACE_OWN_ITEMS = 3884;
+ public static MARKETPLACE_CANCEL_SALE = 3264;
+ public static MARKETPLACE_ITEM_POSTED = 1359;
+ public static MARKETPLACE_ITEMS_SEARCHED = 680;
+ public static MARKETPLACE_AFTER_ORDER_STATUS = 2032;
+ public static CATALOG_RECEIVE_PET_BREEDS = 3331;
+ public static CATALOG_APPROVE_NAME_RESULT = 1503;
+ public static OBJECTS_DATA_UPDATE = 1453;
+ public static PET_EXPERIENCE = 2156;
+ public static COMMUNITY_GOAL_VOTE_EVENT = 1435;
+ public static PROMO_ARTICLES = 286;
+ public static COMMUNITY_GOAL_EARNED_PRIZES = 3319;
+ public static COMMUNITY_GOAL_PROGRESS = 2525;
+ public static CONCURRENT_USERS_GOAL_PROGRESS = 2737;
+ public static QUEST_DAILY = 1878;
+ public static QUEST_CANCELLED = 3027;
+ public static QUEST_COMPLETED = 949;
+ public static COMMUNITY_GOAL_HALL_OF_FAME = 3005;
+ public static EPIC_POPUP = 3945;
+ public static SEASONAL_QUESTS = 1122;
+ public static QUESTS = 3625;
+ public static QUEST = 230;
+ public static BONUS_RARE_INFO = 1533;
+ public static CRAFTABLE_PRODUCTS = 1000;
+ public static CRAFTING_RECIPE = 2774;
+ public static CRAFTING_RECIPES_AVAILABLE = 2124;
+ public static CRAFTING_RESULT = 618;
+ public static CAMERA_PUBLISH_STATUS = 2057;
+ public static CAMERA_PURCHASE_OK = 2783;
+ public static CAMERA_STORAGE_URL = 3696;
+ public static CAMERA_SNAPSHOT = 463;
+ public static COMPETITION_STATUS = 133;
+ public static INIT_CAMERA = 3878;
+ public static THUMBNAIL_STATUS = 3595;
+ public static ACHIEVEMENT_NOTIFICATION = 806;
+ public static CLUB_GIFT_NOTIFICATION = 2188;
+ public static INTERSTITIAL_MESSAGE = 1808;
+ public static ROOM_AD_ERROR = 1759;
+ public static AVAILABILITY_TIME = 600;
+ public static HOTEL_CLOSED_AND_OPENS = 3728;
+ public static HOTEL_CLOSES_AND_OPENS_AT = 2771;
+ public static HOTEL_WILL_CLOSE_MINUTES = 1050;
+ public static HOTEL_MAINTENANCE = 1350;
+ public static JUKEBOX_PLAYLIST_FULL = 105;
+ public static JUKEBOX_SONG_DISKS = 34;
+ public static NOW_PLAYING = 469;
+ public static OFFICIAL_SONG_ID = 1381;
+ public static PLAYLIST = 1748;
+ public static PLAYLIST_SONG_ADDED = 1140;
+ public static TRAX_SONG_INFO = 3365;
+ public static USER_SONG_DISKS_INVENTORY = 2602;
+ public static CHECK_USER_NAME = 563;
+ public static CFH_SANCTION = 2782;
+ public static CFH_TOPICS = 325;
+ public static CFH_SANCTION_STATUS = 2221;
+ public static CAMPAIGN_CALENDAR_DATA = 2531;
+ public static CAMPAIGN_CALENDAR_DOOR_OPENED = 2551;
+ public static BUILDERS_CLUB_FURNI_COUNT = 3828;
+ public static BUILDERS_CLUB_SUBSCRIPTION = 1452;
+ public static CATALOG_PAGE_EXPIRATION = 2668;
+ public static CATALOG_EARLIEST_EXPIRY = 2515;
+ public static CLUB_GIFT_SELECTED = 659;
+ public static TARGET_OFFER_NOT_FOUND = 1237;
+ public static TARGET_OFFER = 119;
+ public static DIRECT_SMS_CLUB_BUY = 195;
+ public static ROOM_AD_PURCHASE = 2468;
+ public static NOT_ENOUGH_BALANCE = 3914;
+ public static LIMITED_OFFER_APPEARING_NEXT = 44;
+ public static IS_OFFER_GIFTABLE = 761;
+ public static CLUB_EXTENDED_OFFER = 3964;
+ public static SEASONAL_CALENDAR_OFFER = 1889;
+ public static COMPETITION_ENTRY_SUBMIT = 1177;
+ public static COMPETITION_VOTING_INFO = 3506;
+ public static COMPETITION_TIMING_CODE = 1745;
+ public static COMPETITION_USER_PART_OF = 3841;
+ public static COMPETITION_NO_OWNED_ROOMS = 2064;
+ public static COMPETITION_SECONDS_UNTIL = 3926;
+ public static BADGE_POINT_LIMITS = 2501;
+ public static BADGE_REQUEST_FULFILLED = 2998;
+ public static HELPER_TALENT_TRACK = 3406;
+ public static TALENT_TRACK_LEVEL = 1203;
+ public static TALENT_TRACK_LEVEL_UP = 638;
+ public static USER_BANNED = 1683;
+ public static BOT_RECEIVED = 3684;
+ public static PET_LEVEL_NOTIFICATION = 859;
+ public static PET_RECEIVED = 1111;
+ public static MODERATION_CAUTION = 1890;
+ public static YOUTUBE_CONTROL_VIDEO = 1554;
+ public static YOUTUBE_DISPLAY_PLAYLISTS = 1112;
+ public static YOUTUBE_DISPLAY_VIDEO = 1411;
+ public static CFH_DISABLED_NOTIFY = 1651;
+ public static QUESTION = 2665;
+ public static POLL_CONTENTS = 2997;
+ public static POLL_ERROR = 662;
+ public static POLL_OFFER = 3785;
+ public static POLL_ROOM_RESULT = 5201;
+ public static POLL_START_ROOM = 5200;
+ public static QUESTION_ANSWERED = 2589;
+ public static QUESTION_FINISHED = 1066;
+ public static CFH_PENDING_CALLS = 1121;
+ public static GUIDE_ON_DUTY_STATUS = 1548;
+ public static GUIDE_SESSION_ATTACHED = 1591;
+ public static GUIDE_SESSION_DETACHED = 138;
+ public static GUIDE_SESSION_ENDED = 1456;
+ public static GUIDE_SESSION_ERROR = 673;
+ public static GUIDE_SESSION_INVITED_TO_GUIDE_ROOM = 219;
+ public static GUIDE_SESSION_MESSAGE = 841;
+ public static GUIDE_SESSION_PARTNER_IS_TYPING = 1016;
+ public static GUIDE_SESSION_REQUESTER_ROOM = 1847;
+ public static GUIDE_SESSION_STARTED = 3209;
+ public static GUIDE_TICKET_CREATION_RESULT = 3285;
+ public static GUIDE_TICKET_RESOLUTION = 2674;
+ public static GUIDE_REPORTING_STATUS = 3463;
+ public static HOTEL_MERGE_NAME_CHANGE = 1663;
+ public static ISSUE_CLOSE_NOTIFICATION = 934;
+ public static QUIZ_DATA = 2927;
+ public static QUIZ_RESULTS = 2772;
+ public static CFH_PENDING_CALLS_DELETED = 77;
+ public static CFH_REPLY = 3796;
+ public static CHAT_REVIEW_SESSION_DETACHED = 30;
+ public static CHAT_REVIEW_SESSION_OFFERED_TO_GUIDE = 735;
+ public static CHAT_REVIEW_SESSION_RESULTS = 3276;
+ public static CHAT_REVIEW_SESSION_STARTED = 143;
+ public static CHAT_REVIEW_SESSION_VOTING_STATUS = 1829;
+ public static SCR_SEND_KICKBACK_INFO = 3277;
+ public static PET_STATUS = 1907;
+ public static GROUP_DEACTIVATE = 3129;
+ public static PET_RESPECTED = 2788;
+ public static PET_SUPPLEMENT = 3441;
+ public static NOOBNESS_LEVEL = 3738;
+ public static DISCONNECT_REASON = 4000;
+ public static CAN_CREATE_ROOM_EVENT = 2599;
+ public static FAVORITE_GROUP_UDPATE = 3403;
+ public static NO_SUCH_FLAT = 84;
+ public static ROOM_SETTINGS_ERROR = 2897;
+ public static SHOW_ENFORCE_ROOM_CATEGORY = 3896;
+ public static CUSTOM_USER_NOTIFICATION = 909;
+ public static NEW_USER_EXPERIENCE_GIFT_OFFER = 3575;
+ public static RESTORE_CLIENT = 426;
+ public static FIREWORK_CHARGE_DATA = 5210;
+ public static NEW_USER_EXPERIENCE_NOT_COMPLETE = 3639;
+ public static CONNECTION_ERROR = 1004;
+ public static ACCOUNT_SAFETY_LOCK_STATUS_CHANGE = 1243;
+ public static PHONE_COLLECTION_STATE = 2890;
+ public static PHONE_TRY_NUMBER_RESULT = 800;
+ public static PHONE_TRY_VERIFICATION_CODE_RESULT = 91;
+ public static EXTENDED_PROFILE_CHANGED = 876;
+ public static WELCOME_GIFT_CHANGE_EMAIL_RESULT = 2293;
+ public static WELCOME_GIFT_STATUS = 2707;
+ public static HANDSHAKE_INIT_DIFFIE = 1347;
+ public static HANDSHAKE_COMPLETE_DIFFIE = 3885;
+ public static RENTABLE_SPACE_RENT_OK = 2046;
+ public static RENTABLE_SPACE_STATUS = 3559;
+ public static RENTABLE_SPACE_RENT_FAILED = 1868;
+ public static EMAIL_STATUS = 612;
+ public static CHANGE_EMAIL_RESULT = 1815;
+ public static WEEKLY_GAME_REWARD = 2641;
+ public static WEEKLY_GAME_REWARD_WINNERS = 3097;
+ public static WEEKLY_COMPETITIVE_LEADERBOARD = 3512;
+ public static WEEKLY_COMPETITIVE_FRIENDS_LEADERBOARD = 3560;
+ public static WEEKLY_GAME2_FRIENDS_LEADERBOARD = 2270;
+ public static WEEKLY_GAME2_LEADERBOARD = 2196;
+ public static RENTABLE_FURNI_RENT_OR_BUYOUT_OFFER = 35;
+ public static HANDSHAKE_IDENTITY_ACCOUNT = 3523;
+}
diff --git a/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts b/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts
new file mode 100644
index 0000000..7fd5f29
--- /dev/null
+++ b/packages/communication/src/messages/incoming/advertisement/InterstitialMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InterstitialMessageParser } from '../../parser';
+
+export class InterstitialMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InterstitialMessageParser);
+ }
+
+ public getParser(): InterstitialMessageParser
+ {
+ return this.parser as InterstitialMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts b/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts
new file mode 100644
index 0000000..1bee1d4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/advertisement/RoomAdErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomAdErrorMessageParser } from '../../parser';
+
+export class RoomAdErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomAdErrorMessageParser);
+ }
+
+ public getParser(): RoomAdErrorMessageParser
+ {
+ return this.parser as RoomAdErrorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/advertisement/index.ts b/packages/communication/src/messages/incoming/advertisement/index.ts
new file mode 100644
index 0000000..7727ffc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/advertisement/index.ts
@@ -0,0 +1,2 @@
+export * from './InterstitialMessageEvent';
+export * from './RoomAdErrorEvent';
diff --git a/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts b/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts
new file mode 100644
index 0000000..3cd147d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/AvailabilityStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvailabilityStatusMessageParser } from '../../parser';
+
+export class AvailabilityStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvailabilityStatusMessageParser);
+ }
+
+ public getParser(): AvailabilityStatusMessageParser
+ {
+ return this.parser as AvailabilityStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts b/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts
new file mode 100644
index 0000000..06ea6f8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/AvailabilityTimeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvailabilityTimeMessageParser } from '../../parser';
+
+export class AvailabilityTimeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvailabilityTimeMessageParser);
+ }
+
+ public getParser(): AvailabilityTimeMessageParser
+ {
+ return this.parser as AvailabilityTimeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts b/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts
new file mode 100644
index 0000000..ab8e15b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/HotelClosedAndOpensEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HotelClosedAndOpensMessageParser } from '../../parser';
+
+export class HotelClosedAndOpensEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HotelClosedAndOpensMessageParser);
+ }
+
+ public getParser(): HotelClosedAndOpensMessageParser
+ {
+ return this.parser as HotelClosedAndOpensMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts b/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts
new file mode 100644
index 0000000..615f631
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HotelClosesAndWillOpenAtMessageParser } from '../../parser';
+
+export class HotelClosesAndWillOpenAtEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HotelClosesAndWillOpenAtMessageParser);
+ }
+
+ public getParser(): HotelClosesAndWillOpenAtMessageParser
+ {
+ return this.parser as HotelClosesAndWillOpenAtMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts b/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts
new file mode 100644
index 0000000..c79dde8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HotelWillCloseInMinutesMessageParser } from '../../parser';
+
+export class HotelWillCloseInMinutesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HotelWillCloseInMinutesMessageParser);
+ }
+
+ public getParser(): HotelWillCloseInMinutesMessageParser
+ {
+ return this.parser as HotelWillCloseInMinutesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts b/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts
new file mode 100644
index 0000000..dbfdf32
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/MaintenanceStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MaintenanceStatusMessageParser } from '../../parser';
+
+export class MaintenanceStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MaintenanceStatusMessageParser);
+ }
+
+ public getParser(): MaintenanceStatusMessageParser
+ {
+ return this.parser as MaintenanceStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/availability/index.ts b/packages/communication/src/messages/incoming/availability/index.ts
new file mode 100644
index 0000000..8d657b5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/availability/index.ts
@@ -0,0 +1,6 @@
+export * from './AvailabilityStatusMessageEvent';
+export * from './AvailabilityTimeMessageEvent';
+export * from './HotelClosedAndOpensEvent';
+export * from './HotelClosesAndWillOpenAtEvent';
+export * from './HotelWillCloseInMinutesEvent';
+export * from './MaintenanceStatusMessageEvent';
diff --git a/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts
new file mode 100644
index 0000000..f913b81
--- /dev/null
+++ b/packages/communication/src/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts
@@ -0,0 +1,25 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChangeUserNameResultMessageParser } from '../../parser';
+
+export class ChangeUserNameResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ public static NAME_OK: number = 0;
+ public static ERROR_NAME_REQUIRED: number = 1;
+ public static ERROR_NAME_TOO_SHORT: number = 2;
+ public static ERROR_NAME_TOO_LONG: number = 3;
+ public static ERROR_NAME_NOT_VALID: number = 4;
+ public static ERROR_NAME_IN_USE: number = 5;
+ public static ERROR_NAME_CHANGE_NOT_ALLOWED: number = 6;
+ public static ERROR_MERGE_HOTEL_DOWN: number = 7;
+
+ constructor(callBack: Function)
+ {
+ super(callBack, ChangeUserNameResultMessageParser);
+ }
+
+ public getParser(): ChangeUserNameResultMessageParser
+ {
+ return this.parser as ChangeUserNameResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts
new file mode 100644
index 0000000..8227c67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CheckUserNameResultMessageParser } from '../../parser';
+
+export class CheckUserNameResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CheckUserNameResultMessageParser);
+ }
+
+ public getParser(): CheckUserNameResultMessageParser
+ {
+ return this.parser as CheckUserNameResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts b/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts
new file mode 100644
index 0000000..fe5fa9f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/avatar/FigureUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FigureUpdateParser } from '../../parser';
+
+export class FigureUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FigureUpdateParser);
+ }
+
+ public getParser(): FigureUpdateParser
+ {
+ return this.parser as FigureUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts b/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts
new file mode 100644
index 0000000..c814a7c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/avatar/WardrobeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WardrobeMessageParser } from '../../parser';
+
+export class WardrobeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WardrobeMessageParser);
+ }
+
+ public getParser(): WardrobeMessageParser
+ {
+ return this.parser as WardrobeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/avatar/index.ts b/packages/communication/src/messages/incoming/avatar/index.ts
new file mode 100644
index 0000000..45a727e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/avatar/index.ts
@@ -0,0 +1,4 @@
+export * from './ChangeUserNameResultMessageEvent';
+export * from './CheckUserNameResultMessageEvent';
+export * from './FigureUpdateEvent';
+export * from './WardrobeMessageEvent';
diff --git a/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts b/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts
new file mode 100644
index 0000000..29c2055
--- /dev/null
+++ b/packages/communication/src/messages/incoming/bots/BotAddedToInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotAddedToInventoryParser } from '../../parser';
+
+export class BotAddedToInventoryEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotAddedToInventoryParser);
+ }
+
+ public getParser(): BotAddedToInventoryParser
+ {
+ return this.parser as BotAddedToInventoryParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts b/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts
new file mode 100644
index 0000000..70dd754
--- /dev/null
+++ b/packages/communication/src/messages/incoming/bots/BotInventoryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotInventoryMessageParser } from '../../parser';
+
+export class BotInventoryMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotInventoryMessageParser);
+ }
+
+ public getParser(): BotInventoryMessageParser
+ {
+ return this.parser as BotInventoryMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts b/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts
new file mode 100644
index 0000000..533e81c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/bots/BotReceivedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotReceivedMessageParser } from '../../parser';
+
+export class BotReceivedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotReceivedMessageParser);
+ }
+
+ public getParser(): BotReceivedMessageParser
+ {
+ return this.parser as BotReceivedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts b/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts
new file mode 100644
index 0000000..dbbf6f5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/bots/BotRemovedFromInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotRemovedFromInventoryParser } from '../../parser';
+
+export class BotRemovedFromInventoryEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotRemovedFromInventoryParser);
+ }
+
+ public getParser(): BotRemovedFromInventoryParser
+ {
+ return this.parser as BotRemovedFromInventoryParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/bots/index.ts b/packages/communication/src/messages/incoming/bots/index.ts
new file mode 100644
index 0000000..dde10bf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/bots/index.ts
@@ -0,0 +1,4 @@
+export * from './BotAddedToInventoryEvent';
+export * from './BotInventoryMessageEvent';
+export * from './BotReceivedMessageEvent';
+export * from './BotRemovedFromInventoryEvent';
diff --git a/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts b/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts
new file mode 100644
index 0000000..9f15e10
--- /dev/null
+++ b/packages/communication/src/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CfhSanctionMessageParser } from '../../parser';
+
+export class CfhSanctionMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CfhSanctionMessageParser);
+ }
+
+ public getParser(): CfhSanctionMessageParser
+ {
+ return this.parser as CfhSanctionMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts b/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts
new file mode 100644
index 0000000..29aa4e2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/callforhelp/CfhTopicsInitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CfhTopicsInitMessageParser } from '../../parser';
+
+export class CfhTopicsInitEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CfhTopicsInitMessageParser);
+ }
+
+ public getParser(): CfhTopicsInitMessageParser
+ {
+ return this.parser as CfhTopicsInitMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts b/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts
new file mode 100644
index 0000000..d3e7116
--- /dev/null
+++ b/packages/communication/src/messages/incoming/callforhelp/SanctionStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SanctionStatusMessageParser } from '../../parser';
+
+export class SanctionStatusEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SanctionStatusMessageParser);
+ }
+
+ public getParser(): SanctionStatusMessageParser
+ {
+ return this.parser as SanctionStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/callforhelp/index.ts b/packages/communication/src/messages/incoming/callforhelp/index.ts
new file mode 100644
index 0000000..9b60cfb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/callforhelp/index.ts
@@ -0,0 +1,3 @@
+export * from './CfhSanctionMessageEvent';
+export * from './CfhTopicsInitEvent';
+export * from './SanctionStatusEvent';
diff --git a/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts
new file mode 100644
index 0000000..21a95a4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/CameraPublishStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CameraPublishStatusMessageParser } from '../../parser';
+
+export class CameraPublishStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CameraPublishStatusMessageParser);
+ }
+
+ public getParser(): CameraPublishStatusMessageParser
+ {
+ return this.parser as CameraPublishStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts
new file mode 100644
index 0000000..22efe88
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CameraPurchaseOKMessageParser } from '../../parser';
+
+export class CameraPurchaseOKMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CameraPurchaseOKMessageParser);
+ }
+
+ public getParser(): CameraPurchaseOKMessageParser
+ {
+ return this.parser as CameraPurchaseOKMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts
new file mode 100644
index 0000000..921bbe8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/CameraSnapshotMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CameraSnapshotMessageParser } from '../../parser';
+
+export class CameraSnapshotMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CameraSnapshotMessageParser);
+ }
+
+ public getParser(): CameraSnapshotMessageParser
+ {
+ return this.parser as CameraSnapshotMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts
new file mode 100644
index 0000000..d123d6e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/CameraStorageUrlMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CameraStorageUrlMessageParser } from '../../parser';
+
+export class CameraStorageUrlMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CameraStorageUrlMessageParser);
+ }
+
+ public getParser(): CameraStorageUrlMessageParser
+ {
+ return this.parser as CameraStorageUrlMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts
new file mode 100644
index 0000000..21fc635
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/CompetitionStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CompetitionStatusMessageParser } from '../../parser';
+
+export class CompetitionStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CompetitionStatusMessageParser);
+ }
+
+ public getParser(): CompetitionStatusMessageParser
+ {
+ return this.parser as CompetitionStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts b/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts
new file mode 100644
index 0000000..6fbe482
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/InitCameraMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InitCameraMessageParser } from '../../parser';
+
+export class InitCameraMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InitCameraMessageParser);
+ }
+
+ public getParser(): InitCameraMessageParser
+ {
+ return this.parser as InitCameraMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts b/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts
new file mode 100644
index 0000000..7adb729
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/ThumbnailStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ThumbnailStatusMessageParser } from '../../parser';
+
+export class ThumbnailStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ThumbnailStatusMessageParser);
+ }
+
+ public getParser(): ThumbnailStatusMessageParser
+ {
+ return this.parser as ThumbnailStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/camera/index.ts b/packages/communication/src/messages/incoming/camera/index.ts
new file mode 100644
index 0000000..03df06b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/camera/index.ts
@@ -0,0 +1,7 @@
+export * from './CameraPublishStatusMessageEvent';
+export * from './CameraPurchaseOKMessageEvent';
+export * from './CameraSnapshotMessageEvent';
+export * from './CameraStorageUrlMessageEvent';
+export * from './CompetitionStatusMessageEvent';
+export * from './InitCameraMessageEvent';
+export * from './ThumbnailStatusMessageEvent';
diff --git a/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts
new file mode 100644
index 0000000..4f1da37
--- /dev/null
+++ b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CampaignCalendarDataMessageParser } from '../../parser';
+
+export class CampaignCalendarDataMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CampaignCalendarDataMessageParser);
+ }
+
+ public getParser(): CampaignCalendarDataMessageParser
+ {
+ return this.parser as CampaignCalendarDataMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts
new file mode 100644
index 0000000..70d660d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CampaignCalendarDoorOpenedMessageParser } from '../../parser';
+
+export class CampaignCalendarDoorOpenedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CampaignCalendarDoorOpenedMessageParser);
+ }
+
+ public getParser(): CampaignCalendarDoorOpenedMessageParser
+ {
+ return this.parser as CampaignCalendarDoorOpenedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/campaign/index.ts b/packages/communication/src/messages/incoming/campaign/index.ts
new file mode 100644
index 0000000..a6263ae
--- /dev/null
+++ b/packages/communication/src/messages/incoming/campaign/index.ts
@@ -0,0 +1,2 @@
+export * from './CampaignCalendarDataMessageEvent';
+export * from './CampaignCalendarDoorOpenedMessageEvent';
diff --git a/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts
new file mode 100644
index 0000000..efc19c3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/BonusRareInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BonusRareInfoMessageParser } from '../../parser';
+
+export class BonusRareInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BonusRareInfoMessageParser);
+ }
+
+ public getParser(): BonusRareInfoMessageParser
+ {
+ return this.parser as BonusRareInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts
new file mode 100644
index 0000000..33c7c6e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BuildersClubFurniCountMessageParser } from '../../parser';
+
+export class BuildersClubFurniCountMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BuildersClubFurniCountMessageParser);
+ }
+
+ public getParser(): BuildersClubFurniCountMessageParser
+ {
+ return this.parser as BuildersClubFurniCountMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts
new file mode 100644
index 0000000..0de5ba0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BuildersClubSubscriptionStatusMessageParser } from '../../parser';
+
+export class BuildersClubSubscriptionStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BuildersClubSubscriptionStatusMessageParser);
+ }
+
+ public getParser(): BuildersClubSubscriptionStatusMessageParser
+ {
+ return this.parser as BuildersClubSubscriptionStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts
new file mode 100644
index 0000000..cf70c1c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BundleDiscountRulesetMessageParser } from '../../parser';
+
+export class BundleDiscountRulesetMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BundleDiscountRulesetMessageParser);
+ }
+
+ public getParser(): BundleDiscountRulesetMessageParser
+ {
+ return this.parser as BundleDiscountRulesetMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts
new file mode 100644
index 0000000..1093a3c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/CatalogPageExpirationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CatalogPageExpirationParser } from '../../parser';
+
+export class CatalogPageExpirationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CatalogPageExpirationParser);
+ }
+
+ public getParser(): CatalogPageExpirationParser
+ {
+ return this.parser as CatalogPageExpirationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts
new file mode 100644
index 0000000..437fb8f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/CatalogPageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CatalogPageMessageParser } from '../../parser';
+
+export class CatalogPageMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CatalogPageMessageParser);
+ }
+
+ public getParser(): CatalogPageMessageParser
+ {
+ return this.parser as CatalogPageMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts
new file mode 100644
index 0000000..4868360
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CatalogPageWithEarliestExpiryMessageParser } from '../../parser';
+
+export class CatalogPageWithEarliestExpiryMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CatalogPageWithEarliestExpiryMessageParser);
+ }
+
+ public getParser(): CatalogPageWithEarliestExpiryMessageParser
+ {
+ return this.parser as CatalogPageWithEarliestExpiryMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts
new file mode 100644
index 0000000..4baad7a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/CatalogPagesListEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CatalogIndexMessageParser } from '../../parser';
+
+export class CatalogPagesListEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CatalogIndexMessageParser);
+ }
+
+ public getParser(): CatalogIndexMessageParser
+ {
+ return this.parser as CatalogIndexMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts
new file mode 100644
index 0000000..5b8cdab
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/CatalogPublishedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CatalogPublishedMessageParser } from '../../parser';
+
+export class CatalogPublishedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CatalogPublishedMessageParser);
+ }
+
+ public getParser(): CatalogPublishedMessageParser
+ {
+ return this.parser as CatalogPublishedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts b/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts
new file mode 100644
index 0000000..d604afd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/ClubGiftInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ClubGiftInfoParser } from '../../parser';
+
+export class ClubGiftInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ClubGiftInfoParser);
+ }
+
+ public getParser(): ClubGiftInfoParser
+ {
+ return this.parser as ClubGiftInfoParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts b/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts
new file mode 100644
index 0000000..08afb29
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/ClubGiftSelectedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ClubGiftSelectedParser } from '../../parser';
+
+export class ClubGiftSelectedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ClubGiftSelectedParser);
+ }
+
+ public getParser(): ClubGiftSelectedParser
+ {
+ return this.parser as ClubGiftSelectedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts
new file mode 100644
index 0000000..8e073bd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { DirectSMSClubBuyAvailableMessageParser } from '../../parser';
+
+export class DirectSMSClubBuyAvailableMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, DirectSMSClubBuyAvailableMessageParser);
+ }
+
+ public getParser(): DirectSMSClubBuyAvailableMessageParser
+ {
+ return this.parser as DirectSMSClubBuyAvailableMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts b/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts
new file mode 100644
index 0000000..a79da5d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/FireworkChargeDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FireworkChargeDataParser } from '../../parser';
+
+export class FireworkChargeDataEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FireworkChargeDataParser);
+ }
+
+ public getParser(): FireworkChargeDataParser
+ {
+ return this.parser as FireworkChargeDataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts b/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts
new file mode 100644
index 0000000..cb3d7dc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GiftReceiverNotFoundParser } from '../../parser';
+
+export class GiftReceiverNotFoundEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GiftReceiverNotFoundParser);
+ }
+
+ public getParser(): GiftReceiverNotFoundParser
+ {
+ return this.parser as GiftReceiverNotFoundParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts b/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts
new file mode 100644
index 0000000..16ef9e8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GiftWrappingConfigurationParser } from '../../parser';
+
+export class GiftWrappingConfigurationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GiftWrappingConfigurationParser);
+ }
+
+ public getParser(): GiftWrappingConfigurationParser
+ {
+ return this.parser as GiftWrappingConfigurationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts
new file mode 100644
index 0000000..331acc2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboClubExtendOfferMessageParser } from '../../parser';
+
+export class HabboClubExtendOfferMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboClubExtendOfferMessageParser);
+ }
+
+ public getParser(): HabboClubExtendOfferMessageParser
+ {
+ return this.parser as HabboClubExtendOfferMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts
new file mode 100644
index 0000000..dc92866
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/HabboClubOffersMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboClubOffersMessageParser } from '../../parser';
+
+export class HabboClubOffersMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboClubOffersMessageParser);
+ }
+
+ public getParser(): HabboClubOffersMessageParser
+ {
+ return this.parser as HabboClubOffersMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts
new file mode 100644
index 0000000..55bcaae
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IsOfferGiftableMessageParser } from '../../parser';
+
+export class IsOfferGiftableMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IsOfferGiftableMessageParser);
+ }
+
+ public getParser(): IsOfferGiftableMessageParser
+ {
+ return this.parser as IsOfferGiftableMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts b/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts
new file mode 100644
index 0000000..42791b5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LimitedEditionSoldOutParser } from '../../parser';
+
+export class LimitedEditionSoldOutEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LimitedEditionSoldOutParser);
+ }
+
+ public getParser(): LimitedEditionSoldOutParser
+ {
+ return this.parser as LimitedEditionSoldOutParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts
new file mode 100644
index 0000000..00ad392
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LimitedOfferAppearingNextMessageParser } from '../../parser';
+
+export class LimitedOfferAppearingNextMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LimitedOfferAppearingNextMessageParser);
+ }
+
+ public getParser(): LimitedOfferAppearingNextMessageParser
+ {
+ return this.parser as LimitedOfferAppearingNextMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts
new file mode 100644
index 0000000..14bd25b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NotEnoughBalanceMessageParser } from '../../parser';
+
+export class NotEnoughBalanceMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NotEnoughBalanceMessageParser);
+ }
+
+ public getParser(): NotEnoughBalanceMessageParser
+ {
+ return this.parser as NotEnoughBalanceMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts b/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts
new file mode 100644
index 0000000..0778949
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/ProductOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ProductOfferMessageParser } from '../../parser';
+
+export class ProductOfferEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ProductOfferMessageParser);
+ }
+
+ public getParser(): ProductOfferMessageParser
+ {
+ return this.parser as ProductOfferMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts
new file mode 100644
index 0000000..9fb533e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/PurchaseErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PurchaseErrorMessageParser } from '../../parser';
+
+export class PurchaseErrorMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PurchaseErrorMessageParser);
+ }
+
+ public getParser(): PurchaseErrorMessageParser
+ {
+ return this.parser as PurchaseErrorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts
new file mode 100644
index 0000000..399f822
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PurchaseNotAllowedMessageParser } from '../../parser';
+
+export class PurchaseNotAllowedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PurchaseNotAllowedMessageParser);
+ }
+
+ public getParser(): PurchaseNotAllowedMessageParser
+ {
+ return this.parser as PurchaseNotAllowedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts
new file mode 100644
index 0000000..9c2e6b5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/PurchaseOKMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PurchaseOKMessageParser } from '../../parser';
+
+export class PurchaseOKMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PurchaseOKMessageParser);
+ }
+
+ public getParser(): PurchaseOKMessageParser
+ {
+ return this.parser as PurchaseOKMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts b/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts
new file mode 100644
index 0000000..38c0b5f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomAdPurchaseInfoEventParser } from '../../parser';
+
+export class RoomAdPurchaseInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomAdPurchaseInfoEventParser);
+ }
+
+ public getParser(): RoomAdPurchaseInfoEventParser
+ {
+ return this.parser as RoomAdPurchaseInfoEventParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts
new file mode 100644
index 0000000..f39f26e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SeasonalCalendarDailyOfferMessageParser } from '../../parser';
+
+export class SeasonalCalendarDailyOfferMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SeasonalCalendarDailyOfferMessageParser);
+ }
+
+ public getParser(): SeasonalCalendarDailyOfferMessageParser
+ {
+ return this.parser as SeasonalCalendarDailyOfferMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts
new file mode 100644
index 0000000..0da7215
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SellablePetPalettesParser } from '../../parser';
+
+export class SellablePetPalettesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SellablePetPalettesParser);
+ }
+
+ public getParser(): SellablePetPalettesParser
+ {
+ return this.parser as SellablePetPalettesParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts b/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts
new file mode 100644
index 0000000..633484b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/TargetedOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TargetedOfferParser } from '../../parser';
+
+export class TargetedOfferEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TargetedOfferParser);
+ }
+
+ public getParser(): TargetedOfferParser
+ {
+ return this.parser as TargetedOfferParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts b/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts
new file mode 100644
index 0000000..2d7e743
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TargetedOfferNotFoundParser } from '../../parser';
+
+export class TargetedOfferNotFoundEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TargetedOfferNotFoundParser);
+ }
+
+ public getParser(): TargetedOfferNotFoundParser
+ {
+ return this.parser as TargetedOfferNotFoundParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts
new file mode 100644
index 0000000..b3d8e4b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { VoucherRedeemErrorMessageParser } from '../../parser';
+
+export class VoucherRedeemErrorMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, VoucherRedeemErrorMessageParser);
+ }
+
+ public getParser(): VoucherRedeemErrorMessageParser
+ {
+ return this.parser as VoucherRedeemErrorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts b/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts
new file mode 100644
index 0000000..6717243
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { VoucherRedeemOkMessageParser } from '../../parser';
+
+export class VoucherRedeemOkMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, VoucherRedeemOkMessageParser);
+ }
+
+ public getParser(): VoucherRedeemOkMessageParser
+ {
+ return this.parser as VoucherRedeemOkMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/catalog/index.ts b/packages/communication/src/messages/incoming/catalog/index.ts
new file mode 100644
index 0000000..c7a281c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/catalog/index.ts
@@ -0,0 +1,32 @@
+export * from './BonusRareInfoMessageEvent';
+export * from './BuildersClubFurniCountMessageEvent';
+export * from './BuildersClubSubscriptionStatusMessageEvent';
+export * from './BundleDiscountRulesetMessageEvent';
+export * from './CatalogPageExpirationEvent';
+export * from './CatalogPageMessageEvent';
+export * from './CatalogPagesListEvent';
+export * from './CatalogPageWithEarliestExpiryMessageEvent';
+export * from './CatalogPublishedMessageEvent';
+export * from './ClubGiftInfoEvent';
+export * from './ClubGiftSelectedEvent';
+export * from './DirectSMSClubBuyAvailableMessageEvent';
+export * from './FireworkChargeDataEvent';
+export * from './GiftReceiverNotFoundEvent';
+export * from './GiftWrappingConfigurationEvent';
+export * from './HabboClubExtendOfferMessageEvent';
+export * from './HabboClubOffersMessageEvent';
+export * from './IsOfferGiftableMessageEvent';
+export * from './LimitedEditionSoldOutEvent';
+export * from './LimitedOfferAppearingNextMessageEvent';
+export * from './NotEnoughBalanceMessageEvent';
+export * from './ProductOfferEvent';
+export * from './PurchaseErrorMessageEvent';
+export * from './PurchaseNotAllowedMessageEvent';
+export * from './PurchaseOKMessageEvent';
+export * from './RoomAdPurchaseInfoEvent';
+export * from './SeasonalCalendarDailyOfferMessageEvent';
+export * from './SellablePetPalettesMessageEvent';
+export * from './TargetedOfferEvent';
+export * from './TargetedOfferNotFoundEvent';
+export * from './VoucherRedeemErrorMessageEvent';
+export * from './VoucherRedeemOkMessageEvent';
diff --git a/packages/communication/src/messages/incoming/client/ClientPingEvent.ts b/packages/communication/src/messages/incoming/client/ClientPingEvent.ts
new file mode 100644
index 0000000..38b063f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/client/ClientPingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ClientPingParser } from '../../parser';
+
+export class ClientPingEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ClientPingParser);
+ }
+
+ public getParser(): ClientPingParser
+ {
+ return this.parser as ClientPingParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/client/index.ts b/packages/communication/src/messages/incoming/client/index.ts
new file mode 100644
index 0000000..deaf34e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/client/index.ts
@@ -0,0 +1 @@
+export * from './ClientPingEvent';
diff --git a/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts b/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts
new file mode 100644
index 0000000..e38ab0e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CompetitionEntrySubmitResultMessageParser } from '../../parser';
+
+export class CompetitionEntrySubmitResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CompetitionEntrySubmitResultMessageParser);
+ }
+
+ public getParser(): CompetitionEntrySubmitResultMessageParser
+ {
+ return this.parser as CompetitionEntrySubmitResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts b/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts
new file mode 100644
index 0000000..a1b2b77
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CompetitionVotingInfoMessageParser } from '../../parser';
+
+export class CompetitionVotingInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CompetitionVotingInfoMessageParser);
+ }
+
+ public getParser(): CompetitionVotingInfoMessageParser
+ {
+ return this.parser as CompetitionVotingInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts b/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts
new file mode 100644
index 0000000..9842f77
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CurrentTimingCodeMessageParser } from '../../parser';
+
+export class CurrentTimingCodeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CurrentTimingCodeMessageParser);
+ }
+
+ public getParser(): CurrentTimingCodeMessageParser
+ {
+ return this.parser as CurrentTimingCodeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts b/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts
new file mode 100644
index 0000000..331ee20
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IsUserPartOfCompetitionMessageParser } from '../../parser';
+
+export class IsUserPartOfCompetitionMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IsUserPartOfCompetitionMessageParser);
+ }
+
+ public getParser(): IsUserPartOfCompetitionMessageParser
+ {
+ return this.parser as IsUserPartOfCompetitionMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts b/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts
new file mode 100644
index 0000000..000cb7d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NoOwnedRoomsAlertMessageParser } from '../../parser';
+
+export class NoOwnedRoomsAlertMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NoOwnedRoomsAlertMessageParser);
+ }
+
+ public getParser(): NoOwnedRoomsAlertMessageParser
+ {
+ return this.parser as NoOwnedRoomsAlertMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts b/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts
new file mode 100644
index 0000000..5691262
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/SecondsUntilMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SecondsUntilMessageParser } from '../../parser';
+
+export class SecondsUntilMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SecondsUntilMessageParser);
+ }
+
+ public getParser(): SecondsUntilMessageParser
+ {
+ return this.parser as SecondsUntilMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/competition/index.ts b/packages/communication/src/messages/incoming/competition/index.ts
new file mode 100644
index 0000000..7c2b70a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/competition/index.ts
@@ -0,0 +1,6 @@
+export * from './CompetitionEntrySubmitResultEvent';
+export * from './CompetitionVotingInfoMessageEvent';
+export * from './CurrentTimingCodeMessageEvent';
+export * from './IsUserPartOfCompetitionMessageEvent';
+export * from './NoOwnedRoomsAlertMessageEvent';
+export * from './SecondsUntilMessageEvent';
diff --git a/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts
new file mode 100644
index 0000000..d186c19
--- /dev/null
+++ b/packages/communication/src/messages/incoming/crafting/CraftableProductsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CraftableProductsMessageParser } from '../../parser';
+
+export class CraftableProductsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CraftableProductsMessageParser);
+ }
+
+ public getParser(): CraftableProductsMessageParser
+ {
+ return this.parser as CraftableProductsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts
new file mode 100644
index 0000000..c7ebd4a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/crafting/CraftingRecipeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CraftingRecipeMessageParser } from '../../parser';
+
+export class CraftingRecipeEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CraftingRecipeMessageParser);
+ }
+
+ public getParser(): CraftingRecipeMessageParser
+ {
+ return this.parser as CraftingRecipeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts
new file mode 100644
index 0000000..b8497c2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CraftingRecipesAvailableMessageParser } from '../../parser';
+
+export class CraftingRecipesAvailableEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CraftingRecipesAvailableMessageParser);
+ }
+
+ public getParser(): CraftingRecipesAvailableMessageParser
+ {
+ return this.parser as CraftingRecipesAvailableMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts b/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts
new file mode 100644
index 0000000..91ec874
--- /dev/null
+++ b/packages/communication/src/messages/incoming/crafting/CraftingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CraftingResultMessageParser } from '../../parser';
+
+export class CraftingResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CraftingResultMessageParser);
+ }
+
+ public getParser(): CraftingResultMessageParser
+ {
+ return this.parser as CraftingResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/crafting/index.ts b/packages/communication/src/messages/incoming/crafting/index.ts
new file mode 100644
index 0000000..cf26449
--- /dev/null
+++ b/packages/communication/src/messages/incoming/crafting/index.ts
@@ -0,0 +1,4 @@
+export * from './CraftableProductsEvent';
+export * from './CraftingRecipeEvent';
+export * from './CraftingRecipesAvailableEvent';
+export * from './CraftingResultEvent';
diff --git a/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts b/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts
new file mode 100644
index 0000000..31bc346
--- /dev/null
+++ b/packages/communication/src/messages/incoming/desktop/DesktopViewEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { DesktopViewParser } from '../../parser';
+
+export class DesktopViewEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, DesktopViewParser);
+ }
+
+ public getParser(): DesktopViewParser
+ {
+ return this.parser as DesktopViewParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/desktop/index.ts b/packages/communication/src/messages/incoming/desktop/index.ts
new file mode 100644
index 0000000..2c0758c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/desktop/index.ts
@@ -0,0 +1 @@
+export * from './DesktopViewEvent';
diff --git a/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts
new file mode 100644
index 0000000..a87e4e8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/AcceptFriendResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AcceptFriendResultParser } from '../../parser';
+
+export class AcceptFriendResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AcceptFriendResultParser);
+ }
+
+ public getParser(): AcceptFriendResultParser
+ {
+ return this.parser as AcceptFriendResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts
new file mode 100644
index 0000000..70cd013
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FindFriendsProcessResultParser } from '../../parser';
+
+export class FindFriendsProcessResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FindFriendsProcessResultParser);
+ }
+
+ public getParser(): FindFriendsProcessResultParser
+ {
+ return this.parser as FindFriendsProcessResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts b/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts
new file mode 100644
index 0000000..2e6eb5e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FollowFriendFailedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FollowFriendFailedParser } from '../../parser';
+
+export class FollowFriendFailedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FollowFriendFailedParser);
+ }
+
+ public getParser(): FollowFriendFailedParser
+ {
+ return this.parser as FollowFriendFailedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts
new file mode 100644
index 0000000..2ddc473
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FriendListFragmentEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FriendListFragmentParser } from '../../parser';
+
+export class FriendListFragmentEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FriendListFragmentParser);
+ }
+
+ public getParser(): FriendListFragmentParser
+ {
+ return this.parser as FriendListFragmentParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts
new file mode 100644
index 0000000..b5a1bda
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FriendListUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FriendListUpdateParser } from '../../parser';
+
+export class FriendListUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FriendListUpdateParser);
+ }
+
+ public getParser(): FriendListUpdateParser
+ {
+ return this.parser as FriendListUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts
new file mode 100644
index 0000000..0f5f7e3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FriendNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FriendNotificationParser } from '../../parser';
+
+export class FriendNotificationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FriendNotificationParser);
+ }
+
+ public getParser(): FriendNotificationParser
+ {
+ return this.parser as FriendNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts b/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts
new file mode 100644
index 0000000..5ddf0e0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/FriendRequestsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FriendRequestsParser } from '../../parser';
+
+export class FriendRequestsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FriendRequestsParser);
+ }
+
+ public getParser(): FriendRequestsParser
+ {
+ return this.parser as FriendRequestsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts b/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts
new file mode 100644
index 0000000..ed49241
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/HabboSearchResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboSearchResultParser } from '../../parser';
+
+export class HabboSearchResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboSearchResultParser);
+ }
+
+ public getParser(): HabboSearchResultParser
+ {
+ return this.parser as HabboSearchResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts
new file mode 100644
index 0000000..61ef0db
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/InstantMessageErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InstantMessageErrorParser } from '../../parser';
+
+export class InstantMessageErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InstantMessageErrorParser);
+ }
+
+ public getParser(): InstantMessageErrorParser
+ {
+ return this.parser as InstantMessageErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts
new file mode 100644
index 0000000..bbeb6a7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/MessageErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MessageErrorParser } from '../../parser';
+
+export class MessageErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MessageErrorParser);
+ }
+
+ public getParser(): MessageErrorParser
+ {
+ return this.parser as MessageErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts b/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts
new file mode 100644
index 0000000..da8320c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/MessengerInitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MessengerInitParser } from '../../parser';
+
+export class MessengerInitEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MessengerInitParser);
+ }
+
+ public getParser(): MessengerInitParser
+ {
+ return this.parser as MessengerInitParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts b/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts
new file mode 100644
index 0000000..35bc9eb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/MiniMailNewMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MiniMailNewMessageParser } from '../../parser';
+
+export class MiniMailNewMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MiniMailNewMessageParser);
+ }
+
+ public getParser(): MiniMailNewMessageParser
+ {
+ return this.parser as MiniMailNewMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts b/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts
new file mode 100644
index 0000000..8a78238
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MiniMailUnreadCountParser } from '../../parser';
+
+export class MiniMailUnreadCountEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MiniMailUnreadCountParser);
+ }
+
+ public getParser(): MiniMailUnreadCountParser
+ {
+ return this.parser as MiniMailUnreadCountParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts b/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts
new file mode 100644
index 0000000..c88687f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/NewConsoleMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NewConsoleMessageParser } from '../../parser';
+
+export class NewConsoleMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NewConsoleMessageParser);
+ }
+
+ public getParser(): NewConsoleMessageParser
+ {
+ return this.parser as NewConsoleMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts b/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts
new file mode 100644
index 0000000..58a875f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/NewFriendRequestEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NewFriendRequestParser } from '../../parser';
+
+export class NewFriendRequestEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NewFriendRequestParser);
+ }
+
+ public getParser(): NewFriendRequestParser
+ {
+ return this.parser as NewFriendRequestParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts b/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts
new file mode 100644
index 0000000..80f56d9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/RoomInviteErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomInviteErrorParser } from '../../parser';
+
+export class RoomInviteErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomInviteErrorParser);
+ }
+
+ public getParser(): RoomInviteErrorParser
+ {
+ return this.parser as RoomInviteErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts b/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts
new file mode 100644
index 0000000..26faa00
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/RoomInviteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomInviteParser } from '../../parser';
+
+export class RoomInviteEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomInviteParser);
+ }
+
+ public getParser(): RoomInviteParser
+ {
+ return this.parser as RoomInviteParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/friendlist/index.ts b/packages/communication/src/messages/incoming/friendlist/index.ts
new file mode 100644
index 0000000..47c991c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/friendlist/index.ts
@@ -0,0 +1,17 @@
+export * from './AcceptFriendResultEvent';
+export * from './FindFriendsProcessResultEvent';
+export * from './FollowFriendFailedEvent';
+export * from './FriendListFragmentEvent';
+export * from './FriendListUpdateEvent';
+export * from './FriendNotificationEvent';
+export * from './FriendRequestsEvent';
+export * from './HabboSearchResultEvent';
+export * from './InstantMessageErrorEvent';
+export * from './MessageErrorEvent';
+export * from './MessengerInitEvent';
+export * from './MiniMailNewMessageEvent';
+export * from './MiniMailUnreadCountEvent';
+export * from './NewConsoleMessageEvent';
+export * from './NewFriendRequestEvent';
+export * from './RoomInviteErrorEvent';
+export * from './RoomInviteEvent';
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts
new file mode 100644
index 0000000..b7789f7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2AccountGameStatusMessageParser } from '../../../parser';
+
+export class Game2AccountGameStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2AccountGameStatusMessageParser);
+ }
+
+ public getParser(): Game2AccountGameStatusMessageParser
+ {
+ return this.parser as Game2AccountGameStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts
new file mode 100644
index 0000000..0707c99
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2GameDirectoryStatusMessageParser } from '../../../parser';
+
+export class Game2GameDirectoryStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2GameDirectoryStatusMessageParser);
+ }
+
+ public getParser(): Game2GameDirectoryStatusMessageParser
+ {
+ return this.parser as Game2GameDirectoryStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts
new file mode 100644
index 0000000..de7ef5d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2InArenaQueueMessageParser } from '../../../parser';
+
+export class Game2InArenaQueueMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2InArenaQueueMessageParser);
+ }
+
+ public getParser(): Game2InArenaQueueMessageParser
+ {
+ return this.parser as Game2InArenaQueueMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts
new file mode 100644
index 0000000..134f7d2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2JoiningGameFailedMessageParser } from '../../../parser';
+
+export class Game2JoiningGameFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2JoiningGameFailedMessageParser);
+ }
+
+ public getParser(): Game2JoiningGameFailedMessageParser
+ {
+ return this.parser as Game2JoiningGameFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts
new file mode 100644
index 0000000..f52bc24
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2StartingGameFailedMessageParser } from '../../../parser';
+
+export class Game2StartingGameFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2StartingGameFailedMessageParser);
+ }
+
+ public getParser(): Game2StartingGameFailedMessageParser
+ {
+ return this.parser as Game2StartingGameFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts
new file mode 100644
index 0000000..b12d81b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2InArenaQueueMessageParser, Game2StopCounterMessageParser } from '../../../parser';
+
+export class Game2StopCounterMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2StopCounterMessageParser);
+ }
+
+ public getParser(): Game2InArenaQueueMessageParser
+ {
+ return this.parser as Game2InArenaQueueMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts
new file mode 100644
index 0000000..b949573
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2UserLeftGameMessageParser } from '../../../parser';
+
+export class Game2UserLeftGameMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2UserLeftGameMessageParser);
+ }
+
+ public getParser(): Game2UserLeftGameMessageParser
+ {
+ return this.parser as Game2UserLeftGameMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/directory/index.ts b/packages/communication/src/messages/incoming/game/directory/index.ts
new file mode 100644
index 0000000..8724315
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/directory/index.ts
@@ -0,0 +1,7 @@
+export * from './Game2AccountGameStatusMessageEvent';
+export * from './Game2GameDirectoryStatusMessageEvent';
+export * from './Game2InArenaQueueMessageEvent';
+export * from './Game2JoiningGameFailedMessageEvent';
+export * from './Game2StartingGameFailedMessageEvent';
+export * from './Game2StopCounterMessageEvent';
+export * from './Game2UserLeftGameMessageEvent';
diff --git a/packages/communication/src/messages/incoming/game/index.ts b/packages/communication/src/messages/incoming/game/index.ts
new file mode 100644
index 0000000..779f388
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/index.ts
@@ -0,0 +1,3 @@
+export * from './directory';
+export * from './lobby';
+export * from './score';
diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts
new file mode 100644
index 0000000..55223fc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementResolutionCompletedMessageParser } from '../../../parser';
+
+export class AchievementResolutionCompletedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementResolutionCompletedMessageParser);
+ }
+
+ public getParser(): AchievementResolutionCompletedMessageParser
+ {
+ return this.parser as AchievementResolutionCompletedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts
new file mode 100644
index 0000000..03a0b43
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementResolutionProgressMessageParser } from '../../../parser';
+
+export class AchievementResolutionProgressMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementResolutionProgressMessageParser);
+ }
+
+ public getParser(): AchievementResolutionProgressMessageParser
+ {
+ return this.parser as AchievementResolutionProgressMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts
new file mode 100644
index 0000000..fffd7ac
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementResolutionsMessageParser } from '../../../parser';
+
+export class AchievementResolutionsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementResolutionsMessageParser);
+ }
+
+ public getParser(): AchievementResolutionsMessageParser
+ {
+ return this.parser as AchievementResolutionsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts
new file mode 100644
index 0000000..cb6cebd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GameAchievementsMessageParser } from '../../../parser';
+
+export class GameAchievementsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GameAchievementsMessageParser);
+ }
+
+ public getParser(): GameAchievementsMessageParser
+ {
+ return this.parser as GameAchievementsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts
new file mode 100644
index 0000000..53c1dc8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/GameInviteMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GameInviteMessageParser } from '../../../parser';
+
+export class GameInviteMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GameInviteMessageParser);
+ }
+
+ public getParser(): GameInviteMessageParser
+ {
+ return this.parser as GameInviteMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts
new file mode 100644
index 0000000..c628ece
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/GameListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GameListMessageParser } from '../../../parser';
+
+export class GameListMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GameListMessageParser);
+ }
+
+ public getParser(): GameListMessageParser
+ {
+ return this.parser as GameListMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts
new file mode 100644
index 0000000..a75e148
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/GameStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GameStatusMessageParser } from '../../../parser';
+
+export class GameStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GameStatusMessageParser);
+ }
+
+ public getParser(): GameStatusMessageParser
+ {
+ return this.parser as GameStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts
new file mode 100644
index 0000000..56dc1f6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { JoinedQueueMessageParser } from '../../../parser';
+
+export class JoinedQueueMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, JoinedQueueMessageParser);
+ }
+
+ public getParser(): JoinedQueueMessageParser
+ {
+ return this.parser as JoinedQueueMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts
new file mode 100644
index 0000000..7eb147b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { JoiningQueueFailedMessageParser } from '../../../parser';
+
+export class JoiningQueueFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, JoiningQueueFailedMessageParser);
+ }
+
+ public getParser(): JoiningQueueFailedMessageParser
+ {
+ return this.parser as JoiningQueueFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts
new file mode 100644
index 0000000..8f970ed
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/LeftQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LeftQueueMessageParser } from '../../../parser';
+
+export class LeftQueueMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LeftQueueMessageParser);
+ }
+
+ public getParser(): LeftQueueMessageParser
+ {
+ return this.parser as LeftQueueMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts
new file mode 100644
index 0000000..73ba11c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/LoadGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LoadGameMessageParser } from '../../../parser';
+
+export class LoadGameMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LoadGameMessageParser);
+ }
+
+ public getParser(): LoadGameMessageParser
+ {
+ return this.parser as LoadGameMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts b/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts
new file mode 100644
index 0000000..a2abde1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/LoadGameUrlEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LoadGameUrlParser } from '../../../parser';
+
+export class LoadGameUrlEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LoadGameUrlParser);
+ }
+
+ public getParser(): LoadGameUrlParser
+ {
+ return this.parser as LoadGameUrlParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts
new file mode 100644
index 0000000..7681a28
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/UnloadGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UnloadGameMessageParser } from '../../../parser';
+
+export class UnloadGameMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UnloadGameMessageParser);
+ }
+
+ public getParser(): UnloadGameMessageParser
+ {
+ return this.parser as UnloadGameMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts b/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts
new file mode 100644
index 0000000..b89ef68
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserGameAchievementsMessageParser } from '../../../parser';
+
+export class UserGameAchievementsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserGameAchievementsMessageParser);
+ }
+
+ public getParser(): UserGameAchievementsMessageParser
+ {
+ return this.parser as UserGameAchievementsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/lobby/index.ts b/packages/communication/src/messages/incoming/game/lobby/index.ts
new file mode 100644
index 0000000..13421db
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/lobby/index.ts
@@ -0,0 +1,14 @@
+export * from './AchievementResolutionCompletedMessageEvent';
+export * from './AchievementResolutionProgressMessageEvent';
+export * from './AchievementResolutionsMessageEvent';
+export * from './GameAchievementsMessageEvent';
+export * from './GameInviteMessageEvent';
+export * from './GameListMessageEvent';
+export * from './GameStatusMessageEvent';
+export * from './JoinedQueueMessageEvent';
+export * from './JoiningQueueFailedMessageEvent';
+export * from './LeftQueueMessageEvent';
+export * from './LoadGameMessageEvent';
+export * from './LoadGameUrlEvent';
+export * from './UnloadGameMessageEvent';
+export * from './UserGameAchievementsMessageEvent';
diff --git a/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts
new file mode 100644
index 0000000..bd2edf3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2WeeklyLeaderboardParser } from '../../../parser';
+
+export class Game2WeeklyFriendsLeaderboardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2WeeklyLeaderboardParser);
+ }
+
+ public getParser(): Game2WeeklyLeaderboardParser
+ {
+ return this.parser as Game2WeeklyLeaderboardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts
new file mode 100644
index 0000000..1a18abd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2WeeklyLeaderboardParser } from '../../../parser';
+
+export class Game2WeeklyLeaderboardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2WeeklyLeaderboardParser);
+ }
+
+ public getParser(): Game2WeeklyLeaderboardParser
+ {
+ return this.parser as Game2WeeklyLeaderboardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts
new file mode 100644
index 0000000..280cccf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2WeeklyLeaderboardParser } from '../../../parser';
+
+export class WeeklyCompetitiveFriendsLeaderboardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2WeeklyLeaderboardParser);
+ }
+
+ public getParser(): Game2WeeklyLeaderboardParser
+ {
+ return this.parser as Game2WeeklyLeaderboardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts
new file mode 100644
index 0000000..bcc73bf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { Game2WeeklyLeaderboardParser } from '../../../parser';
+
+export class WeeklyCompetitiveLeaderboardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, Game2WeeklyLeaderboardParser);
+ }
+
+ public getParser(): Game2WeeklyLeaderboardParser
+ {
+ return this.parser as Game2WeeklyLeaderboardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts
new file mode 100644
index 0000000..7aa8531
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WeeklyGameRewardParser } from '../../../parser';
+
+export class WeeklyGameRewardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WeeklyGameRewardParser);
+ }
+
+ public getParser(): WeeklyGameRewardParser
+ {
+ return this.parser as WeeklyGameRewardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts
new file mode 100644
index 0000000..5a18a10
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WeeklyGameRewardWinnersParser } from '../../../parser';
+
+export class WeeklyGameRewardWinnersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WeeklyGameRewardWinnersParser);
+ }
+
+ public getParser(): WeeklyGameRewardWinnersParser
+ {
+ return this.parser as WeeklyGameRewardWinnersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/game/score/index.ts b/packages/communication/src/messages/incoming/game/score/index.ts
new file mode 100644
index 0000000..546b5a3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/game/score/index.ts
@@ -0,0 +1,6 @@
+export * from './Game2WeeklyFriendsLeaderboardEvent';
+export * from './Game2WeeklyLeaderboardEvent';
+export * from './WeeklyCompetitiveFriendsLeaderboardEvent';
+export * from './WeeklyCompetitiveLeaderboardEvent';
+export * from './WeeklyGameRewardEvent';
+export * from './WeeklyGameRewardWinnersEvent';
diff --git a/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts b/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts
new file mode 100644
index 0000000..9ac6bc4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/generic/GenericErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GenericErrorParser } from '../../parser';
+
+export class GenericErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GenericErrorParser);
+ }
+
+ public getParser(): GenericErrorParser
+ {
+ return this.parser as GenericErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/generic/index.ts b/packages/communication/src/messages/incoming/generic/index.ts
new file mode 100644
index 0000000..08ed38e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/generic/index.ts
@@ -0,0 +1 @@
+export * from './GenericErrorEvent';
diff --git a/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts
new file mode 100644
index 0000000..40a6832
--- /dev/null
+++ b/packages/communication/src/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PhoneCollectionStateParser } from '../../parser';
+
+export class PhoneCollectionStateMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PhoneCollectionStateParser);
+ }
+
+ public getParser(): PhoneCollectionStateParser
+ {
+ return this.parser as PhoneCollectionStateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts
new file mode 100644
index 0000000..08999f2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TryPhoneNumberResultParser } from '../../parser';
+
+export class TryPhoneNumberResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TryPhoneNumberResultParser);
+ }
+
+ public getParser(): TryPhoneNumberResultParser
+ {
+ return this.parser as TryPhoneNumberResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts b/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts
new file mode 100644
index 0000000..5ad52a2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TryVerificationCodeResultParser } from '../../parser';
+
+export class TryVerificationCodeResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TryVerificationCodeResultParser);
+ }
+
+ public getParser(): TryVerificationCodeResultParser
+ {
+ return this.parser as TryVerificationCodeResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/gifts/index.ts b/packages/communication/src/messages/incoming/gifts/index.ts
new file mode 100644
index 0000000..ee498b9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/gifts/index.ts
@@ -0,0 +1,3 @@
+export * from './PhoneCollectionStateMessageEvent';
+export * from './TryPhoneNumberResultMessageEvent';
+export * from './TryVerificationCodeResultMessageEvent';
diff --git a/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts b/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts
new file mode 100644
index 0000000..b4bebd7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupBadgePartsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupBadgePartsParser } from '../../parser';
+
+export class GroupBadgePartsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupBadgePartsParser);
+ }
+
+ public getParser(): GroupBadgePartsParser
+ {
+ return this.parser as GroupBadgePartsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts b/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts
new file mode 100644
index 0000000..8452ad6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupBuyDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupBuyDataParser } from '../../parser';
+
+export class GroupBuyDataEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupBuyDataParser);
+ }
+
+ public getParser(): GroupBuyDataParser
+ {
+ return this.parser as GroupBuyDataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts b/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts
new file mode 100644
index 0000000..f85f919
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupConfirmMemberRemoveParser } from '../../parser';
+
+export class GroupConfirmMemberRemoveEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupConfirmMemberRemoveParser);
+ }
+
+ public getParser(): GroupConfirmMemberRemoveParser
+ {
+ return this.parser as GroupConfirmMemberRemoveParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts b/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts
new file mode 100644
index 0000000..7ede203
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupInformationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupInformationParser } from '../../parser';
+
+export class GroupInformationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupInformationParser);
+ }
+
+ public getParser(): GroupInformationParser
+ {
+ return this.parser as GroupInformationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts b/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts
new file mode 100644
index 0000000..660561b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupMembersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupMembersParser } from '../../parser';
+
+export class GroupMembersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupMembersParser);
+ }
+
+ public getParser(): GroupMembersParser
+ {
+ return this.parser as GroupMembersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts b/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts
new file mode 100644
index 0000000..469b417
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupPurchasedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupPurchasedParser } from '../../parser';
+
+export class GroupPurchasedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupPurchasedParser);
+ }
+
+ public getParser(): GroupPurchasedParser
+ {
+ return this.parser as GroupPurchasedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts b/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts
new file mode 100644
index 0000000..b8f895a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/GroupSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupSettingsParser } from '../../parser';
+
+export class GroupSettingsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupSettingsParser);
+ }
+
+ public getParser(): GroupSettingsParser
+ {
+ return this.parser as GroupSettingsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts b/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts
new file mode 100644
index 0000000..ff2090b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboGroupDeactivatedMessageParser } from '../../parser';
+
+export class HabboGroupDeactivatedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboGroupDeactivatedMessageParser);
+ }
+
+ public getParser(): HabboGroupDeactivatedMessageParser
+ {
+ return this.parser as HabboGroupDeactivatedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/group/index.ts b/packages/communication/src/messages/incoming/group/index.ts
new file mode 100644
index 0000000..5fc4853
--- /dev/null
+++ b/packages/communication/src/messages/incoming/group/index.ts
@@ -0,0 +1,8 @@
+export * from './GroupBadgePartsEvent';
+export * from './GroupBuyDataEvent';
+export * from './GroupConfirmMemberRemoveEvent';
+export * from './GroupInformationEvent';
+export * from './GroupMembersEvent';
+export * from './GroupPurchasedEvent';
+export * from './GroupSettingsEvent';
+export * from './HabboGroupDeactivatedMessageEvent';
diff --git a/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts
new file mode 100644
index 0000000..9bd073b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/ForumDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ForumDataMessageParser } from '../../parser';
+
+export class ForumDataMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ForumDataMessageParser);
+ }
+
+ public getParser(): ForumDataMessageParser
+ {
+ return this.parser as ForumDataMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts
new file mode 100644
index 0000000..7d8553f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/ForumsListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GetForumsListMessageParser } from '../../parser';
+
+export class ForumsListMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GetForumsListMessageParser);
+ }
+
+ public getParser(): GetForumsListMessageParser
+ {
+ return this.parser as GetForumsListMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts b/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts
new file mode 100644
index 0000000..171685b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/GuildForumThreadsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuildForumThreadsParser } from '../../parser';
+
+export class GuildForumThreadsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuildForumThreadsParser);
+ }
+
+ public getParser(): GuildForumThreadsParser
+ {
+ return this.parser as GuildForumThreadsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts
new file mode 100644
index 0000000..76bc553
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/PostMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PostMessageMessageParser } from '../../parser';
+
+export class PostMessageMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PostMessageMessageParser);
+ }
+
+ public getParser(): PostMessageMessageParser
+ {
+ return this.parser as PostMessageMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts
new file mode 100644
index 0000000..caa22c8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/PostThreadMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PostThreadMessageParser } from '../../parser';
+
+export class PostThreadMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PostThreadMessageParser);
+ }
+
+ public getParser(): PostThreadMessageParser
+ {
+ return this.parser as PostThreadMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts
new file mode 100644
index 0000000..0665d88
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ThreadMessagesMessageParser } from '../../parser';
+
+export class ThreadMessagesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ThreadMessagesMessageParser);
+ }
+
+ public getParser(): ThreadMessagesMessageParser
+ {
+ return this.parser as ThreadMessagesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts
new file mode 100644
index 0000000..2284ccc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UnreadForumsCountMessageParser } from '../../parser';
+
+export class UnreadForumsCountMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UnreadForumsCountMessageParser);
+ }
+
+ public getParser(): UnreadForumsCountMessageParser
+ {
+ return this.parser as UnreadForumsCountMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts
new file mode 100644
index 0000000..b7a9684
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/UpdateMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UpdateMessageMessageParser } from '../../parser';
+
+export class UpdateMessageMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UpdateMessageMessageParser);
+ }
+
+ public getParser(): UpdateMessageMessageParser
+ {
+ return this.parser as UpdateMessageMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts b/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts
new file mode 100644
index 0000000..2a834c5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/UpdateThreadMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UpdateThreadMessageParser } from '../../parser';
+
+export class UpdateThreadMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UpdateThreadMessageParser);
+ }
+
+ public getParser(): UpdateThreadMessageParser
+ {
+ return this.parser as UpdateThreadMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/groupforums/index.ts b/packages/communication/src/messages/incoming/groupforums/index.ts
new file mode 100644
index 0000000..53566b9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/groupforums/index.ts
@@ -0,0 +1,9 @@
+export * from './ForumDataMessageEvent';
+export * from './ForumsListMessageEvent';
+export * from './GuildForumThreadsEvent';
+export * from './PostMessageMessageEvent';
+export * from './PostThreadMessageEvent';
+export * from './ThreadMessagesMessageEvent';
+export * from './UnreadForumsCountMessageEvent';
+export * from './UpdateMessageMessageEvent';
+export * from './UpdateThreadMessageEvent';
diff --git a/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts b/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts
new file mode 100644
index 0000000..3256284
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CompleteDiffieHandshakeParser } from '../../parser';
+
+export class CompleteDiffieHandshakeEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CompleteDiffieHandshakeParser);
+ }
+
+ public getParser(): CompleteDiffieHandshakeParser
+ {
+ return this.parser as CompleteDiffieHandshakeParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts
new file mode 100644
index 0000000..dcd50df
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEnum.ts
@@ -0,0 +1,46 @@
+export class DisconnectReasonEnum
+{
+ public static readonly LOGOUT: number = 0;
+ public static readonly JUST_BANNED: number = 1;
+ public static readonly CONCURRENT_LOGIN: number = 2;
+ public static readonly CONNECTION_LOST_TO_PEER: number = 3;
+ public static readonly AVATAR_IDENTITY_CHANGE: number = 4;
+ public static readonly REMOVE_FURNITURE_TOOL: number = 5;
+ public static readonly STILL_BANNED: number = 10;
+ public static readonly DUAL_LOGIN_BY_USERID: number = 11;
+ public static readonly HOTEL_CLOSED: number = 12;
+ public static readonly DUAL_LOGIN_BY_IP: number = 13;
+ public static readonly PEER_CONNECTION_MISSING: number = 16;
+ public static readonly NO_LOGIN_PERMISSION: number = 17;
+ public static readonly DUPLICATE_CONNECTION: number = 18;
+ public static readonly HOTEL_CLOSING: number = 19;
+ public static readonly INCORRECT_PASSWORD: number = 20;
+ public static readonly INVALID_LOGIN_TICKET: number = 22;
+ public static readonly VERSION_CHECK_URL: number = 23;
+ public static readonly VERSION_CHECK_PROPERTY: number = 24;
+ public static readonly VERSION_CHECK_MACHINE_ID: number = 25;
+ public static readonly NO_MESSENGER_SESSION: number = 26;
+ public static readonly USER_NOT_FOUND: number = 27;
+ public static readonly CRYPTO_NOT_INITIALIZED: number = 28;
+ public static readonly DEV_CRYPTO_NOT_ALLOWED: number = 29;
+ public static readonly DUPLICATE_UUID_DETECTED: number = 100;
+ public static readonly OLD_SESSION_IN_PROXY: number = 101;
+ public static readonly PUBLIC_KEY_NOT_NUMERIC: number = 102;
+ public static readonly PUBLIC_KEY_TOO_SHORT: number = 103;
+ public static readonly SOCKET_READ_GENERIC: number = 104;
+ public static readonly SOCKET_READ_FIRST_BYTE: number = 105;
+ public static readonly SOCKET_READ_LENGTH: number = 106;
+ public static readonly SOCKET_READ_BODY: number = 107;
+ public static readonly SOCKET_READ_POLICY: number = 108;
+ public static readonly SOCKET_IO_EXCEPTION: number = 109;
+ public static readonly SOCKET_WRONG_CRYPTO: number = 110;
+ public static readonly PROXY_RUNTIME_EXCEPTION: number = 111;
+ public static readonly IDLE_CONNECTION: number = 112;
+ public static readonly PONG_TIMEOUT: number = 113;
+ public static readonly IDLE_CONNECTION_NOT_AUTH: number = 114;
+ public static readonly IDLE_CONNECTION_NO_USER_ID: number = 115;
+ public static readonly WRITE_CLOSED_CHANNEL: number = 116;
+ public static readonly SOCKET_WRITE_EXCEPTION_1: number = 117;
+ public static readonly SOCKET_WRITE_EXCEPTION_2: number = 118;
+ public static readonly SOCKET_WRITE_EXCEPTION_3: number = 119;
+}
diff --git a/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts
new file mode 100644
index 0000000..07be776
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/DisconnectReasonEvent.ts
@@ -0,0 +1,33 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { DisconnectReasonParser } from '../../parser';
+import { DisconnectReasonEnum } from './DisconnectReasonEnum';
+
+export class DisconnectReasonEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, DisconnectReasonParser);
+ }
+
+ public getParser(): DisconnectReasonParser
+ {
+ return this.parser as DisconnectReasonParser;
+ }
+
+ public get reasonString(): string
+ {
+ switch(this.getParser().reason)
+ {
+ case DisconnectReasonEnum.JUST_BANNED:
+ case DisconnectReasonEnum.STILL_BANNED:
+ return 'banned';
+ case DisconnectReasonEnum.CONCURRENT_LOGIN:
+ return 'concurrentlogin';
+ case DisconnectReasonEnum.INCORRECT_PASSWORD:
+ return 'incorrectpassword';
+ default:
+ return 'logout';
+ }
+ }
+}
diff --git a/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts b/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts
new file mode 100644
index 0000000..b9c74b8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/IdentityAccountsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IdentityAccountsParser } from '../../parser';
+
+export class IdentityAccountsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IdentityAccountsParser);
+ }
+
+ public getParser(): IdentityAccountsParser
+ {
+ return this.parser as IdentityAccountsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts b/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts
new file mode 100644
index 0000000..87a57dc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/InitDiffieHandshakeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InitDiffieHandshakeParser } from '../../parser';
+
+export class InitDiffieHandshakeEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InitDiffieHandshakeParser);
+ }
+
+ public getParser(): InitDiffieHandshakeParser
+ {
+ return this.parser as InitDiffieHandshakeParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts b/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts
new file mode 100644
index 0000000..72fc16e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/NoobnessLevelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NoobnessLevelMessageParser } from '../../parser';
+
+export class NoobnessLevelMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NoobnessLevelMessageParser);
+ }
+
+ public getParser(): NoobnessLevelMessageParser
+ {
+ return this.parser as NoobnessLevelMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/handshake/index.ts b/packages/communication/src/messages/incoming/handshake/index.ts
new file mode 100644
index 0000000..81bb67a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/handshake/index.ts
@@ -0,0 +1,6 @@
+export * from './CompleteDiffieHandshakeEvent';
+export * from './DisconnectReasonEnum';
+export * from './DisconnectReasonEvent';
+export * from './IdentityAccountsEvent';
+export * from './InitDiffieHandshakeEvent';
+export * from './NoobnessLevelMessageEvent';
diff --git a/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts
new file mode 100644
index 0000000..7d8d9d7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CallForHelpDisabledNotifyMessageParser } from '../../parser';
+
+export class CallForHelpDisabledNotifyMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CallForHelpDisabledNotifyMessageParser);
+ }
+
+ public getParser(): CallForHelpDisabledNotifyMessageParser
+ {
+ return this.parser as CallForHelpDisabledNotifyMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts
new file mode 100644
index 0000000..b43211e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CallForHelpPendingCallsDeletedMessageParser } from '../../parser';
+
+export class CallForHelpPendingCallsDeletedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CallForHelpPendingCallsDeletedMessageParser);
+ }
+
+ public getParser(): CallForHelpPendingCallsDeletedMessageParser
+ {
+ return this.parser as CallForHelpPendingCallsDeletedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts
new file mode 100644
index 0000000..c159cb5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CallForHelpPendingCallsMessageParser } from '../../parser';
+
+export class CallForHelpPendingCallsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CallForHelpPendingCallsMessageParser);
+ }
+
+ public getParser(): CallForHelpPendingCallsMessageParser
+ {
+ return this.parser as CallForHelpPendingCallsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts
new file mode 100644
index 0000000..9259fca
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/CallForHelpReplyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CallForHelpReplyMessageParser } from '../../parser';
+
+export class CallForHelpReplyMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CallForHelpReplyMessageParser);
+ }
+
+ public getParser(): CallForHelpReplyMessageParser
+ {
+ return this.parser as CallForHelpReplyMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts b/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts
new file mode 100644
index 0000000..cc8973f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/CallForHelpResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CallForHelpResultMessageParser } from '../../parser';
+
+export class CallForHelpResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CallForHelpResultMessageParser);
+ }
+
+ public getParser(): CallForHelpResultMessageParser
+ {
+ return this.parser as CallForHelpResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts
new file mode 100644
index 0000000..90f558e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChatReviewSessionDetachedMessageParser } from '../../parser';
+
+export class ChatReviewSessionDetachedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChatReviewSessionDetachedMessageParser);
+ }
+
+ public getParser(): ChatReviewSessionDetachedMessageParser
+ {
+ return this.parser as ChatReviewSessionDetachedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts
new file mode 100644
index 0000000..89b3d8b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChatReviewSessionOfferedToGuideMessageParser } from '../../parser';
+
+export class ChatReviewSessionOfferedToGuideMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChatReviewSessionOfferedToGuideMessageParser);
+ }
+
+ public getParser(): ChatReviewSessionOfferedToGuideMessageParser
+ {
+ return this.parser as ChatReviewSessionOfferedToGuideMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts
new file mode 100644
index 0000000..8a7149f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChatReviewSessionResultsMessageParser } from '../../parser';
+
+export class ChatReviewSessionResultsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChatReviewSessionResultsMessageParser);
+ }
+
+ public getParser(): ChatReviewSessionResultsMessageParser
+ {
+ return this.parser as ChatReviewSessionResultsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts
new file mode 100644
index 0000000..8252d67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChatReviewSessionStartedMessageParser } from '../../parser';
+
+export class ChatReviewSessionStartedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChatReviewSessionStartedMessageParser);
+ }
+
+ public getParser(): ChatReviewSessionStartedMessageParser
+ {
+ return this.parser as ChatReviewSessionStartedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts
new file mode 100644
index 0000000..874b35a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChatReviewSessionVotingStatusMessageParser } from '../../parser';
+
+export class ChatReviewSessionVotingStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChatReviewSessionVotingStatusMessageParser);
+ }
+
+ public getParser(): ChatReviewSessionVotingStatusMessageParser
+ {
+ return this.parser as ChatReviewSessionVotingStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts
new file mode 100644
index 0000000..ab40fd0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideOnDutyStatusMessageParser } from '../../parser';
+
+export class GuideOnDutyStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideOnDutyStatusMessageParser);
+ }
+
+ public getParser(): GuideOnDutyStatusMessageParser
+ {
+ return this.parser as GuideOnDutyStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts
new file mode 100644
index 0000000..4d5b298
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideReportingStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideReportingStatusMessageParser } from './../../parser';
+
+export class GuideReportingStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideReportingStatusMessageParser);
+ }
+
+ public getParser(): GuideReportingStatusMessageParser
+ {
+ return this.parser as GuideReportingStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts
new file mode 100644
index 0000000..9c3be87
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionAttachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionAttachedMessageParser } from '../../parser';
+
+export class GuideSessionAttachedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionAttachedMessageParser);
+ }
+
+ public getParser(): GuideSessionAttachedMessageParser
+ {
+ return this.parser as GuideSessionAttachedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts
new file mode 100644
index 0000000..146a49e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionDetachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionDetachedMessageParser } from '../../parser';
+
+export class GuideSessionDetachedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionDetachedMessageParser);
+ }
+
+ public getParser(): GuideSessionDetachedMessageParser
+ {
+ return this.parser as GuideSessionDetachedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts
new file mode 100644
index 0000000..1de4f5c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionEndedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionEndedMessageParser } from '../../parser';
+
+export class GuideSessionEndedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionEndedMessageParser);
+ }
+
+ public getParser(): GuideSessionEndedMessageParser
+ {
+ return this.parser as GuideSessionEndedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts
new file mode 100644
index 0000000..b505471
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionErrorMessageParser } from '../../parser';
+
+export class GuideSessionErrorMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionErrorMessageParser);
+ }
+
+ public getParser(): GuideSessionErrorMessageParser
+ {
+ return this.parser as GuideSessionErrorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts
new file mode 100644
index 0000000..ba9e01a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionInvitedToGuideRoomMessageParser } from '../../parser';
+
+export class GuideSessionInvitedToGuideRoomMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionInvitedToGuideRoomMessageParser);
+ }
+
+ public getParser(): GuideSessionInvitedToGuideRoomMessageParser
+ {
+ return this.parser as GuideSessionInvitedToGuideRoomMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts
new file mode 100644
index 0000000..7e7a2cb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionMessageMessageParser } from '../../parser';
+
+export class GuideSessionMessageMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionMessageMessageParser);
+ }
+
+ public getParser(): GuideSessionMessageMessageParser
+ {
+ return this.parser as GuideSessionMessageMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts
new file mode 100644
index 0000000..5406640
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionPartnerIsTypingMessageParser } from '../../parser';
+
+export class GuideSessionPartnerIsTypingMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionPartnerIsTypingMessageParser);
+ }
+
+ public getParser(): GuideSessionPartnerIsTypingMessageParser
+ {
+ return this.parser as GuideSessionPartnerIsTypingMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts
new file mode 100644
index 0000000..3ab6c1c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionRequesterRoomMessageParser } from '../../parser';
+
+export class GuideSessionRequesterRoomMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionRequesterRoomMessageParser);
+ }
+
+ public getParser(): GuideSessionRequesterRoomMessageParser
+ {
+ return this.parser as GuideSessionRequesterRoomMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts
new file mode 100644
index 0000000..1f139d9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideSessionStartedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideSessionStartedMessageParser } from '../../parser';
+
+export class GuideSessionStartedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideSessionStartedMessageParser);
+ }
+
+ public getParser(): GuideSessionStartedMessageParser
+ {
+ return this.parser as GuideSessionStartedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts
new file mode 100644
index 0000000..730f887
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideTicketCreationResultMessageParser } from '../../parser';
+
+export class GuideTicketCreationResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideTicketCreationResultMessageParser);
+ }
+
+ public getParser(): GuideTicketCreationResultMessageParser
+ {
+ return this.parser as GuideTicketCreationResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts b/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts
new file mode 100644
index 0000000..4e8ae55
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/GuideTicketResolutionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuideTicketResolutionMessageParser } from '../../parser';
+
+export class GuideTicketResolutionMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuideTicketResolutionMessageParser);
+ }
+
+ public getParser(): GuideTicketResolutionMessageParser
+ {
+ return this.parser as GuideTicketResolutionMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts b/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts
new file mode 100644
index 0000000..ab9dd38
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/HotelMergeNameChangeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HotelMergeNameChangeParser } from '../../parser';
+
+export class HotelMergeNameChangeEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HotelMergeNameChangeParser);
+ }
+
+ public getParser(): HotelMergeNameChangeParser
+ {
+ return this.parser as HotelMergeNameChangeParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts
new file mode 100644
index 0000000..5610d31
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/IssueCloseNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IssueCloseNotificationMessageParser } from '../../parser';
+
+export class IssueCloseNotificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IssueCloseNotificationMessageParser);
+ }
+
+ public getParser(): IssueCloseNotificationMessageParser
+ {
+ return this.parser as IssueCloseNotificationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts b/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts
new file mode 100644
index 0000000..6e8c2d4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/QuizDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuizDataMessageParser } from '../../parser';
+
+export class QuizDataMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuizDataMessageParser);
+ }
+
+ public getParser(): QuizDataMessageParser
+ {
+ return this.parser as QuizDataMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts b/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts
new file mode 100644
index 0000000..a063136
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/QuizResultsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuizResultsMessageParser } from '../../parser';
+
+export class QuizResultsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuizResultsMessageParser);
+ }
+
+ public getParser(): QuizResultsMessageParser
+ {
+ return this.parser as QuizResultsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/help/index.ts b/packages/communication/src/messages/incoming/help/index.ts
new file mode 100644
index 0000000..029319e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/help/index.ts
@@ -0,0 +1,27 @@
+export * from './CallForHelpDisabledNotifyMessageEvent';
+export * from './CallForHelpPendingCallsDeletedMessageEvent';
+export * from './CallForHelpPendingCallsMessageEvent';
+export * from './CallForHelpReplyMessageEvent';
+export * from './CallForHelpResultMessageEvent';
+export * from './ChatReviewSessionDetachedMessageEvent';
+export * from './ChatReviewSessionOfferedToGuideMessageEvent';
+export * from './ChatReviewSessionResultsMessageEvent';
+export * from './ChatReviewSessionStartedMessageEvent';
+export * from './ChatReviewSessionVotingStatusMessageEvent';
+export * from './GuideOnDutyStatusMessageEvent';
+export * from './GuideReportingStatusMessageEvent';
+export * from './GuideSessionAttachedMessageEvent';
+export * from './GuideSessionDetachedMessageEvent';
+export * from './GuideSessionEndedMessageEvent';
+export * from './GuideSessionErrorMessageEvent';
+export * from './GuideSessionInvitedToGuideRoomMessageEvent';
+export * from './GuideSessionMessageMessageEvent';
+export * from './GuideSessionPartnerIsTypingMessageEvent';
+export * from './GuideSessionRequesterRoomMessageEvent';
+export * from './GuideSessionStartedMessageEvent';
+export * from './GuideTicketCreationResultMessageEvent';
+export * from './GuideTicketResolutionMessageEvent';
+export * from './HotelMergeNameChangeEvent';
+export * from './IssueCloseNotificationMessageEvent';
+export * from './QuizDataMessageEvent';
+export * from './QuizResultsMessageEvent';
diff --git a/packages/communication/src/messages/incoming/index.ts b/packages/communication/src/messages/incoming/index.ts
new file mode 100644
index 0000000..a247dbc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/index.ts
@@ -0,0 +1,76 @@
+export * from './IncomingHeader';
+export * from './advertisement';
+export * from './availability';
+export * from './avatar';
+export * from './bots';
+export * from './callforhelp';
+export * from './camera';
+export * from './campaign';
+export * from './catalog';
+export * from './client';
+export * from './competition';
+export * from './crafting';
+export * from './desktop';
+export * from './friendlist';
+export * from './game';
+export * from './game/directory';
+export * from './game/lobby';
+export * from './game/score';
+export * from './generic';
+export * from './gifts';
+export * from './group';
+export * from './groupforums';
+export * from './handshake';
+export * from './help';
+export * from './inventory';
+export * from './inventory/achievements';
+export * from './inventory/avatareffect';
+export * from './inventory/badges';
+export * from './inventory/clothes';
+export * from './inventory/furni';
+export * from './inventory/furni/gifts';
+export * from './inventory/pets';
+export * from './inventory/trading';
+export * from './landingview';
+export * from './landingview/votes';
+export * from './marketplace';
+export * from './moderation';
+export * from './mysterybox';
+export * from './navigator';
+export * from './notifications';
+export * from './nux';
+export * from './perk';
+export * from './pet';
+export * from './pet/breeding';
+export * from './poll';
+export * from './quest';
+export * from './recycler';
+export * from './room';
+export * from './room/access';
+export * from './room/access/doorbell';
+export * from './room/access/rights';
+export * from './room/bots';
+export * from './room/data';
+export * from './room/engine';
+export * from './room/furniture';
+export * from './room/furniture/floor';
+export * from './room/furniture/wall';
+export * from './room/furniture/youtube';
+export * from './room/mapping';
+export * from './room/pet';
+export * from './room/session';
+export * from './room/unit';
+export * from './room/unit/chat';
+export * from './roomevents';
+export * from './roomsettings';
+export * from './security';
+export * from './sound';
+export * from './talent';
+export * from './user';
+export * from './user/access';
+export * from './user/data';
+export * from './user/inventory';
+export * from './user/inventory/currency';
+export * from './user/inventory/subscription';
+export * from './user/wardrobe';
+export * from './userclassification';
diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts
new file mode 100644
index 0000000..6ab0166
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementParser } from '../../../parser';
+
+export class AchievementEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementParser);
+ }
+
+ public getParser(): AchievementParser
+ {
+ return this.parser as AchievementParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts
new file mode 100644
index 0000000..e47ef52
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementsParser } from '../../../parser';
+
+export class AchievementsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementsParser);
+ }
+
+ public getParser(): AchievementsParser
+ {
+ return this.parser as AchievementsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts
new file mode 100644
index 0000000..dc25c84
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementsScoreParser } from '../../../parser';
+
+export class AchievementsScoreEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementsScoreParser);
+ }
+
+ public getParser(): AchievementsScoreParser
+ {
+ return this.parser as AchievementsScoreParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/achievements/index.ts b/packages/communication/src/messages/incoming/inventory/achievements/index.ts
new file mode 100644
index 0000000..1344aec
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/achievements/index.ts
@@ -0,0 +1,3 @@
+export * from './AchievementEvent';
+export * from './AchievementsEvent';
+export * from './AchievementsScoreEvent';
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts
new file mode 100644
index 0000000..74425f2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvatarEffectActivatedParser } from '../../../parser';
+
+export class AvatarEffectActivatedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvatarEffectActivatedParser);
+ }
+
+ public getParser(): AvatarEffectActivatedParser
+ {
+ return this.parser as AvatarEffectActivatedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts
new file mode 100644
index 0000000..c5a13cc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvatarEffectAddedParser } from '../../../parser';
+
+export class AvatarEffectAddedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvatarEffectAddedParser);
+ }
+
+ public getParser(): AvatarEffectAddedParser
+ {
+ return this.parser as AvatarEffectAddedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts
new file mode 100644
index 0000000..db2956e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvatarEffectExpiredParser } from '../../../parser';
+
+export class AvatarEffectExpiredEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvatarEffectExpiredParser);
+ }
+
+ public getParser(): AvatarEffectExpiredParser
+ {
+ return this.parser as AvatarEffectExpiredParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts
new file mode 100644
index 0000000..98e6d61
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvatarEffectSelectedParser } from '../../../parser';
+
+export class AvatarEffectSelectedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvatarEffectSelectedParser);
+ }
+
+ public getParser(): AvatarEffectSelectedParser
+ {
+ return this.parser as AvatarEffectSelectedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts
new file mode 100644
index 0000000..38f2c29
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AvatarEffectsParser } from '../../../parser';
+
+export class AvatarEffectsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AvatarEffectsParser);
+ }
+
+ public getParser(): AvatarEffectsParser
+ {
+ return this.parser as AvatarEffectsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts b/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts
new file mode 100644
index 0000000..4a407ad
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/avatareffect/index.ts
@@ -0,0 +1,5 @@
+export * from './AvatarEffectActivatedEvent';
+export * from './AvatarEffectAddedEvent';
+export * from './AvatarEffectExpiredEvent';
+export * from './AvatarEffectSelectedEvent';
+export * from './AvatarEffectsEvent';
diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts
new file mode 100644
index 0000000..16859d5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BadgePointLimitsParser } from '../../../parser';
+
+export class BadgePointLimitsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BadgePointLimitsParser);
+ }
+
+ public getParser(): BadgePointLimitsParser
+ {
+ return this.parser as BadgePointLimitsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts
new file mode 100644
index 0000000..15d9d0c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/badges/BadgeReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BadgeReceivedParser } from '../../../parser';
+
+export class BadgeReceivedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BadgeReceivedParser);
+ }
+
+ public getParser(): BadgeReceivedParser
+ {
+ return this.parser as BadgeReceivedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts
new file mode 100644
index 0000000..2062b84
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/badges/BadgesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BadgesParser } from '../../../parser';
+
+export class BadgesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BadgesParser);
+ }
+
+ public getParser(): BadgesParser
+ {
+ return this.parser as BadgesParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts b/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts
new file mode 100644
index 0000000..c5e1727
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IsBadgeRequestFulfilledParser } from '../../../parser';
+
+export class IsBadgeRequestFulfilledEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IsBadgeRequestFulfilledParser);
+ }
+
+ public getParser(): IsBadgeRequestFulfilledParser
+ {
+ return this.parser as IsBadgeRequestFulfilledParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/badges/index.ts b/packages/communication/src/messages/incoming/inventory/badges/index.ts
new file mode 100644
index 0000000..fe4c995
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/badges/index.ts
@@ -0,0 +1,4 @@
+export * from './BadgePointLimitsEvent';
+export * from './BadgeReceivedEvent';
+export * from './BadgesEvent';
+export * from './IsBadgeRequestFulfilledEvent';
diff --git a/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts
new file mode 100644
index 0000000..e29c89e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FigureSetIdsMessageParser } from '../../../parser';
+
+export class FigureSetIdsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FigureSetIdsMessageParser);
+ }
+
+ public getParser(): FigureSetIdsMessageParser
+ {
+ return this.parser as FigureSetIdsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts b/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts
new file mode 100644
index 0000000..3de88ed
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/clothes/_Str_16135.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { _Str_8728 } from '../../../parser';
+
+export class _Str_16135 extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, _Str_8728);
+ }
+
+ public getParser(): _Str_8728
+ {
+ return this.parser as _Str_8728;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts b/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts
new file mode 100644
index 0000000..24f64dd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/clothes/_Str_17532.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { _Str_9021 } from '../../../parser';
+
+export class _Str_17532 extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, _Str_9021);
+ }
+
+ public getParser(): _Str_9021
+ {
+ return this.parser as _Str_9021;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/clothes/index.ts b/packages/communication/src/messages/incoming/inventory/clothes/index.ts
new file mode 100644
index 0000000..477fbf3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/clothes/index.ts
@@ -0,0 +1,3 @@
+export * from './FigureSetIdsMessageEvent';
+export * from './_Str_16135';
+export * from './_Str_17532';
diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts
new file mode 100644
index 0000000..bdb01b6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureListAddOrUpdateParser } from '../../../parser';
+
+export class FurnitureListAddOrUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureListAddOrUpdateParser);
+ }
+
+ public getParser(): FurnitureListAddOrUpdateParser
+ {
+ return this.parser as FurnitureListAddOrUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts
new file mode 100644
index 0000000..8e44049
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureListParser } from '../../../parser';
+
+export class FurnitureListEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureListParser);
+ }
+
+ public getParser(): FurnitureListParser
+ {
+ return this.parser as FurnitureListParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts
new file mode 100644
index 0000000..f61d0ff
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureListInvalidateParser } from '../../../parser';
+
+export class FurnitureListInvalidateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureListInvalidateParser);
+ }
+
+ public getParser(): FurnitureListInvalidateParser
+ {
+ return this.parser as FurnitureListInvalidateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts
new file mode 100644
index 0000000..ebd80f0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureListRemovedParser } from '../../../parser';
+
+export class FurnitureListRemovedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureListRemovedParser);
+ }
+
+ public getParser(): FurnitureListRemovedParser
+ {
+ return this.parser as FurnitureListRemovedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts
new file mode 100644
index 0000000..a2e9303
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurniturePostItPlacedParser } from '../../../parser';
+
+export class FurniturePostItPlacedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurniturePostItPlacedParser);
+ }
+
+ public getParser(): FurniturePostItPlacedParser
+ {
+ return this.parser as FurniturePostItPlacedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts
new file mode 100644
index 0000000..a62957d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PresentOpenedMessageParser } from '../../../../parser';
+
+export class PresentOpenedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PresentOpenedMessageParser);
+ }
+
+ public getParser(): PresentOpenedMessageParser
+ {
+ return this.parser as PresentOpenedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts b/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts
new file mode 100644
index 0000000..349aca7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/gifts/index.ts
@@ -0,0 +1 @@
+export * from './PresentOpenedMessageEvent';
diff --git a/packages/communication/src/messages/incoming/inventory/furni/index.ts b/packages/communication/src/messages/incoming/inventory/furni/index.ts
new file mode 100644
index 0000000..79c3096
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/furni/index.ts
@@ -0,0 +1,6 @@
+export * from './FurnitureListAddOrUpdateEvent';
+export * from './FurnitureListEvent';
+export * from './FurnitureListInvalidateEvent';
+export * from './FurnitureListRemovedEvent';
+export * from './FurniturePostItPlacedEvent';
+export * from './gifts';
diff --git a/packages/communication/src/messages/incoming/inventory/index.ts b/packages/communication/src/messages/incoming/inventory/index.ts
new file mode 100644
index 0000000..4f6ae27
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/index.ts
@@ -0,0 +1,8 @@
+export * from './achievements';
+export * from './avatareffect';
+export * from './badges';
+export * from './clothes';
+export * from './furni';
+export * from './furni/gifts';
+export * from './pets';
+export * from './trading';
diff --git a/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts
new file mode 100644
index 0000000..5a07d28
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ConfirmBreedingRequestParser } from '../../../parser';
+
+export class ConfirmBreedingRequestEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ConfirmBreedingRequestParser);
+ }
+
+ public getParser(): ConfirmBreedingRequestParser
+ {
+ return this.parser as ConfirmBreedingRequestParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts
new file mode 100644
index 0000000..04b9a42
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ConfirmBreedingResultParser } from '../../../parser';
+
+export class ConfirmBreedingResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ConfirmBreedingResultParser);
+ }
+
+ public getParser(): ConfirmBreedingResultParser
+ {
+ return this.parser as ConfirmBreedingResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts
new file mode 100644
index 0000000..e344549
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GoToBreedingNestFailureParser } from '../../../parser';
+
+export class GoToBreedingNestFailureEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GoToBreedingNestFailureParser);
+ }
+
+ public getParser(): GoToBreedingNestFailureParser
+ {
+ return this.parser as GoToBreedingNestFailureParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts
new file mode 100644
index 0000000..2202eb7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NestBreedingSuccessParser } from '../../../parser';
+
+export class NestBreedingSuccessEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NestBreedingSuccessParser);
+ }
+
+ public getParser(): NestBreedingSuccessParser
+ {
+ return this.parser as NestBreedingSuccessParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts
new file mode 100644
index 0000000..da5e259
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetAddedToInventoryParser } from '../../../parser';
+
+export class PetAddedToInventoryEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetAddedToInventoryParser);
+ }
+
+ public getParser(): PetAddedToInventoryParser
+ {
+ return this.parser as PetAddedToInventoryParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts
new file mode 100644
index 0000000..e49449b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/PetInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetInventoryParser } from '../../../parser';
+
+export class PetInventoryEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetInventoryParser);
+ }
+
+ public getParser(): PetInventoryParser
+ {
+ return this.parser as PetInventoryParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts
new file mode 100644
index 0000000..072bc02
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetReceivedMessageParser } from '../../../parser';
+
+export class PetReceivedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetReceivedMessageParser);
+ }
+
+ public getParser(): PetReceivedMessageParser
+ {
+ return this.parser as PetReceivedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts b/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts
new file mode 100644
index 0000000..d96bdff
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetRemovedFromInventoryParser } from '../../../parser';
+
+export class PetRemovedFromInventory extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetRemovedFromInventoryParser);
+ }
+
+ public getParser(): PetRemovedFromInventoryParser
+ {
+ return this.parser as PetRemovedFromInventoryParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/pets/index.ts b/packages/communication/src/messages/incoming/inventory/pets/index.ts
new file mode 100644
index 0000000..f7c5d97
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/pets/index.ts
@@ -0,0 +1,8 @@
+export * from './ConfirmBreedingRequestEvent';
+export * from './ConfirmBreedingResultEvent';
+export * from './GoToBreedingNestFailureEvent';
+export * from './NestBreedingSuccessEvent';
+export * from './PetAddedToInventoryEvent';
+export * from './PetInventoryEvent';
+export * from './PetReceivedMessageEvent';
+export * from './PetRemovedFromInventoryEvent';
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts
new file mode 100644
index 0000000..d4f4631
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingAcceptEvent.ts
@@ -0,0 +1,26 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingAcceptParser } from '../../../parser';
+
+export class TradingAcceptEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingAcceptParser);
+ }
+
+ public get userID(): number
+ {
+ return this.getParser().userID;
+ }
+
+ public get userAccepts(): boolean
+ {
+ return this.getParser().userAccepts;
+ }
+
+ public getParser(): TradingAcceptParser
+ {
+ return this.parser as TradingAcceptParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts
new file mode 100644
index 0000000..bb237b7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingCloseEvent.ts
@@ -0,0 +1,21 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingCloseParser } from '../../../parser';
+
+export class TradingCloseEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingCloseParser);
+ }
+
+ public get userID(): number
+ {
+ return this.getParser().userID;
+ }
+
+ public getParser(): TradingCloseParser
+ {
+ return this.parser as TradingCloseParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts
new file mode 100644
index 0000000..09c9482
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingCompletedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingCompletedParser } from '../../../parser';
+
+export class TradingCompletedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingCompletedParser);
+ }
+
+ public getParser(): TradingCompletedParser
+ {
+ return this.parser as TradingCompletedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts
new file mode 100644
index 0000000..0f1d78e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingConfirmationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingConfirmationParser } from '../../../parser';
+
+export class TradingConfirmationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingConfirmationParser);
+ }
+
+ public getParser(): TradingConfirmationParser
+ {
+ return this.parser as TradingConfirmationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts
new file mode 100644
index 0000000..a052c3c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingListItemEvent.ts
@@ -0,0 +1,56 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ItemDataStructure, TradingListItemParser } from '../../../parser';
+
+export class TradingListItemEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingListItemParser);
+ }
+
+ public get firstUserID(): number
+ {
+ return this.getParser().firstUserID;
+ }
+
+ public get secondUserID(): number
+ {
+ return this.getParser().secondUserID;
+ }
+
+ public get firstUserNumItems(): number
+ {
+ return this.getParser().firstUserNumItems;
+ }
+
+ public get secondUserNumItems(): number
+ {
+ return this.getParser().secondUserNumItems;
+ }
+
+ public get firstUserNumCredits(): number
+ {
+ return this.getParser().firstUserNumCredits;
+ }
+
+ public get secondUserNumCredits(): number
+ {
+ return this.getParser().secondUserNumCredits;
+ }
+
+ public get firstUserItemArray(): ItemDataStructure[]
+ {
+ return this.getParser().firstUserItemArray;
+ }
+
+ public get secondUserItemArray(): ItemDataStructure[]
+ {
+ return this.getParser().secondUserItemArray;
+ }
+
+ public getParser(): TradingListItemParser
+ {
+ return this.parser as TradingListItemParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts
new file mode 100644
index 0000000..9e70233
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingNoSuchItemParser } from '../../../parser';
+
+export class TradingNoSuchItemEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingNoSuchItemParser);
+ }
+
+ public getParser(): TradingNoSuchItemParser
+ {
+ return this.parser as TradingNoSuchItemParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts
new file mode 100644
index 0000000..2e53500
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingNotOpenEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingNotOpenParser } from '../../../parser';
+
+export class TradingNotOpenEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingNotOpenParser);
+ }
+
+ public getParser(): TradingNotOpenParser
+ {
+ return this.parser as TradingNotOpenParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts
new file mode 100644
index 0000000..2347456
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenEvent.ts
@@ -0,0 +1,36 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingOpenParser } from '../../../parser';
+
+export class TradingOpenEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingOpenParser);
+ }
+
+ public get userID(): number
+ {
+ return this.getParser().userID;
+ }
+
+ public get userCanTrade(): boolean
+ {
+ return this.getParser().userCanTrade;
+ }
+
+ public get otherUserID(): number
+ {
+ return this.getParser().otherUserID;
+ }
+
+ public get otherUserCanTrade(): boolean
+ {
+ return this.getParser().otherUserCanTrade;
+ }
+
+ public getParser(): TradingOpenParser
+ {
+ return this.parser as TradingOpenParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts
new file mode 100644
index 0000000..e5baa21
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingOpenFailedParser } from '../../../parser';
+
+export class TradingOpenFailedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingOpenFailedParser);
+ }
+
+ public getParser(): TradingOpenFailedParser
+ {
+ return this.parser as TradingOpenFailedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts
new file mode 100644
index 0000000..f292b4a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingOtherNotAllowedParser } from '../../../parser';
+
+export class TradingOtherNotAllowedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingOtherNotAllowedParser);
+ }
+
+ public getParser(): TradingOtherNotAllowedParser
+ {
+ return this.parser as TradingOtherNotAllowedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts b/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts
new file mode 100644
index 0000000..b303630
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TradingYouAreNotAllowedParser } from '../../../parser';
+
+export class TradingYouAreNotAllowedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TradingYouAreNotAllowedParser);
+ }
+
+ public getParser(): TradingYouAreNotAllowedParser
+ {
+ return this.parser as TradingYouAreNotAllowedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/inventory/trading/index.ts b/packages/communication/src/messages/incoming/inventory/trading/index.ts
new file mode 100644
index 0000000..cddd363
--- /dev/null
+++ b/packages/communication/src/messages/incoming/inventory/trading/index.ts
@@ -0,0 +1,11 @@
+export * from './TradingAcceptEvent';
+export * from './TradingCloseEvent';
+export * from './TradingCompletedEvent';
+export * from './TradingConfirmationEvent';
+export * from './TradingListItemEvent';
+export * from './TradingNoSuchItemEvent';
+export * from './TradingNotOpenEvent';
+export * from './TradingOpenEvent';
+export * from './TradingOpenFailedEvent';
+export * from './TradingOtherNotAllowedEvent';
+export * from './TradingYouAreNotAllowedEvent';
diff --git a/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts b/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts
new file mode 100644
index 0000000..687a3bc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/landingview/PromoArticlesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PromoArticlesMessageParser } from '../../parser';
+
+export class PromoArticlesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PromoArticlesMessageParser);
+ }
+
+ public getParser(): PromoArticlesMessageParser
+ {
+ return this.parser as PromoArticlesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/landingview/index.ts b/packages/communication/src/messages/incoming/landingview/index.ts
new file mode 100644
index 0000000..d566aeb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/landingview/index.ts
@@ -0,0 +1,2 @@
+export * from './PromoArticlesMessageEvent';
+export * from './votes';
diff --git a/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts b/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts
new file mode 100644
index 0000000..45db269
--- /dev/null
+++ b/packages/communication/src/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CommunityVoteReceivedParser } from '../../../parser';
+
+export class CommunityGoalVoteMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CommunityVoteReceivedParser);
+ }
+
+ public getParser(): CommunityVoteReceivedParser
+ {
+ return this.parser as CommunityVoteReceivedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/landingview/votes/index.ts b/packages/communication/src/messages/incoming/landingview/votes/index.ts
new file mode 100644
index 0000000..adcbb0e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/landingview/votes/index.ts
@@ -0,0 +1 @@
+export * from './CommunityGoalVoteMessageEvent';
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts
new file mode 100644
index 0000000..ece4d67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceBuyOfferResultParser } from '../../parser';
+
+
+export class MarketplaceBuyOfferResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceBuyOfferResultParser);
+ }
+
+ public getParser(): MarketplaceBuyOfferResultParser
+ {
+ return this.parser as MarketplaceBuyOfferResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts
new file mode 100644
index 0000000..b44c520
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceCanMakeOfferResultParser } from '../../parser';
+
+
+export class MarketplaceCanMakeOfferResult extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceCanMakeOfferResultParser);
+ }
+
+ public getParser(): MarketplaceCanMakeOfferResultParser
+ {
+ return this.parser as MarketplaceCanMakeOfferResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts
new file mode 100644
index 0000000..a01e071
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceCancelOfferResultParser } from '../../parser';
+
+export class MarketplaceCancelOfferResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceCancelOfferResultParser);
+ }
+
+ public getParser(): MarketplaceCancelOfferResultParser
+ {
+ return this.parser as MarketplaceCancelOfferResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts
new file mode 100644
index 0000000..0efb244
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceConfigurationMessageParser } from '../../parser';
+
+export class MarketplaceConfigurationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceConfigurationMessageParser);
+ }
+
+ public getParser(): MarketplaceConfigurationMessageParser
+ {
+ return this.parser as MarketplaceConfigurationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts
new file mode 100644
index 0000000..3dfb9d0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceItemStatsParser } from '../../parser';
+
+export class MarketplaceItemStatsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceItemStatsParser);
+ }
+
+ public getParser(): MarketplaceItemStatsParser
+ {
+ return this.parser as MarketplaceItemStatsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts
new file mode 100644
index 0000000..db8ed99
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceMakeOfferResultParser } from '../../parser';
+
+
+export class MarketplaceMakeOfferResult extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceMakeOfferResultParser);
+ }
+
+ public getParser(): MarketplaceMakeOfferResultParser
+ {
+ return this.parser as MarketplaceMakeOfferResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts
new file mode 100644
index 0000000..768cecc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceOffersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceOffersParser } from '../../parser';
+
+export class MarketPlaceOffersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceOffersParser);
+ }
+
+ public getParser(): MarketplaceOffersParser
+ {
+ return this.parser as MarketplaceOffersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts b/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts
new file mode 100644
index 0000000..a40dab2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MarketplaceOwnOffersParser } from '../../parser';
+
+export class MarketplaceOwnOffersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MarketplaceOwnOffersParser);
+ }
+
+ public getParser(): MarketplaceOwnOffersParser
+ {
+ return this.parser as MarketplaceOwnOffersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/marketplace/index.ts b/packages/communication/src/messages/incoming/marketplace/index.ts
new file mode 100644
index 0000000..7f4c2d5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/marketplace/index.ts
@@ -0,0 +1,8 @@
+export * from './MarketplaceBuyOfferResultEvent';
+export * from './MarketplaceCancelOfferResultEvent';
+export * from './MarketplaceCanMakeOfferResult';
+export * from './MarketplaceConfigurationEvent';
+export * from './MarketplaceItemStatsEvent';
+export * from './MarketplaceMakeOfferResult';
+export * from './MarketplaceOffersEvent';
+export * from './MarketplaceOwnOffersEvent';
diff --git a/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts
new file mode 100644
index 0000000..228db0b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/CfhChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CfhChatlogMessageParser } from '../../parser';
+
+export class CfhChatlogEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CfhChatlogMessageParser);
+ }
+
+ public getParser(): CfhChatlogMessageParser
+ {
+ return this.parser as CfhChatlogMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts
new file mode 100644
index 0000000..e8bb447
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/IssueDeletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IssueDeletedMessageParser } from '../../parser';
+
+export class IssueDeletedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IssueDeletedMessageParser);
+ }
+
+ public getParser(): IssueDeletedMessageParser
+ {
+ return this.parser as IssueDeletedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts
new file mode 100644
index 0000000..6d74f07
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/IssueInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IssueInfoMessageParser } from '../../parser';
+
+export class IssueInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IssueInfoMessageParser);
+ }
+
+ public getParser(): IssueInfoMessageParser
+ {
+ return this.parser as IssueInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts
new file mode 100644
index 0000000..6f9e627
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/IssuePickFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IssuePickFailedMessageParser } from '../../parser';
+
+export class IssuePickFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IssuePickFailedMessageParser);
+ }
+
+ public getParser(): IssuePickFailedMessageParser
+ {
+ return this.parser as IssuePickFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts
new file mode 100644
index 0000000..264ff97
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorActionResultMessageParser } from '../../parser';
+
+export class ModeratorActionResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorActionResultMessageParser);
+ }
+
+ public getParser(): ModeratorActionResultMessageParser
+ {
+ return this.parser as ModeratorActionResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts
new file mode 100644
index 0000000..d606577
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorCautionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModerationCautionParser } from '../../parser';
+
+export class ModeratorCautionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModerationCautionParser);
+ }
+
+ public getParser(): ModerationCautionParser
+ {
+ return this.parser as ModerationCautionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts
new file mode 100644
index 0000000..73891ee
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorInitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorInitMessageParser } from '../../parser';
+
+export class ModeratorInitMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorInitMessageParser);
+ }
+
+ public getParser(): ModeratorInitMessageParser
+ {
+ return this.parser as ModeratorInitMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts
new file mode 100644
index 0000000..863ec05
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorMessageParser } from '../../parser';
+
+export class ModeratorMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorMessageParser);
+ }
+
+ public getParser(): ModeratorMessageParser
+ {
+ return this.parser as ModeratorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts
new file mode 100644
index 0000000..e53bc73
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorRoomInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorRoomInfoMessageParser } from '../../parser';
+
+export class ModeratorRoomInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorRoomInfoMessageParser);
+ }
+
+ public getParser(): ModeratorRoomInfoMessageParser
+ {
+ return this.parser as ModeratorRoomInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts
new file mode 100644
index 0000000..3ab1dd3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorToolPreferencesMessageParser } from '../../parser';
+
+export class ModeratorToolPreferencesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorToolPreferencesMessageParser);
+ }
+
+ public getParser(): ModeratorToolPreferencesMessageParser
+ {
+ return this.parser as ModeratorToolPreferencesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts b/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts
new file mode 100644
index 0000000..1a8cd8e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/ModeratorUserInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ModeratorUserInfoMessageParser } from '../../parser';
+
+export class ModeratorUserInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ModeratorUserInfoMessageParser);
+ }
+
+ public getParser(): ModeratorUserInfoMessageParser
+ {
+ return this.parser as ModeratorUserInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts
new file mode 100644
index 0000000..fd5ce65
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/RoomChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomChatlogMessageParser } from '../../parser';
+
+export class RoomChatlogEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomChatlogMessageParser);
+ }
+
+ public getParser(): RoomChatlogMessageParser
+ {
+ return this.parser as RoomChatlogMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts b/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts
new file mode 100644
index 0000000..4cbf2cb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/RoomVisitsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomVisitsMessageParser } from '../../parser';
+
+export class RoomVisitsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomVisitsMessageParser);
+ }
+
+ public getParser(): RoomVisitsMessageParser
+ {
+ return this.parser as RoomVisitsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts b/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts
new file mode 100644
index 0000000..54cbcda
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/UserBannedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserBannedMessageParser } from '../../parser';
+
+export class UserBannedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserBannedMessageParser);
+ }
+
+ public getParser(): UserBannedMessageParser
+ {
+ return this.parser as UserBannedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts b/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts
new file mode 100644
index 0000000..9314cff
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/UserChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserChatlogMessageParser } from '../../parser';
+
+export class UserChatlogEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserChatlogMessageParser);
+ }
+
+ public getParser(): UserChatlogMessageParser
+ {
+ return this.parser as UserChatlogMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/moderation/index.ts b/packages/communication/src/messages/incoming/moderation/index.ts
new file mode 100644
index 0000000..2bbc0c0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/moderation/index.ts
@@ -0,0 +1,15 @@
+export * from './CfhChatlogEvent';
+export * from './IssueDeletedMessageEvent';
+export * from './IssueInfoMessageEvent';
+export * from './IssuePickFailedMessageEvent';
+export * from './ModeratorActionResultMessageEvent';
+export * from './ModeratorCautionEvent';
+export * from './ModeratorInitMessageEvent';
+export * from './ModeratorMessageEvent';
+export * from './ModeratorRoomInfoEvent';
+export * from './ModeratorToolPreferencesEvent';
+export * from './ModeratorUserInfoEvent';
+export * from './RoomChatlogEvent';
+export * from './RoomVisitsEvent';
+export * from './UserBannedMessageEvent';
+export * from './UserChatlogEvent';
diff --git a/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts
new file mode 100644
index 0000000..fd49f76
--- /dev/null
+++ b/packages/communication/src/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CancelMysteryBoxWaitMessageParser } from '../../parser/mysterybox';
+
+export class CancelMysteryBoxWaitMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CancelMysteryBoxWaitMessageParser);
+ }
+
+ public getParser(): CancelMysteryBoxWaitMessageParser
+ {
+ return this.parser as CancelMysteryBoxWaitMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts
new file mode 100644
index 0000000..00928d3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GotMysteryBoxPrizeMessageParser } from '../../parser/mysterybox';
+
+export class GotMysteryBoxPrizeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GotMysteryBoxPrizeMessageParser);
+ }
+
+ public getParser(): GotMysteryBoxPrizeMessageParser
+ {
+ return this.parser as GotMysteryBoxPrizeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts b/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts
new file mode 100644
index 0000000..bae9bd6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MysteryBoxKeysParser } from '../../parser';
+
+export class MysteryBoxKeysEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MysteryBoxKeysParser);
+ }
+
+ public getParser(): MysteryBoxKeysParser
+ {
+ return this.parser as MysteryBoxKeysParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts b/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts
new file mode 100644
index 0000000..6305863
--- /dev/null
+++ b/packages/communication/src/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ShowMysteryBoxWaitMessageParser } from '../../parser/mysterybox';
+
+export class ShowMysteryBoxWaitMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ShowMysteryBoxWaitMessageParser);
+ }
+
+ public getParser(): ShowMysteryBoxWaitMessageParser
+ {
+ return this.parser as ShowMysteryBoxWaitMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/mysterybox/index.ts b/packages/communication/src/messages/incoming/mysterybox/index.ts
new file mode 100644
index 0000000..0d41333
--- /dev/null
+++ b/packages/communication/src/messages/incoming/mysterybox/index.ts
@@ -0,0 +1,4 @@
+export * from './CancelMysteryBoxWaitMessageEvent';
+export * from './GotMysteryBoxPrizeMessageEvent';
+export * from './MysteryBoxKeysEvent';
+export * from './ShowMysteryBoxWaitMessageEvent';
diff --git a/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts
new file mode 100644
index 0000000..3836423
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CanCreateRoomMessageParser } from '../../parser';
+
+export class CanCreateRoomEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CanCreateRoomMessageParser);
+ }
+
+ public getParser(): CanCreateRoomMessageParser
+ {
+ return this.parser as CanCreateRoomMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts
new file mode 100644
index 0000000..e1ac7e7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/CanCreateRoomEventEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CanCreateRoomEventParser } from '../../parser';
+
+export class CanCreateRoomEventEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CanCreateRoomEventParser);
+ }
+
+ public getParser(): CanCreateRoomEventParser
+ {
+ return this.parser as CanCreateRoomEventParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts b/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts
new file mode 100644
index 0000000..651d255
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CategoriesWithVisitorCountParser } from '../../parser';
+
+export class CategoriesWithVisitorCountEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CategoriesWithVisitorCountParser);
+ }
+
+ public getParser(): CategoriesWithVisitorCountParser
+ {
+ return this.parser as CategoriesWithVisitorCountParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts
new file mode 100644
index 0000000..bd9a360
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CompetitionRoomsDataMessageParser } from '../../parser';
+
+export class CompetitionRoomsDataMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CompetitionRoomsDataMessageParser);
+ }
+
+ public getParser(): CompetitionRoomsDataMessageParser
+ {
+ return this.parser as CompetitionRoomsDataMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts b/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts
new file mode 100644
index 0000000..eb37e70
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/ConvertedRoomIdEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ConvertedRoomIdMessageParser } from '../../parser';
+
+export class ConvertedRoomIdEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ConvertedRoomIdMessageParser);
+ }
+
+ public getParser(): ConvertedRoomIdMessageParser
+ {
+ return this.parser as ConvertedRoomIdMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts
new file mode 100644
index 0000000..ce495a1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/DoorbellMessageEvent.ts
@@ -0,0 +1,21 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { DoorbellMessageParser } from '../../parser';
+
+export class DoorbellMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, DoorbellMessageParser);
+ }
+
+ public getParser(): DoorbellMessageParser
+ {
+ return this.parser as DoorbellMessageParser;
+ }
+
+ public get userName(): string
+ {
+ return this.getParser().userName;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts b/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts
new file mode 100644
index 0000000..e9652cb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/FavouriteChangedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FavouriteChangedMessageParser } from '../../parser';
+
+export class FavouriteChangedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FavouriteChangedMessageParser);
+ }
+
+ public getParser(): FavouriteChangedMessageParser
+ {
+ return this.parser as FavouriteChangedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts b/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts
new file mode 100644
index 0000000..46622f5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/FavouritesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FavouritesMessageParser } from '../../parser';
+
+export class FavouritesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FavouritesMessageParser);
+ }
+
+ public getParser(): FavouritesMessageParser
+ {
+ return this.parser as FavouritesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts
new file mode 100644
index 0000000..205bfb5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FlatAccessDeniedMessageParser } from '../../parser';
+
+export class FlatAccessDeniedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FlatAccessDeniedMessageParser);
+ }
+
+ public getParser(): FlatAccessDeniedMessageParser
+ {
+ return this.parser as FlatAccessDeniedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts b/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts
new file mode 100644
index 0000000..a6e00a9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/FlatCreatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FlatCreatedMessageParser } from '../../parser';
+
+export class FlatCreatedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FlatCreatedMessageParser);
+ }
+
+ public getParser(): FlatCreatedMessageParser
+ {
+ return this.parser as FlatCreatedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts b/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts
new file mode 100644
index 0000000..3f601ea
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/GetGuestRoomResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GetGuestRoomResultMessageParser } from '../../parser';
+
+export class GetGuestRoomResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GetGuestRoomResultMessageParser);
+ }
+
+ public getParser(): GetGuestRoomResultMessageParser
+ {
+ return this.parser as GetGuestRoomResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts b/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts
new file mode 100644
index 0000000..95ca50a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/GuestRoomSearchResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuestRoomSearchResultMessageParser } from '../../parser';
+
+export class GuestRoomSearchResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuestRoomSearchResultMessageParser);
+ }
+
+ public getParser(): GuestRoomSearchResultMessageParser
+ {
+ return this.parser as GuestRoomSearchResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts
new file mode 100644
index 0000000..fb6e0f7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorCollapsedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorCollapsedParser } from '../../parser';
+
+export class NavigatorCollapsedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorCollapsedParser);
+ }
+
+ public getParser(): NavigatorCollapsedParser
+ {
+ return this.parser as NavigatorCollapsedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts
new file mode 100644
index 0000000..3e1c021
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorHomeRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorHomeRoomParser } from '../../parser';
+
+export class NavigatorHomeRoomEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorHomeRoomParser);
+ }
+
+ public getParser(): NavigatorHomeRoomParser
+ {
+ return this.parser as NavigatorHomeRoomParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts
new file mode 100644
index 0000000..8dbbdf1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorLiftedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorLiftedParser } from '../../parser';
+
+export class NavigatorLiftedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorLiftedParser);
+ }
+
+ public getParser(): NavigatorLiftedParser
+ {
+ return this.parser as NavigatorLiftedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts
new file mode 100644
index 0000000..ed6eb51
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorMetadataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorMetadataParser } from '../../parser';
+
+export class NavigatorMetadataEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorMetadataParser);
+ }
+
+ public getParser(): NavigatorMetadataParser
+ {
+ return this.parser as NavigatorMetadataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts
new file mode 100644
index 0000000..70eb7ea
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorOpenRoomCreatorParser } from '../../parser';
+
+export class NavigatorOpenRoomCreatorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorOpenRoomCreatorParser);
+ }
+
+ public getParser(): NavigatorOpenRoomCreatorParser
+ {
+ return this.parser as NavigatorOpenRoomCreatorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts
new file mode 100644
index 0000000..bf2dffe
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorSearchEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorSearchParser } from '../../parser';
+
+export class NavigatorSearchEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorSearchParser);
+ }
+
+ public getParser(): NavigatorSearchParser
+ {
+ return this.parser as NavigatorSearchParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts
new file mode 100644
index 0000000..df9ac9e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorSearchesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorSearchesParser } from '../../parser';
+
+export class NavigatorSearchesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorSearchesParser);
+ }
+
+ public getParser(): NavigatorSearchesParser
+ {
+ return this.parser as NavigatorSearchesParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts b/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts
new file mode 100644
index 0000000..9546220
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/NavigatorSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NavigatorSettingsParser } from '../../parser';
+
+export class NavigatorSettingsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NavigatorSettingsParser);
+ }
+
+ public getParser(): NavigatorSettingsParser
+ {
+ return this.parser as NavigatorSettingsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts b/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts
new file mode 100644
index 0000000..738570c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/PopularRoomTagsResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PopularRoomTagsResultMessageParser } from '../../parser';
+
+export class PopularRoomTagsResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PopularRoomTagsResultMessageParser);
+ }
+
+ public getParser(): PopularRoomTagsResultMessageParser
+ {
+ return this.parser as PopularRoomTagsResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts
new file mode 100644
index 0000000..938ffcf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/RoomEventCancelEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomEventCancelMessageParser } from '../../parser';
+
+export class RoomEventCancelEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomEventCancelMessageParser);
+ }
+
+ public getParser(): RoomEventCancelMessageParser
+ {
+ return this.parser as RoomEventCancelMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts
new file mode 100644
index 0000000..51b2764
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/RoomEventEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomEventMessageParser } from '../../parser';
+
+export class RoomEventEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomEventMessageParser);
+ }
+
+ public getParser(): RoomEventMessageParser
+ {
+ return this.parser as RoomEventMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts
new file mode 100644
index 0000000..c2a22f9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomFilterSettingsMessageParser } from '../../parser';
+
+export class RoomFilterSettingsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomFilterSettingsMessageParser);
+ }
+
+ public getParser(): RoomFilterSettingsMessageParser
+ {
+ return this.parser as RoomFilterSettingsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts
new file mode 100644
index 0000000..f3ac9df
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomSettingsUpdatedParser } from '../../parser';
+
+export class RoomSettingsUpdatedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomSettingsUpdatedParser);
+ }
+
+ public getParser(): RoomSettingsUpdatedParser
+ {
+ return this.parser as RoomSettingsUpdatedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts b/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts
new file mode 100644
index 0000000..eacb19a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomThumbnailUpdateResultMessageParser } from '../../parser';
+
+export class RoomThumbnailUpdateResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomThumbnailUpdateResultMessageParser);
+ }
+
+ public getParser(): RoomThumbnailUpdateResultMessageParser
+ {
+ return this.parser as RoomThumbnailUpdateResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts b/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts
new file mode 100644
index 0000000..a4677e2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/UserEventCatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserEventCatsMessageParser } from '../../parser';
+
+export class UserEventCatsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserEventCatsMessageParser);
+ }
+
+ public getParser(): UserEventCatsMessageParser
+ {
+ return this.parser as UserEventCatsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts b/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts
new file mode 100644
index 0000000..1d8e7b9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/UserFlatCatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserFlatCatsMessageParser } from '../../parser';
+
+export class UserFlatCatsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserFlatCatsMessageParser);
+ }
+
+ public getParser(): UserFlatCatsMessageParser
+ {
+ return this.parser as UserFlatCatsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/navigator/index.ts b/packages/communication/src/messages/incoming/navigator/index.ts
new file mode 100644
index 0000000..deac832
--- /dev/null
+++ b/packages/communication/src/messages/incoming/navigator/index.ts
@@ -0,0 +1,28 @@
+export * from './CanCreateRoomEvent';
+export * from './CanCreateRoomEventEvent';
+export * from './CategoriesWithVisitorCountEvent';
+export * from './CompetitionRoomsDataMessageEvent';
+export * from './ConvertedRoomIdEvent';
+export * from './DoorbellMessageEvent';
+export * from './FavouriteChangedEvent';
+export * from './FavouritesEvent';
+export * from './FlatAccessDeniedMessageEvent';
+export * from './FlatCreatedEvent';
+export * from './GetGuestRoomResultEvent';
+export * from './GuestRoomSearchResultEvent';
+export * from './NavigatorCollapsedEvent';
+export * from './NavigatorHomeRoomEvent';
+export * from './NavigatorLiftedEvent';
+export * from './NavigatorMetadataEvent';
+export * from './NavigatorOpenRoomCreatorEvent';
+export * from './NavigatorSearchesEvent';
+export * from './NavigatorSearchEvent';
+export * from './NavigatorSettingsEvent';
+export * from './PopularRoomTagsResultEvent';
+export * from './RoomEventCancelEvent';
+export * from './RoomEventEvent';
+export * from './RoomFilterSettingsMessageEvent';
+export * from './RoomSettingsUpdatedEvent';
+export * from './RoomThumbnailUpdateResultEvent';
+export * from './UserEventCatsEvent';
+export * from './UserFlatCatsEvent';
diff --git a/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts
new file mode 100644
index 0000000..520a99f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/AchievementNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AchievementNotificationMessageParser } from '../../parser';
+
+export class AchievementNotificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AchievementNotificationMessageParser);
+ }
+
+ public getParser(): AchievementNotificationMessageParser
+ {
+ return this.parser as AchievementNotificationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts
new file mode 100644
index 0000000..20bf570
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ActivityPointNotificationParser } from '../../parser';
+
+export class ActivityPointNotificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ActivityPointNotificationParser);
+ }
+
+ public getParser(): ActivityPointNotificationParser
+ {
+ return this.parser as ActivityPointNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts
new file mode 100644
index 0000000..8eaa0a1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/BotErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotErrorEventParser } from '../../parser';
+
+export class BotErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotErrorEventParser);
+ }
+
+ public getParser(): BotErrorEventParser
+ {
+ return this.parser as BotErrorEventParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts
new file mode 100644
index 0000000..d8e1795
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/ClubGiftNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ClubGiftNotificationParser } from '../../parser';
+
+export class ClubGiftNotificationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ClubGiftNotificationParser);
+ }
+
+ public getParser(): ClubGiftNotificationParser
+ {
+ return this.parser as ClubGiftNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts
new file mode 100644
index 0000000..1b12eab
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/ConnectionErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ConnectionErrorMessageParser } from '../../parser/notifications/ConnectionErrorMessageParser';
+
+export class ConnectionErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ConnectionErrorMessageParser);
+ }
+
+ public getParser(): ConnectionErrorMessageParser
+ {
+ return this.parser as ConnectionErrorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts
new file mode 100644
index 0000000..12b941e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/ElementPointerMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ElementPointerMessageParser } from '../../parser';
+
+export class ElementPointerMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ElementPointerMessageParser);
+ }
+
+ public getParser(): ElementPointerMessageParser
+ {
+ return this.parser as ElementPointerMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts
new file mode 100644
index 0000000..58e1db0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/HabboBroadcastMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboBroadcastMessageParser } from '../../parser';
+
+export class HabboBroadcastMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboBroadcastMessageParser);
+ }
+
+ public getParser(): HabboBroadcastMessageParser
+ {
+ return this.parser as HabboBroadcastMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts b/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts
new file mode 100644
index 0000000..b726633
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/HotelWillShutdownEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HotelWillShutdownParser } from '../../parser';
+
+export class HotelWillShutdownEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HotelWillShutdownParser);
+ }
+
+ public getParser(): HotelWillShutdownParser
+ {
+ return this.parser as HotelWillShutdownParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts
new file mode 100644
index 0000000..5c7e54e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InfoFeedEnableMessageParser } from '../../parser';
+
+export class InfoFeedEnableMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InfoFeedEnableMessageParser);
+ }
+
+ public getParser(): InfoFeedEnableMessageParser
+ {
+ return this.parser as InfoFeedEnableMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts
new file mode 100644
index 0000000..07ae143
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/MOTDNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MOTDNotificationParser } from '../../parser';
+
+export class MOTDNotificationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MOTDNotificationParser);
+ }
+
+ public getParser(): MOTDNotificationParser
+ {
+ return this.parser as MOTDNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts
new file mode 100644
index 0000000..b6b7fd7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/NotificationDialogMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NotificationDialogMessageParser } from '../../parser';
+
+export class NotificationDialogMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NotificationDialogMessageParser);
+ }
+
+ public getParser(): NotificationDialogMessageParser
+ {
+ return this.parser as NotificationDialogMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts
new file mode 100644
index 0000000..7262060
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { OfferRewardDeliveredMessageParser } from '../../parser';
+
+export class OfferRewardDeliveredMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, OfferRewardDeliveredMessageParser);
+ }
+
+ public getParser(): OfferRewardDeliveredMessageParser
+ {
+ return this.parser as OfferRewardDeliveredMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts b/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts
new file mode 100644
index 0000000..3bb1d11
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/PetLevelNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetLevelNotificationParser } from '../../parser';
+
+export class PetLevelNotificationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetLevelNotificationParser);
+ }
+
+ public getParser(): PetLevelNotificationParser
+ {
+ return this.parser as PetLevelNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts b/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts
new file mode 100644
index 0000000..88aa0fb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/PetPlacingErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetPlacingErrorEventParser } from '../../parser';
+
+export class PetPlacingErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetPlacingErrorEventParser);
+ }
+
+ public getParser(): PetPlacingErrorEventParser
+ {
+ return this.parser as PetPlacingErrorEventParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts
new file mode 100644
index 0000000..48767d1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/RestoreClientMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RestoreClientMessageParser } from '../../parser';
+
+export class RestoreClientMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RestoreClientMessageParser);
+ }
+
+ public getParser(): RestoreClientMessageParser
+ {
+ return this.parser as RestoreClientMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts b/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts
new file mode 100644
index 0000000..11373d9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/SimpleAlertMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SimpleAlertMessageParser } from '../../parser';
+
+export class SimpleAlertMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SimpleAlertMessageParser);
+ }
+
+ public getParser(): SimpleAlertMessageParser
+ {
+ return this.parser as SimpleAlertMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts b/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts
new file mode 100644
index 0000000..9807fb1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/UnseenItemsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UnseenItemsParser } from '../../parser';
+
+export class UnseenItemsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UnseenItemsParser);
+ }
+
+ public getParser(): UnseenItemsParser
+ {
+ return this.parser as UnseenItemsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/notifications/index.ts b/packages/communication/src/messages/incoming/notifications/index.ts
new file mode 100644
index 0000000..943253e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/notifications/index.ts
@@ -0,0 +1,17 @@
+export * from './AchievementNotificationMessageEvent';
+export * from './ActivityPointNotificationMessageEvent';
+export * from './BotErrorEvent';
+export * from './ClubGiftNotificationEvent';
+export * from './ConnectionErrorEvent';
+export * from './ElementPointerMessageEvent';
+export * from './HabboBroadcastMessageEvent';
+export * from './HotelWillShutdownEvent';
+export * from './InfoFeedEnableMessageEvent';
+export * from './MOTDNotificationEvent';
+export * from './NotificationDialogMessageEvent';
+export * from './OfferRewardDeliveredMessageEvent';
+export * from './PetLevelNotificationEvent';
+export * from './PetPlacingErrorEvent';
+export * from './RestoreClientMessageEvent';
+export * from './SimpleAlertMessageEvent';
+export * from './UnseenItemsEvent';
diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts
new file mode 100644
index 0000000..6d1c7d9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGift.ts
@@ -0,0 +1,37 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+import { ProductOffer } from './ProductOffer';
+
+export class NewUserExperienceGift
+{
+ private _thumbnailUrl: string;
+ private _productOfferList: ProductOffer[];
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ this._thumbnailUrl = wrapper.readString();
+ if(this._thumbnailUrl == '')
+ {
+ this._thumbnailUrl = null;
+ }
+
+ this._productOfferList = [];
+ const count:number = wrapper.readInt();
+ let index = 0;
+
+ while(index < count)
+ {
+ this._productOfferList.push(new ProductOffer(wrapper));
+ index++;
+ }
+ }
+
+ public get productOfferList(): ProductOffer[]
+ {
+ return this._productOfferList;
+ }
+
+ public get thumbnailUrl(): string
+ {
+ return this._thumbnailUrl;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts
new file mode 100644
index 0000000..91b5672
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NewUserExperienceGiftOfferMessageParser } from '../../parser/nux';
+
+export class NewUserExperienceGiftOfferMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NewUserExperienceGiftOfferMessageParser);
+ }
+
+ public getParser(): NewUserExperienceGiftOfferMessageParser
+ {
+ return this.parser as NewUserExperienceGiftOfferMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts
new file mode 100644
index 0000000..d15d7ce
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceGiftOptions.ts
@@ -0,0 +1,40 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+import { NewUserExperienceGift } from './NewUserExperienceGift';
+
+export class NewUserExperienceGiftOptions
+{
+ private _dayIndex: number;
+ private _stepIndex: number;
+ private _options: NewUserExperienceGift[];
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ this._dayIndex = wrapper.readInt();
+ this._stepIndex = wrapper.readInt();
+ this._options = [];
+
+ const count:number = wrapper.readInt();
+ let index = 0;
+
+ while(index < count)
+ {
+ this._options.push(new NewUserExperienceGift(wrapper));
+ index++;
+ }
+ }
+
+ public get dayIndex(): number
+ {
+ return this._dayIndex;
+ }
+
+ public get stepIndex(): number
+ {
+ return this._stepIndex;
+ }
+
+ public get options(): NewUserExperienceGift[]
+ {
+ return this._options;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts b/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts
new file mode 100644
index 0000000..2205caf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NewUserExperienceNotCompleteParser } from '../../parser/nux';
+
+export class NewUserExperienceNotCompleteEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NewUserExperienceNotCompleteParser);
+ }
+
+ public getParser(): NewUserExperienceNotCompleteParser
+ {
+ return this.parser as NewUserExperienceNotCompleteParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/nux/ProductOffer.ts b/packages/communication/src/messages/incoming/nux/ProductOffer.ts
new file mode 100644
index 0000000..ae1ce97
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/ProductOffer.ts
@@ -0,0 +1,28 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+
+export class ProductOffer
+{
+ private _itemName: string;
+ private _extraInfo: string;
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ this._itemName = wrapper.readString();
+ this._extraInfo = wrapper.readString();
+
+ if(this._extraInfo == '')
+ {
+ this._extraInfo = null;
+ }
+ }
+
+ public get itemName(): string
+ {
+ return this._itemName;
+ }
+
+ public get extraInfo(): string
+ {
+ return this._extraInfo;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/nux/index.ts b/packages/communication/src/messages/incoming/nux/index.ts
new file mode 100644
index 0000000..731f00d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/nux/index.ts
@@ -0,0 +1,5 @@
+export * from './NewUserExperienceGift';
+export * from './NewUserExperienceGiftOfferMessageEvent';
+export * from './NewUserExperienceGiftOptions';
+export * from './NewUserExperienceNotCompleteEvent';
+export * from './ProductOffer';
diff --git a/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts b/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts
new file mode 100644
index 0000000..a4d257f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/perk/PerkAllowancesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PerkAllowancesMessageParser } from './../../parser';
+
+export class PerkAllowancesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PerkAllowancesMessageParser);
+ }
+
+ public getParser(): PerkAllowancesMessageParser
+ {
+ return this.parser as PerkAllowancesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/perk/index.ts b/packages/communication/src/messages/incoming/perk/index.ts
new file mode 100644
index 0000000..b19fe4b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/perk/index.ts
@@ -0,0 +1 @@
+export * from './PerkAllowancesMessageEvent';
diff --git a/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts b/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts
new file mode 100644
index 0000000..e1650c7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { OpenPetPackageRequestedMessageParser } from './../../parser';
+
+export class OpenPetPackageRequestedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, OpenPetPackageRequestedMessageParser);
+ }
+
+ public getParser(): OpenPetPackageRequestedMessageParser
+ {
+ return this.parser as OpenPetPackageRequestedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts b/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts
new file mode 100644
index 0000000..aa6b5d8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { OpenPetPackageResultMessageParser } from './../../parser';
+
+export class OpenPetPackageResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, OpenPetPackageResultMessageParser);
+ }
+
+ public getParser(): OpenPetPackageResultMessageParser
+ {
+ return this.parser as OpenPetPackageResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts
new file mode 100644
index 0000000..ca2a8cb
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/PetLevelUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetLevelUpdateMessageParser } from '../../parser';
+
+export class PetLevelUpdateMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetLevelUpdateMessageParser);
+ }
+
+ public getParser(): PetLevelUpdateMessageParser
+ {
+ return this.parser as PetLevelUpdateMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts
new file mode 100644
index 0000000..0571742
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/PetScratchFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetScratchFailedMessageParser } from './../../parser';
+
+export class PetScratchFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetScratchFailedMessageParser);
+ }
+
+ public getParser(): PetScratchFailedMessageParser
+ {
+ return this.parser as PetScratchFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts b/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts
new file mode 100644
index 0000000..0825b29
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/PetTrainingPanelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetTrainingMessageParser } from './../../parser';
+
+export class PetTrainingPanelMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetTrainingMessageParser);
+ }
+
+ public getParser(): PetTrainingMessageParser
+ {
+ return this.parser as PetTrainingMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts b/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts
new file mode 100644
index 0000000..0f8cb1f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetBreedingMessageParser } from './../../../parser';
+
+export class PetBreedingMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetBreedingMessageParser);
+ }
+
+ public getParser(): PetBreedingMessageParser
+ {
+ return this.parser as PetBreedingMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/pet/breeding/index.ts b/packages/communication/src/messages/incoming/pet/breeding/index.ts
new file mode 100644
index 0000000..c18ef67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/breeding/index.ts
@@ -0,0 +1 @@
+export * from './PetBreedingMessageEvent';
diff --git a/packages/communication/src/messages/incoming/pet/index.ts b/packages/communication/src/messages/incoming/pet/index.ts
new file mode 100644
index 0000000..d5fb00b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/pet/index.ts
@@ -0,0 +1,6 @@
+export * from './breeding';
+export * from './OpenPetPackageRequestedMessageEvent';
+export * from './OpenPetPackageResultMessageEvent';
+export * from './PetLevelUpdateMessageEvent';
+export * from './PetScratchFailedMessageEvent';
+export * from './PetTrainingPanelMessageEvent';
diff --git a/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts b/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts
new file mode 100644
index 0000000..1c241a2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/PollContentsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PollContentsParser } from '../../parser';
+
+export class PollContentsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PollContentsParser);
+ }
+
+ public getParser(): PollContentsParser
+ {
+ return this.parser as PollContentsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts b/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts
new file mode 100644
index 0000000..9a4b478
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/PollErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PollErrorParser } from '../../parser';
+
+export class PollErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PollErrorParser);
+ }
+
+ public getParser(): PollErrorParser
+ {
+ return this.parser as PollErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts b/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts
new file mode 100644
index 0000000..b72ea66
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/PollOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PollOfferParser } from '../../parser';
+
+export class PollOfferEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PollOfferParser);
+ }
+
+ public getParser(): PollOfferParser
+ {
+ return this.parser as PollOfferParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts
new file mode 100644
index 0000000..7dd889f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/QuestionAnsweredEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestionAnsweredParser } from '../../parser';
+
+export class QuestionAnsweredEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestionAnsweredParser);
+ }
+
+ public getParser(): QuestionAnsweredParser
+ {
+ return this.parser as QuestionAnsweredParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/QuestionEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionEvent.ts
new file mode 100644
index 0000000..6a9b153
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/QuestionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestionParser } from '../../parser';
+
+export class QuestionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestionParser);
+ }
+
+ public getParser(): QuestionParser
+ {
+ return this.parser as QuestionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts b/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts
new file mode 100644
index 0000000..21b0226
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/QuestionFinishedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestionFinishedParser } from '../../parser';
+
+export class QuestionFinishedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestionFinishedParser);
+ }
+
+ public getParser(): QuestionFinishedParser
+ {
+ return this.parser as QuestionFinishedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts b/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts
new file mode 100644
index 0000000..dbafbf6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/RoomPollResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomPollResultParser } from '../../parser';
+
+export class RoomPollResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomPollResultParser);
+ }
+
+ public getParser(): RoomPollResultParser
+ {
+ return this.parser as RoomPollResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts b/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts
new file mode 100644
index 0000000..c7d5cfc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/StartRoomPollEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomPollDataParser } from '../../parser';
+
+export class StartRoomPollEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomPollDataParser);
+ }
+
+ public getParser(): RoomPollDataParser
+ {
+ return this.parser as RoomPollDataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/poll/index.ts b/packages/communication/src/messages/incoming/poll/index.ts
new file mode 100644
index 0000000..a90c6f5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/poll/index.ts
@@ -0,0 +1,8 @@
+export * from './PollContentsEvent';
+export * from './PollErrorEvent';
+export * from './PollOfferEvent';
+export * from './QuestionAnsweredEvent';
+export * from './QuestionEvent';
+export * from './QuestionFinishedEvent';
+export * from './RoomPollResultEvent';
+export * from './StartRoomPollEvent';
diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts
new file mode 100644
index 0000000..7bf00ee
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CommunityGoalEarnedPrizesMessageParser } from '../../parser';
+
+export class CommunityGoalEarnedPrizesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CommunityGoalEarnedPrizesMessageParser);
+ }
+
+ public getParser(): CommunityGoalEarnedPrizesMessageParser
+ {
+ return this.parser as CommunityGoalEarnedPrizesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts
new file mode 100644
index 0000000..bb4c09e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CommunityGoalHallOfFameMessageParser } from '../../parser';
+
+export class CommunityGoalHallOfFameMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CommunityGoalHallOfFameMessageParser);
+ }
+
+ public getParser(): CommunityGoalHallOfFameMessageParser
+ {
+ return this.parser as CommunityGoalHallOfFameMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts b/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts
new file mode 100644
index 0000000..4f3ebd1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CommunityGoalProgressMessageParser } from '../../parser';
+
+export class CommunityGoalProgressMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CommunityGoalProgressMessageParser);
+ }
+
+ public getParser(): CommunityGoalProgressMessageParser
+ {
+ return this.parser as CommunityGoalProgressMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts b/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts
new file mode 100644
index 0000000..1684a75
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ConcurrentUsersGoalProgressMessageParser } from '../../parser';
+
+export class ConcurrentUsersGoalProgressMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ConcurrentUsersGoalProgressMessageParser);
+ }
+
+ public getParser(): ConcurrentUsersGoalProgressMessageParser
+ {
+ return this.parser as ConcurrentUsersGoalProgressMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts b/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts
new file mode 100644
index 0000000..6812fdc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/EpicPopupMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { EpicPopupMessageParser } from '../../parser';
+
+export class EpicPopupMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, EpicPopupMessageParser);
+ }
+
+ public getParser(): EpicPopupMessageParser
+ {
+ return this.parser as EpicPopupMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts
new file mode 100644
index 0000000..1c00e67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/QuestCancelledMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestCancelledMessageParser } from '../../parser';
+
+export class QuestCancelledMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestCancelledMessageParser);
+ }
+
+ public getParser(): QuestCancelledMessageParser
+ {
+ return this.parser as QuestCancelledMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts
new file mode 100644
index 0000000..c864e81
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/QuestCompletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestCompletedMessageParser } from '../../parser';
+
+export class QuestCompletedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestCompletedMessageParser);
+ }
+
+ public getParser(): QuestCompletedMessageParser
+ {
+ return this.parser as QuestCompletedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts
new file mode 100644
index 0000000..97299a5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/QuestDailyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestDailyMessageParser } from '../../parser';
+
+export class QuestDailyMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestDailyMessageParser);
+ }
+
+ public getParser(): QuestDailyMessageParser
+ {
+ return this.parser as QuestDailyMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts
new file mode 100644
index 0000000..a592186
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/QuestMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestMessageParser } from '../../parser';
+
+export class QuestMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestMessageParser);
+ }
+
+ public getParser(): QuestMessageParser
+ {
+ return this.parser as QuestMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts b/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts
new file mode 100644
index 0000000..cbdadef
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/QuestsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { QuestsMessageParser } from '../../parser';
+
+export class QuestsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, QuestsMessageParser);
+ }
+
+ public getParser(): QuestsMessageParser
+ {
+ return this.parser as QuestsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts b/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts
new file mode 100644
index 0000000..f2417b5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/SeasonalQuestsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { SeasonalQuestsParser } from '../../parser';
+
+export class SeasonalQuestsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, SeasonalQuestsParser);
+ }
+
+ public getParser(): SeasonalQuestsParser
+ {
+ return this.parser as SeasonalQuestsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/quest/index.ts b/packages/communication/src/messages/incoming/quest/index.ts
new file mode 100644
index 0000000..f2b8707
--- /dev/null
+++ b/packages/communication/src/messages/incoming/quest/index.ts
@@ -0,0 +1,11 @@
+export * from './CommunityGoalEarnedPrizesMessageEvent';
+export * from './CommunityGoalHallOfFameMessageEvent';
+export * from './CommunityGoalProgressMessageEvent';
+export * from './ConcurrentUsersGoalProgressMessageEvent';
+export * from './EpicPopupMessageEvent';
+export * from './QuestCancelledMessageEvent';
+export * from './QuestCompletedMessageEvent';
+export * from './QuestDailyMessageEvent';
+export * from './QuestMessageEvent';
+export * from './QuestsMessageEvent';
+export * from './SeasonalQuestsMessageEvent';
diff --git a/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts b/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts
new file mode 100644
index 0000000..eb5f1e9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts
@@ -0,0 +1,19 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RecyclerFinishedMessageParser } from '../../parser';
+
+export class RecyclerFinishedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ public static readonly FINISHED_OK: number = 1;
+ public static readonly FINISHED_FAIL: number = 2;
+
+ constructor(callBack: Function)
+ {
+ super(callBack, RecyclerFinishedMessageParser);
+ }
+
+ public getParser(): RecyclerFinishedMessageParser
+ {
+ return this.parser as RecyclerFinishedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts b/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts
new file mode 100644
index 0000000..69f3c94
--- /dev/null
+++ b/packages/communication/src/messages/incoming/recycler/RecyclerStatusMessageEvent.ts
@@ -0,0 +1,20 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RecyclerStatusMessageParser } from '../../parser';
+
+export class RecyclerStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ public static readonly SYSTEM_STATUS_ENABLED: number = 1;
+ public static readonly SYSTEM_STATUS_DISABLED: number = 2;
+ public static readonly SYSTEM_STATUS_TIMEOUT: number = 3;
+
+ constructor(callBack: Function)
+ {
+ super(callBack, RecyclerStatusMessageParser);
+ }
+
+ public getParser(): RecyclerStatusMessageParser
+ {
+ return this.parser as RecyclerStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/recycler/index.ts b/packages/communication/src/messages/incoming/recycler/index.ts
new file mode 100644
index 0000000..b6f40ee
--- /dev/null
+++ b/packages/communication/src/messages/incoming/recycler/index.ts
@@ -0,0 +1,2 @@
+export * from './RecyclerFinishedMessageEvent';
+export * from './RecyclerStatusMessageEvent';
diff --git a/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts
new file mode 100644
index 0000000..8728f86
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/RoomEnterErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CantConnectMessageParser } from '../../../parser';
+
+export class RoomEnterErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CantConnectMessageParser);
+ }
+
+ public getParser(): CantConnectMessageParser
+ {
+ return this.parser as CantConnectMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts
new file mode 100644
index 0000000..f4d23b0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/RoomEnterEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomEnterParser } from '../../../parser';
+
+export class RoomEnterEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomEnterParser);
+ }
+
+ public getParser(): RoomEnterParser
+ {
+ return this.parser as RoomEnterParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts b/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts
new file mode 100644
index 0000000..d36e606
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/RoomForwardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomFowardParser as RoomForwardParser } from '../../../parser';
+
+export class RoomForwardEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomForwardParser);
+ }
+
+ public getParser(): RoomForwardParser
+ {
+ return this.parser as RoomForwardParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts b/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts
new file mode 100644
index 0000000..c504dc8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomDoorbellAcceptedParser } from '../../../../parser';
+
+export class RoomDoorbellAcceptedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomDoorbellAcceptedParser);
+ }
+
+ public getParser(): RoomDoorbellAcceptedParser
+ {
+ return this.parser as RoomDoorbellAcceptedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/doorbell/index.ts b/packages/communication/src/messages/incoming/room/access/doorbell/index.ts
new file mode 100644
index 0000000..ce67bee
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/doorbell/index.ts
@@ -0,0 +1 @@
+export * from './RoomDoorbellAcceptedEvent';
diff --git a/packages/communication/src/messages/incoming/room/access/index.ts b/packages/communication/src/messages/incoming/room/access/index.ts
new file mode 100644
index 0000000..0e1f2d7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/index.ts
@@ -0,0 +1,5 @@
+export * from './doorbell';
+export * from './rights';
+export * from './RoomEnterErrorEvent';
+export * from './RoomEnterEvent';
+export * from './RoomForwardEvent';
diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts
new file mode 100644
index 0000000..f35a282
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsClearEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomRightsClearParser } from '../../../../parser';
+
+export class RoomRightsClearEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomRightsClearParser);
+ }
+
+ public getParser(): RoomRightsClearParser
+ {
+ return this.parser as RoomRightsClearParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts
new file mode 100644
index 0000000..053909e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomRightsParser } from '../../../../parser';
+
+export class RoomRightsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomRightsParser);
+ }
+
+ public getParser(): RoomRightsParser
+ {
+ return this.parser as RoomRightsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts
new file mode 100644
index 0000000..c0bad6e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomRightsOwnerParser } from '../../../../parser';
+
+export class RoomRightsOwnerEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomRightsOwnerParser);
+ }
+
+ public getParser(): RoomRightsOwnerParser
+ {
+ return this.parser as RoomRightsOwnerParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/access/rights/index.ts b/packages/communication/src/messages/incoming/room/access/rights/index.ts
new file mode 100644
index 0000000..9569969
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/access/rights/index.ts
@@ -0,0 +1,3 @@
+export * from './RoomRightsClearEvent';
+export * from './RoomRightsEvent';
+export * from './RoomRightsOwnerEvent';
diff --git a/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts
new file mode 100644
index 0000000..e72008b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/bots/BotCommandConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotCommandConfigurationParser } from '../../../parser';
+
+export class BotCommandConfigurationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotCommandConfigurationParser);
+ }
+
+ public getParser(): BotCommandConfigurationParser
+ {
+ return this.parser as BotCommandConfigurationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts
new file mode 100644
index 0000000..beb5166
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotForceOpenContextMenuParser } from '../../../parser';
+
+export class BotForceOpenContextMenuEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotForceOpenContextMenuParser);
+ }
+
+ public getParser(): BotForceOpenContextMenuParser
+ {
+ return this.parser as BotForceOpenContextMenuParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts b/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts
new file mode 100644
index 0000000..4be59a7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/bots/BotSkillListUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BotSkillListUpdateParser } from '../../../parser';
+
+export class BotSkillListUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BotSkillListUpdateParser);
+ }
+
+ public getParser(): BotSkillListUpdateParser
+ {
+ return this.parser as BotSkillListUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/bots/index.ts b/packages/communication/src/messages/incoming/room/bots/index.ts
new file mode 100644
index 0000000..cae047b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/bots/index.ts
@@ -0,0 +1,3 @@
+export * from './BotCommandConfigurationEvent';
+export * from './BotForceOpenContextMenuEvent';
+export * from './BotSkillListUpdateEvent';
diff --git a/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts
new file mode 100644
index 0000000..0bddf54
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/data/RoomChatSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomChatSettingsParser } from '../../../parser';
+
+export class RoomChatSettingsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomChatSettingsParser);
+ }
+
+ public getParser(): RoomChatSettingsParser
+ {
+ return this.parser as RoomChatSettingsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts
new file mode 100644
index 0000000..52bb798
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomEntryInfoMessageParser } from '../../../parser';
+
+export class RoomEntryInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomEntryInfoMessageParser);
+ }
+
+ public getParser(): RoomEntryInfoMessageParser
+ {
+ return this.parser as RoomEntryInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts b/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts
new file mode 100644
index 0000000..1b61c3e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/data/RoomScoreEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomScoreParser } from '../../../parser';
+
+export class RoomScoreEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomScoreParser);
+ }
+
+ public getParser(): RoomScoreParser
+ {
+ return this.parser as RoomScoreParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/data/index.ts b/packages/communication/src/messages/incoming/room/data/index.ts
new file mode 100644
index 0000000..e0187f0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/data/index.ts
@@ -0,0 +1,3 @@
+export * from './RoomChatSettingsEvent';
+export * from './RoomEntryInfoMessageEvent';
+export * from './RoomScoreEvent';
diff --git a/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts
new file mode 100644
index 0000000..22d0673
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FavoriteMembershipUpdateMessageParser } from '../../../parser';
+
+export class FavoriteMembershipUpdateMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FavoriteMembershipUpdateMessageParser);
+ }
+
+ public getParser(): FavoriteMembershipUpdateMessageParser
+ {
+ return this.parser as FavoriteMembershipUpdateMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts b/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts
new file mode 100644
index 0000000..b437f67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ObjectsDataUpdateParser } from '../../../parser';
+
+export class ObjectsDataUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ObjectsDataUpdateParser);
+ }
+
+ public getParser(): ObjectsDataUpdateParser
+ {
+ return this.parser as ObjectsDataUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts b/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts
new file mode 100644
index 0000000..0933888
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/engine/ObjectsRollingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ObjectsRollingParser } from '../../../parser';
+
+export class ObjectsRollingEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ObjectsRollingParser);
+ }
+
+ public getParser(): ObjectsRollingParser
+ {
+ return this.parser as ObjectsRollingParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/engine/index.ts b/packages/communication/src/messages/incoming/room/engine/index.ts
new file mode 100644
index 0000000..24ceed5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/engine/index.ts
@@ -0,0 +1,3 @@
+export * from './FavoriteMembershipUpdateMessageEvent';
+export * from './ObjectsDataUpdateEvent';
+export * from './ObjectsRollingEvent';
diff --git a/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts
new file mode 100644
index 0000000..5d9985a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { CustomUserNotificationMessageParser } from '../../../parser';
+
+export class CustomUserNotificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, CustomUserNotificationMessageParser);
+ }
+
+ public getParser(): CustomUserNotificationMessageParser
+ {
+ return this.parser as CustomUserNotificationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts
new file mode 100644
index 0000000..f51f6ea
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/DiceValueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { DiceValueMessageParser } from '../../../parser';
+
+export class DiceValueMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, DiceValueMessageParser);
+ }
+
+ public getParser(): DiceValueMessageParser
+ {
+ return this.parser as DiceValueMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts
new file mode 100644
index 0000000..8bd9108
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurniRentOrBuyoutOfferMessageParser } from '../../../parser';
+
+export class FurniRentOrBuyoutOfferMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurniRentOrBuyoutOfferMessageParser);
+ }
+
+ public getParser(): FurniRentOrBuyoutOfferMessageParser
+ {
+ return this.parser as FurniRentOrBuyoutOfferMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts
new file mode 100644
index 0000000..889f2d1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureAliasesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureAliasesParser } from '../../../parser';
+
+export class FurnitureAliasesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureAliasesParser);
+ }
+
+ public getParser(): FurnitureAliasesParser
+ {
+ return this.parser as FurnitureAliasesParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts
new file mode 100644
index 0000000..2d79a96
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureDataParser } from '../../../parser';
+
+export class FurnitureDataEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureDataParser);
+ }
+
+ public getParser(): FurnitureDataParser
+ {
+ return this.parser as FurnitureDataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts b/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts
new file mode 100644
index 0000000..a3567b5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureStackHeightParser } from '../../../parser';
+
+export class FurnitureStackHeightEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureStackHeightParser);
+ }
+
+ public getParser(): FurnitureStackHeightParser
+ {
+ return this.parser as FurnitureStackHeightParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts
new file mode 100644
index 0000000..39ae2e4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupFurniContextMenuInfoMessageParser } from '../../../parser';
+
+export class GroupFurniContextMenuInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupFurniContextMenuInfoMessageParser);
+ }
+
+ public getParser(): GroupFurniContextMenuInfoMessageParser
+ {
+ return this.parser as GroupFurniContextMenuInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts
new file mode 100644
index 0000000..93b5b53
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ItemDataUpdateMessageParser } from '../../../parser';
+
+export class ItemDataUpdateMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ItemDataUpdateMessageParser);
+ }
+
+ public getParser(): ItemDataUpdateMessageParser
+ {
+ return this.parser as ItemDataUpdateMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts
new file mode 100644
index 0000000..f11a0a4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LoveLockFurniFinishedParser } from '../../../parser';
+
+export class LoveLockFurniFinishedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LoveLockFurniFinishedParser);
+ }
+
+ public getParser(): LoveLockFurniFinishedParser
+ {
+ return this.parser as LoveLockFurniFinishedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts
new file mode 100644
index 0000000..a957f9d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LoveLockFurniFriendConfirmedParser } from '../../../parser';
+
+export class LoveLockFurniFriendConfirmedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LoveLockFurniFriendConfirmedParser);
+ }
+
+ public getParser(): LoveLockFurniFriendConfirmedParser
+ {
+ return this.parser as LoveLockFurniFriendConfirmedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts
new file mode 100644
index 0000000..d096e0a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { LoveLockFurniStartParser } from '../../../parser';
+
+export class LoveLockFurniStartEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, LoveLockFurniStartParser);
+ }
+
+ public getParser(): LoveLockFurniStartParser
+ {
+ return this.parser as LoveLockFurniStartParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts
new file mode 100644
index 0000000..47c94aa
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { OneWayDoorStatusMessageParser } from '../../../parser';
+
+export class OneWayDoorStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, OneWayDoorStatusMessageParser);
+ }
+
+ public getParser(): OneWayDoorStatusMessageParser
+ {
+ return this.parser as OneWayDoorStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts
new file mode 100644
index 0000000..7d89a75
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RentableSpaceRentFailedMessageParser } from '../../../parser';
+
+export class RentableSpaceRentFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RentableSpaceRentFailedMessageParser);
+ }
+
+ public getParser(): RentableSpaceRentFailedMessageParser
+ {
+ return this.parser as RentableSpaceRentFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts
new file mode 100644
index 0000000..4f4411b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RentableSpaceRentOkMessageParser } from '../../../parser';
+
+export class RentableSpaceRentOkMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RentableSpaceRentOkMessageParser);
+ }
+
+ public getParser(): RentableSpaceRentOkMessageParser
+ {
+ return this.parser as RentableSpaceRentOkMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts
new file mode 100644
index 0000000..144901f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RentableSpaceStatusMessageParser } from '../../../parser';
+
+export class RentableSpaceStatusMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RentableSpaceStatusMessageParser);
+ }
+
+ public getParser(): RentableSpaceStatusMessageParser
+ {
+ return this.parser as RentableSpaceStatusMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts
new file mode 100644
index 0000000..a56e186
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RequestSpamWallPostItMessageParser } from '../../../parser';
+
+export class RequestSpamWallPostItMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RequestSpamWallPostItMessageParser);
+ }
+
+ public getParser(): RequestSpamWallPostItMessageParser
+ {
+ return this.parser as RequestSpamWallPostItMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts
new file mode 100644
index 0000000..f2bc75c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomDimmerPresetsMessageParser } from '../../../parser';
+
+export class RoomDimmerPresetsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomDimmerPresetsMessageParser);
+ }
+
+ public getParser(): RoomDimmerPresetsMessageParser
+ {
+ return this.parser as RoomDimmerPresetsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts
new file mode 100644
index 0000000..38ec773
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomMessageNotificationMessageParser } from '../../../parser';
+
+export class RoomMessageNotificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomMessageNotificationMessageParser);
+ }
+
+ public getParser(): RoomMessageNotificationMessageParser
+ {
+ return this.parser as RoomMessageNotificationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts b/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts
new file mode 100644
index 0000000..f5d2f84
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WelcomeGiftStatusParser } from '../../../parser';
+
+export class WelcomeGiftStatusEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WelcomeGiftStatusParser);
+ }
+
+ public getParser(): WelcomeGiftStatusParser
+ {
+ return this.parser as WelcomeGiftStatusParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts
new file mode 100644
index 0000000..7110566
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureFloorAddParser } from '../../../../parser';
+
+export class FurnitureFloorAddEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureFloorAddParser);
+ }
+
+ public getParser(): FurnitureFloorAddParser
+ {
+ return this.parser as FurnitureFloorAddParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts
new file mode 100644
index 0000000..aa306ad
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureFloorParser } from '../../../../parser';
+
+export class FurnitureFloorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureFloorParser);
+ }
+
+ public getParser(): FurnitureFloorParser
+ {
+ return this.parser as FurnitureFloorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts
new file mode 100644
index 0000000..2e52e7d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureFloorRemoveParser } from '../../../../parser';
+
+export class FurnitureFloorRemoveEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureFloorRemoveParser);
+ }
+
+ public getParser(): FurnitureFloorRemoveParser
+ {
+ return this.parser as FurnitureFloorRemoveParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts
new file mode 100644
index 0000000..649a919
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureFloorUpdateParser } from '../../../../parser';
+
+export class FurnitureFloorUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureFloorUpdateParser);
+ }
+
+ public getParser(): FurnitureFloorUpdateParser
+ {
+ return this.parser as FurnitureFloorUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/floor/index.ts b/packages/communication/src/messages/incoming/room/furniture/floor/index.ts
new file mode 100644
index 0000000..4b0cb67
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/floor/index.ts
@@ -0,0 +1,4 @@
+export * from './FurnitureFloorAddEvent';
+export * from './FurnitureFloorEvent';
+export * from './FurnitureFloorRemoveEvent';
+export * from './FurnitureFloorUpdateEvent';
diff --git a/packages/communication/src/messages/incoming/room/furniture/index.ts b/packages/communication/src/messages/incoming/room/furniture/index.ts
new file mode 100644
index 0000000..3926d97
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/index.ts
@@ -0,0 +1,22 @@
+export * from './CustomUserNotificationMessageEvent';
+export * from './DiceValueMessageEvent';
+export * from './floor';
+export * from './FurniRentOrBuyoutOfferMessageEvent';
+export * from './FurnitureAliasesEvent';
+export * from './FurnitureDataEvent';
+export * from './FurnitureStackHeightEvent';
+export * from './GroupFurniContextMenuInfoMessageEvent';
+export * from './ItemDataUpdateMessageEvent';
+export * from './LoveLockFurniFinishedEvent';
+export * from './LoveLockFurniFriendConfirmedEvent';
+export * from './LoveLockFurniStartEvent';
+export * from './OneWayDoorStatusMessageEvent';
+export * from './RentableSpaceRentFailedMessageEvent';
+export * from './RentableSpaceRentOkMessageEvent';
+export * from './RentableSpaceStatusMessageEvent';
+export * from './RequestSpamWallPostItMessageEvent';
+export * from './RoomDimmerPresetsMessageEvent';
+export * from './RoomMessageNotificationMessageEvent';
+export * from './wall';
+export * from './WelcomeGiftStatusEvent';
+export * from './youtube';
diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts
new file mode 100644
index 0000000..65ed984
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureWallAddParser } from '../../../../parser';
+
+export class FurnitureWallAddEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureWallAddParser);
+ }
+
+ public getParser(): FurnitureWallAddParser
+ {
+ return this.parser as FurnitureWallAddParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts
new file mode 100644
index 0000000..9fa41de
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureWallParser } from '../../../../parser';
+
+export class FurnitureWallEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureWallParser);
+ }
+
+ public getParser(): FurnitureWallParser
+ {
+ return this.parser as FurnitureWallParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts
new file mode 100644
index 0000000..629bea0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureWallRemoveParser } from '../../../../parser';
+
+export class FurnitureWallRemoveEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureWallRemoveParser);
+ }
+
+ public getParser(): FurnitureWallRemoveParser
+ {
+ return this.parser as FurnitureWallRemoveParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts
new file mode 100644
index 0000000..9de2f54
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FurnitureWallUpdateParser } from '../../../../parser';
+
+export class FurnitureWallUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FurnitureWallUpdateParser);
+ }
+
+ public getParser(): FurnitureWallUpdateParser
+ {
+ return this.parser as FurnitureWallUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/wall/index.ts b/packages/communication/src/messages/incoming/room/furniture/wall/index.ts
new file mode 100644
index 0000000..3065491
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/wall/index.ts
@@ -0,0 +1,4 @@
+export * from './FurnitureWallAddEvent';
+export * from './FurnitureWallEvent';
+export * from './FurnitureWallRemoveEvent';
+export * from './FurnitureWallUpdateEvent';
diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts
new file mode 100644
index 0000000..07bd036
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { YoutubeControlVideoMessageParser } from '../../../../parser';
+
+export class YoutubeControlVideoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, YoutubeControlVideoMessageParser);
+ }
+
+ public getParser(): YoutubeControlVideoMessageParser
+ {
+ return this.parser as YoutubeControlVideoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts
new file mode 100644
index 0000000..e0cc322
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { YoutubeDisplayPlaylistsMessageParser } from '../../../../parser';
+
+export class YoutubeDisplayPlaylistsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, YoutubeDisplayPlaylistsMessageParser);
+ }
+
+ public getParser(): YoutubeDisplayPlaylistsMessageParser
+ {
+ return this.parser as YoutubeDisplayPlaylistsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts
new file mode 100644
index 0000000..c5d0808
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { YoutubeDisplayVideoMessageParser } from '../../../../parser';
+
+export class YoutubeDisplayVideoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, YoutubeDisplayVideoMessageParser);
+ }
+
+ public getParser(): YoutubeDisplayVideoMessageParser
+ {
+ return this.parser as YoutubeDisplayVideoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts b/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts
new file mode 100644
index 0000000..4bb22a3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/furniture/youtube/index.ts
@@ -0,0 +1,3 @@
+export * from './YoutubeControlVideoMessageEvent';
+export * from './YoutubeDisplayPlaylistsEvent';
+export * from './YoutubeDisplayVideoMessageEvent';
diff --git a/packages/communication/src/messages/incoming/room/index.ts b/packages/communication/src/messages/incoming/room/index.ts
new file mode 100644
index 0000000..81b327b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/index.ts
@@ -0,0 +1,15 @@
+export * from './access';
+export * from './access/doorbell';
+export * from './access/rights';
+export * from './bots';
+export * from './data';
+export * from './engine';
+export * from './furniture';
+export * from './furniture/floor';
+export * from './furniture/wall';
+export * from './furniture/youtube';
+export * from './mapping';
+export * from './pet';
+export * from './session';
+export * from './unit';
+export * from './unit/chat';
diff --git a/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts b/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts
new file mode 100644
index 0000000..49f3e01
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/FloorHeightMapEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FloorHeightMapMessageParser } from '../../../parser';
+
+export class FloorHeightMapEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FloorHeightMapMessageParser);
+ }
+
+ public getParser(): FloorHeightMapMessageParser
+ {
+ return this.parser as FloorHeightMapMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts
new file mode 100644
index 0000000..b398781
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomEntryTileMessageParser } from '../../../parser';
+
+export class RoomEntryTileMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomEntryTileMessageParser);
+ }
+
+ public getParser(): RoomEntryTileMessageParser
+ {
+ return this.parser as RoomEntryTileMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts
new file mode 100644
index 0000000..022ff6e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomHeightMapParser } from '../../../parser';
+
+export class RoomHeightMapEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomHeightMapParser);
+ }
+
+ public getParser(): RoomHeightMapParser
+ {
+ return this.parser as RoomHeightMapParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts
new file mode 100644
index 0000000..89892ae
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomHeightMapUpdateParser } from '../../../parser';
+
+export class RoomHeightMapUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomHeightMapUpdateParser);
+ }
+
+ public getParser(): RoomHeightMapUpdateParser
+ {
+ return this.parser as RoomHeightMapUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts
new file mode 100644
index 0000000..d58d1e9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomOccupiedTilesMessageParser } from '../../../parser';
+
+export class RoomOccupiedTilesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomOccupiedTilesMessageParser);
+ }
+
+ public getParser(): RoomOccupiedTilesMessageParser
+ {
+ return this.parser as RoomOccupiedTilesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts
new file mode 100644
index 0000000..c6a81e6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomPaintEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomPaintParser } from '../../../parser';
+
+export class RoomPaintEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomPaintParser);
+ }
+
+ public getParser(): RoomPaintParser
+ {
+ return this.parser as RoomPaintParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts
new file mode 100644
index 0000000..9866d91
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomReadyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomReadyMessageParser } from '../../../parser';
+
+export class RoomReadyMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomReadyMessageParser);
+ }
+
+ public getParser(): RoomReadyMessageParser
+ {
+ return this.parser as RoomReadyMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts b/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts
new file mode 100644
index 0000000..2c43b55
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomVisualizationSettingsParser } from '../../../parser';
+
+export class RoomVisualizationSettingsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomVisualizationSettingsParser);
+ }
+
+ public getParser(): RoomVisualizationSettingsParser
+ {
+ return this.parser as RoomVisualizationSettingsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/mapping/index.ts b/packages/communication/src/messages/incoming/room/mapping/index.ts
new file mode 100644
index 0000000..1ada5b8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/mapping/index.ts
@@ -0,0 +1,8 @@
+export * from './FloorHeightMapEvent';
+export * from './RoomEntryTileMessageEvent';
+export * from './RoomHeightMapEvent';
+export * from './RoomHeightMapUpdateEvent';
+export * from './RoomOccupiedTilesMessageEvent';
+export * from './RoomPaintEvent';
+export * from './RoomReadyMessageEvent';
+export * from './RoomVisualizationSettingsEvent';
diff --git a/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts
new file mode 100644
index 0000000..15427aa
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/PetBreedingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetBreedingResultParser } from '../../../parser';
+
+export class PetBreedingResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetBreedingResultParser);
+ }
+
+ public getParser(): PetBreedingResultParser
+ {
+ return this.parser as PetBreedingResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts
new file mode 100644
index 0000000..e62fb70
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/PetExperienceEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetExperienceParser } from '../../../parser';
+
+export class PetExperienceEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetExperienceParser);
+ }
+
+ public getParser(): PetExperienceParser
+ {
+ return this.parser as PetExperienceParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts
new file mode 100644
index 0000000..de538ae
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/PetFigureUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetFigureUpdateParser } from '../../../parser';
+
+export class PetFigureUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetFigureUpdateParser);
+ }
+
+ public getParser(): PetFigureUpdateParser
+ {
+ return this.parser as PetFigureUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts
new file mode 100644
index 0000000..3e42bcf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/PetInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetInfoParser } from '../../../parser';
+
+export class PetInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetInfoParser);
+ }
+
+ public getParser(): PetInfoParser
+ {
+ return this.parser as PetInfoParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts b/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts
new file mode 100644
index 0000000..587b126
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/PetStatusUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetStatusUpdateParser } from '../../../parser';
+
+export class PetStatusUpdateEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetStatusUpdateParser);
+ }
+
+ public getParser(): PetStatusUpdateParser
+ {
+ return this.parser as PetStatusUpdateParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/pet/index.ts b/packages/communication/src/messages/incoming/room/pet/index.ts
new file mode 100644
index 0000000..e43bd92
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/pet/index.ts
@@ -0,0 +1,5 @@
+export * from './PetBreedingResultEvent';
+export * from './PetExperienceEvent';
+export * from './PetFigureUpdateEvent';
+export * from './PetInfoEvent';
+export * from './PetStatusUpdateEvent';
diff --git a/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts b/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts
new file mode 100644
index 0000000..a895b58
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/session/YouArePlayingGameEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { YouArePlayingGameParser } from '../../../parser';
+
+export class YouArePlayingGameEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, YouArePlayingGameParser);
+ }
+
+ public getParser(): YouArePlayingGameParser
+ {
+ return this.parser as YouArePlayingGameParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts b/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts
new file mode 100644
index 0000000..70a0067
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { YouAreSpectatorMessageParser } from '../../../parser';
+
+export class YouAreSpectatorMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, YouAreSpectatorMessageParser);
+ }
+
+ public getParser(): YouAreSpectatorMessageParser
+ {
+ return this.parser as YouAreSpectatorMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/session/index.ts b/packages/communication/src/messages/incoming/room/session/index.ts
new file mode 100644
index 0000000..0ac722b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/session/index.ts
@@ -0,0 +1,2 @@
+export * from './YouArePlayingGameEvent';
+export * from './YouAreSpectatorMessageEvent';
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts
new file mode 100644
index 0000000..3c2bc06
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitDanceEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitDanceParser } from '../../../parser';
+
+export class RoomUnitDanceEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitDanceParser);
+ }
+
+ public getParser(): RoomUnitDanceParser
+ {
+ return this.parser as RoomUnitDanceParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts
new file mode 100644
index 0000000..933d21a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitEffectEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitEffectParser } from '../../../parser';
+
+export class RoomUnitEffectEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitEffectParser);
+ }
+
+ public getParser(): RoomUnitEffectParser
+ {
+ return this.parser as RoomUnitEffectParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts
new file mode 100644
index 0000000..37a5e09
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitParser } from '../../../parser';
+
+export class RoomUnitEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitParser);
+ }
+
+ public getParser(): RoomUnitParser
+ {
+ return this.parser as RoomUnitParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts
new file mode 100644
index 0000000..f42becf
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitExpressionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitExpressionParser } from '../../../parser';
+
+export class RoomUnitExpressionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitExpressionParser);
+ }
+
+ public getParser(): RoomUnitExpressionParser
+ {
+ return this.parser as RoomUnitExpressionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts
new file mode 100644
index 0000000..dd7a431
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitHandItemParser } from '../../../parser';
+
+export class RoomUnitHandItemEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitHandItemParser);
+ }
+
+ public getParser(): RoomUnitHandItemParser
+ {
+ return this.parser as RoomUnitHandItemParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts
new file mode 100644
index 0000000..05548cd
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitHandItemReceivedParser } from '../../../parser';
+
+export class RoomUnitHandItemReceivedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitHandItemReceivedParser);
+ }
+
+ public getParser(): RoomUnitHandItemReceivedParser
+ {
+ return this.parser as RoomUnitHandItemReceivedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts
new file mode 100644
index 0000000..263e64f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitIdleEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitIdleParser } from '../../../parser';
+
+export class RoomUnitIdleEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitIdleParser);
+ }
+
+ public getParser(): RoomUnitIdleParser
+ {
+ return this.parser as RoomUnitIdleParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts
new file mode 100644
index 0000000..f4f91aa
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitInfoParser } from '../../../parser';
+
+export class RoomUnitInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitInfoParser);
+ }
+
+ public getParser(): RoomUnitInfoParser
+ {
+ return this.parser as RoomUnitInfoParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts
new file mode 100644
index 0000000..cd2f0e8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitNumberEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitNumberParser } from '../../../parser';
+
+export class RoomUnitNumberEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitNumberParser);
+ }
+
+ public getParser(): RoomUnitNumberParser
+ {
+ return this.parser as RoomUnitNumberParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts
new file mode 100644
index 0000000..1c55487
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitRemoveParser } from '../../../parser';
+
+export class RoomUnitRemoveEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitRemoveParser);
+ }
+
+ public getParser(): RoomUnitRemoveParser
+ {
+ return this.parser as RoomUnitRemoveParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts b/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts
new file mode 100644
index 0000000..290b337
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/RoomUnitStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitStatusParser } from '../../../parser';
+
+export class RoomUnitStatusEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitStatusParser);
+ }
+
+ public getParser(): RoomUnitStatusParser
+ {
+ return this.parser as RoomUnitStatusParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts
new file mode 100644
index 0000000..2e739e0
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/FloodControlEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FloodControlParser } from '../../../../parser';
+
+export class FloodControlEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FloodControlParser);
+ }
+
+ public getParser(): FloodControlParser
+ {
+ return this.parser as FloodControlParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts
new file mode 100644
index 0000000..36b194d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/RemainingMuteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RemainingMuteParser } from '../../../../parser';
+
+export class RemainingMuteEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RemainingMuteParser);
+ }
+
+ public getParser(): RemainingMuteParser
+ {
+ return this.parser as RemainingMuteParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts
new file mode 100644
index 0000000..2f0a49c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitChatParser } from '../../../../parser';
+
+export class RoomUnitChatEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitChatParser);
+ }
+
+ public getParser(): RoomUnitChatParser
+ {
+ return this.parser as RoomUnitChatParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts
new file mode 100644
index 0000000..728de37
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitChatParser } from '../../../../parser';
+
+export class RoomUnitChatShoutEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitChatParser);
+ }
+
+ public getParser(): RoomUnitChatParser
+ {
+ return this.parser as RoomUnitChatParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts
new file mode 100644
index 0000000..7706052
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitChatParser } from '../../../../parser';
+
+export class RoomUnitChatWhisperEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitChatParser);
+ }
+
+ public getParser(): RoomUnitChatParser
+ {
+ return this.parser as RoomUnitChatParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts
new file mode 100644
index 0000000..c13c250
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomUnitTypingParser } from '../../../../parser';
+
+export class RoomUnitTypingEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomUnitTypingParser);
+ }
+
+ public getParser(): RoomUnitTypingParser
+ {
+ return this.parser as RoomUnitTypingParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/room/unit/chat/index.ts b/packages/communication/src/messages/incoming/room/unit/chat/index.ts
new file mode 100644
index 0000000..6ba41a2
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/chat/index.ts
@@ -0,0 +1,6 @@
+export * from './FloodControlEvent';
+export * from './RemainingMuteEvent';
+export * from './RoomUnitChatEvent';
+export * from './RoomUnitChatShoutEvent';
+export * from './RoomUnitChatWhisperEvent';
+export * from './RoomUnitTypingEvent';
diff --git a/packages/communication/src/messages/incoming/room/unit/index.ts b/packages/communication/src/messages/incoming/room/unit/index.ts
new file mode 100644
index 0000000..2592685
--- /dev/null
+++ b/packages/communication/src/messages/incoming/room/unit/index.ts
@@ -0,0 +1,12 @@
+export * from './chat';
+export * from './RoomUnitDanceEvent';
+export * from './RoomUnitEffectEvent';
+export * from './RoomUnitEvent';
+export * from './RoomUnitExpressionEvent';
+export * from './RoomUnitHandItemEvent';
+export * from './RoomUnitHandItemReceivedEvent';
+export * from './RoomUnitIdleEvent';
+export * from './RoomUnitInfoEvent';
+export * from './RoomUnitNumberEvent';
+export * from './RoomUnitRemoveEvent';
+export * from './RoomUnitStatusEvent';
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts
new file mode 100644
index 0000000..4ee1c0b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniActionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredFurniActionParser } from '../../parser';
+
+export class WiredFurniActionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredFurniActionParser);
+ }
+
+ public getParser(): WiredFurniActionParser
+ {
+ return this.parser as WiredFurniActionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts
new file mode 100644
index 0000000..096c447
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniConditionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredFurniConditionParser } from '../../parser';
+
+export class WiredFurniConditionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredFurniConditionParser);
+ }
+
+ public getParser(): WiredFurniConditionParser
+ {
+ return this.parser as WiredFurniConditionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts
new file mode 100644
index 0000000..d6afb96
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredFurniTriggerEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredFurniTriggerParser } from '../../parser';
+
+export class WiredFurniTriggerEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredFurniTriggerParser);
+ }
+
+ public getParser(): WiredFurniTriggerParser
+ {
+ return this.parser as WiredFurniTriggerParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts
new file mode 100644
index 0000000..3496953
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredOpenEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredOpenParser } from '../../parser';
+
+export class WiredOpenEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredOpenParser);
+ }
+
+ public getParser(): WiredOpenParser
+ {
+ return this.parser as WiredOpenParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts
new file mode 100644
index 0000000..59252da
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts
@@ -0,0 +1,19 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredRewardResultMessageParser } from '../../parser';
+
+export class WiredRewardResultMessageEvent extends MessageEvent implements IMessageEvent
+{
+ public static PRODUCT_DONATED_CODE: number = 6;
+ public static BADGE_DONATED_CODE: number = 7;
+
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredRewardResultMessageParser);
+ }
+
+ public getParser(): WiredRewardResultMessageParser
+ {
+ return this.parser as WiredRewardResultMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts
new file mode 100644
index 0000000..3b6250a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredSaveSuccessEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredSaveSuccessParser } from '../../parser';
+
+export class WiredSaveSuccessEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredSaveSuccessParser);
+ }
+
+ public getParser(): WiredSaveSuccessParser
+ {
+ return this.parser as WiredSaveSuccessParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts b/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts
new file mode 100644
index 0000000..a29963a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/WiredValidationErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WiredValidationErrorParser } from '../../parser';
+
+export class WiredValidationErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WiredValidationErrorParser);
+ }
+
+ public getParser(): WiredValidationErrorParser
+ {
+ return this.parser as WiredValidationErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomevents/index.ts b/packages/communication/src/messages/incoming/roomevents/index.ts
new file mode 100644
index 0000000..0775d57
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomevents/index.ts
@@ -0,0 +1,7 @@
+export * from './WiredFurniActionEvent';
+export * from './WiredFurniConditionEvent';
+export * from './WiredFurniTriggerEvent';
+export * from './WiredOpenEvent';
+export * from './WiredRewardResultMessageEvent';
+export * from './WiredSaveSuccessEvent';
+export * from './WiredValidationErrorEvent';
diff --git a/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts
new file mode 100644
index 0000000..8e95804
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { BannedUsersFromRoomParser } from '../../parser';
+
+export class BannedUsersFromRoomEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, BannedUsersFromRoomParser);
+ }
+
+ public getParser(): BannedUsersFromRoomParser
+ {
+ return this.parser as BannedUsersFromRoomParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts
new file mode 100644
index 0000000..4d1fe0b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllerAddedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FlatControllerAddedParser } from '../../parser';
+
+export class FlatControllerAddedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FlatControllerAddedParser);
+ }
+
+ public getParser(): FlatControllerAddedParser
+ {
+ return this.parser as FlatControllerAddedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts
new file mode 100644
index 0000000..4f1bdbc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FlatControllerRemovedParser } from '../../parser';
+
+export class FlatControllerRemovedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FlatControllerRemovedParser);
+ }
+
+ public getParser(): FlatControllerRemovedParser
+ {
+ return this.parser as FlatControllerRemovedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts b/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts
new file mode 100644
index 0000000..98da732
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/FlatControllersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { FlatControllersParser } from '../../parser';
+
+export class FlatControllersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, FlatControllersParser);
+ }
+
+ public getParser(): FlatControllersParser
+ {
+ return this.parser as FlatControllersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts
new file mode 100644
index 0000000..9eaccf9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/MuteAllInRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { MuteAllInRoomParser } from '../../parser';
+
+export class MuteAllInRoomEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, MuteAllInRoomParser);
+ }
+
+ public getParser(): MuteAllInRoomParser
+ {
+ return this.parser as MuteAllInRoomParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts b/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts
new file mode 100644
index 0000000..745ac4d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/NoSuchFlatEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NoSuchFlatParser } from '../../parser';
+
+export class NoSuchFlatEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NoSuchFlatParser);
+ }
+
+ public getParser(): NoSuchFlatParser
+ {
+ return this.parser as NoSuchFlatParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts
new file mode 100644
index 0000000..69274ef
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomSettingsDataParser } from '../../parser';
+
+export class RoomSettingsDataEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomSettingsDataParser);
+ }
+
+ public getParser(): RoomSettingsDataParser
+ {
+ return this.parser as RoomSettingsDataParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts
new file mode 100644
index 0000000..d245ce5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomSettingsErrorParser } from '../../parser';
+
+export class RoomSettingsErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomSettingsErrorParser);
+ }
+
+ public getParser(): RoomSettingsErrorParser
+ {
+ return this.parser as RoomSettingsErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts
new file mode 100644
index 0000000..459c672
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomSettingsSaveErrorParser } from '../../parser';
+
+export class RoomSettingsSaveErrorEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomSettingsSaveErrorParser);
+ }
+
+ public getParser(): RoomSettingsSaveErrorParser
+ {
+ return this.parser as RoomSettingsSaveErrorParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts
new file mode 100644
index 0000000..842de1e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RoomSettingsSavedParser } from '../../parser';
+
+export class RoomSettingsSavedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RoomSettingsSavedParser);
+ }
+
+ public getParser(): RoomSettingsSavedParser
+ {
+ return this.parser as RoomSettingsSavedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts b/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts
new file mode 100644
index 0000000..c4fbb4f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ShowEnforceRoomCategoryDialogParser } from '../../parser';
+
+export class ShowEnforceRoomCategoryDialogEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ShowEnforceRoomCategoryDialogParser);
+ }
+
+ public getParser(): ShowEnforceRoomCategoryDialogParser
+ {
+ return this.parser as ShowEnforceRoomCategoryDialogParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts b/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts
new file mode 100644
index 0000000..69be3f1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserUnbannedFromRoomParser } from '../../parser';
+
+export class UserUnbannedFromRoomEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserUnbannedFromRoomParser);
+ }
+
+ public getParser(): UserUnbannedFromRoomParser
+ {
+ return this.parser as UserUnbannedFromRoomParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/roomsettings/index.ts b/packages/communication/src/messages/incoming/roomsettings/index.ts
new file mode 100644
index 0000000..63327aa
--- /dev/null
+++ b/packages/communication/src/messages/incoming/roomsettings/index.ts
@@ -0,0 +1,12 @@
+export * from './BannedUsersFromRoomEvent';
+export * from './FlatControllerAddedEvent';
+export * from './FlatControllerRemovedEvent';
+export * from './FlatControllersEvent';
+export * from './MuteAllInRoomEvent';
+export * from './NoSuchFlatEvent';
+export * from './RoomSettingsDataEvent';
+export * from './RoomSettingsErrorEvent';
+export * from './RoomSettingsSavedEvent';
+export * from './RoomSettingsSaveErrorEvent';
+export * from './ShowEnforceRoomCategoryDialogEvent';
+export * from './UserUnbannedFromRoomEvent';
diff --git a/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts b/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts
new file mode 100644
index 0000000..1924bf8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/security/AuthenticatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AuthenticatedParser } from '../../parser';
+
+export class AuthenticatedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AuthenticatedParser);
+ }
+
+ public getParser(): AuthenticatedParser
+ {
+ return this.parser as AuthenticatedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/security/index.ts b/packages/communication/src/messages/incoming/security/index.ts
new file mode 100644
index 0000000..01a887c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/security/index.ts
@@ -0,0 +1 @@
+export * from './AuthenticatedEvent';
diff --git a/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts b/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts
new file mode 100644
index 0000000..7af71ef
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { JukeboxPlayListFullMessageParser } from '../../parser';
+
+export class JukeboxPlayListFullMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, JukeboxPlayListFullMessageParser);
+ }
+
+ public getParser(): JukeboxPlayListFullMessageParser
+ {
+ return this.parser as JukeboxPlayListFullMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts b/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts
new file mode 100644
index 0000000..aff0703
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { JukeboxSongDisksMessageParser } from '../../parser';
+
+export class JukeboxSongDisksMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, JukeboxSongDisksMessageParser);
+ }
+
+ public getParser(): JukeboxSongDisksMessageParser
+ {
+ return this.parser as JukeboxSongDisksMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts b/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts
new file mode 100644
index 0000000..4dd5a2d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/NowPlayingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { NowPlayingMessageParser } from '../../parser';
+
+export class NowPlayingMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, NowPlayingMessageParser);
+ }
+
+ public getParser(): NowPlayingMessageParser
+ {
+ return this.parser as NowPlayingMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts b/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts
new file mode 100644
index 0000000..d57bd3b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/OfficialSongIdMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { OfficialSongIdMessageParser } from '../../parser';
+
+export class OfficialSongIdMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, OfficialSongIdMessageParser);
+ }
+
+ public getParser(): OfficialSongIdMessageParser
+ {
+ return this.parser as OfficialSongIdMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts b/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts
new file mode 100644
index 0000000..762d006
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/PlayListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PlayListMessageParser } from '../../parser';
+
+export class PlayListMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PlayListMessageParser);
+ }
+
+ public getParser(): PlayListMessageParser
+ {
+ return this.parser as PlayListMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts b/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts
new file mode 100644
index 0000000..5d5f516
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/PlayListSongAddedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PlayListSongAddedMessageParser } from '../../parser';
+
+export class PlayListSongAddedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PlayListSongAddedMessageParser);
+ }
+
+ public getParser(): PlayListSongAddedMessageParser
+ {
+ return this.parser as PlayListSongAddedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts b/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts
new file mode 100644
index 0000000..7bf5d17
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/TraxSongInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TraxSongInfoMessageParser } from '../../parser';
+
+export class TraxSongInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TraxSongInfoMessageParser);
+ }
+
+ public getParser(): TraxSongInfoMessageParser
+ {
+ return this.parser as TraxSongInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts b/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts
new file mode 100644
index 0000000..8e09055
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserSongDisksInventoryMessageParser } from '../../parser';
+
+export class UserSongDisksInventoryMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserSongDisksInventoryMessageParser);
+ }
+
+ public getParser(): UserSongDisksInventoryMessageParser
+ {
+ return this.parser as UserSongDisksInventoryMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/sound/index.ts b/packages/communication/src/messages/incoming/sound/index.ts
new file mode 100644
index 0000000..24744f7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/sound/index.ts
@@ -0,0 +1,8 @@
+export * from './JukeboxPlayListFullMessageEvent';
+export * from './JukeboxSongDisksMessageEvent';
+export * from './NowPlayingMessageEvent';
+export * from './OfficialSongIdMessageEvent';
+export * from './PlayListMessageEvent';
+export * from './PlayListSongAddedMessageEvent';
+export * from './TraxSongInfoMessageEvent';
+export * from './UserSongDisksInventoryMessageEvent';
diff --git a/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts b/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts
new file mode 100644
index 0000000..07684b1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/talent/TalentLevelUpEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TalentLevelUpMessageParser } from '../../parser';
+
+export class TalentLevelUpEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TalentLevelUpMessageParser);
+ }
+
+ public getParser(): TalentLevelUpMessageParser
+ {
+ return this.parser as TalentLevelUpMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts b/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts
new file mode 100644
index 0000000..dbe59b4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/talent/TalentTrackLevelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TalentTrackLevelMessageParser } from '../../parser';
+
+export class TalentTrackLevelMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TalentTrackLevelMessageParser);
+ }
+
+ public getParser(): TalentTrackLevelMessageParser
+ {
+ return this.parser as TalentTrackLevelMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts b/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts
new file mode 100644
index 0000000..05192bc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/talent/TalentTrackMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { TalentTrackParser } from '../../parser';
+
+export class TalentTrackMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, TalentTrackParser);
+ }
+
+ public getParser(): TalentTrackParser
+ {
+ return this.parser as TalentTrackParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/talent/index.ts b/packages/communication/src/messages/incoming/talent/index.ts
new file mode 100644
index 0000000..a05161d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/talent/index.ts
@@ -0,0 +1,3 @@
+export * from './TalentLevelUpEvent';
+export * from './TalentTrackLevelMessageEvent';
+export * from './TalentTrackMessageEvent';
diff --git a/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts b/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts
new file mode 100644
index 0000000..e62be5d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { AccountSafetyLockStatusChangeParser } from '../../parser/user/AccountSafetyLockStatusChangeParser';
+
+export class AccountSafetyLockStatusChangeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, AccountSafetyLockStatusChangeParser);
+ }
+
+ public getParser(): AccountSafetyLockStatusChangeParser
+ {
+ return this.parser as AccountSafetyLockStatusChangeParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts b/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts
new file mode 100644
index 0000000..17b4339
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/ApproveNameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ApproveNameResultParser } from '../../parser';
+
+export class ApproveNameMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ApproveNameResultParser);
+ }
+
+ public getParser(): ApproveNameResultParser
+ {
+ return this.parser as ApproveNameResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts b/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts
new file mode 100644
index 0000000..1e5f589
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/ChangeEmailResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ChangeEmailResultParser } from '../../parser';
+
+export class ChangeEmailResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ChangeEmailResultParser);
+ }
+
+ public getParser(): ChangeEmailResultParser
+ {
+ return this.parser as ChangeEmailResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts b/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts
new file mode 100644
index 0000000..0b12f24
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/EmailStatusResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { EmailStatusParser } from '../../parser';
+
+export class EmailStatusResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, EmailStatusParser);
+ }
+
+ public getParser(): EmailStatusParser
+ {
+ return this.parser as EmailStatusParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts b/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts
new file mode 100644
index 0000000..cf0dc5f
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ExtendedProfileChangedMessageParser } from '../../parser';
+
+export class ExtendedProfileChangedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ExtendedProfileChangedMessageParser);
+ }
+
+ public getParser(): ExtendedProfileChangedMessageParser
+ {
+ return this.parser as ExtendedProfileChangedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts
new file mode 100644
index 0000000..461c9c3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/GroupDetailsChangedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupDetailsChangedMessageParser } from '../../parser';
+
+export class GroupDetailsChangedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupDetailsChangedMessageParser);
+ }
+
+ public getParser(): GroupDetailsChangedMessageParser
+ {
+ return this.parser as GroupDetailsChangedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts
new file mode 100644
index 0000000..649648a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GroupMembershipRequestedMessageParser } from '../../parser';
+
+export class GroupMembershipRequestedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GroupMembershipRequestedMessageParser);
+ }
+
+ public getParser(): GroupMembershipRequestedMessageParser
+ {
+ return this.parser as GroupMembershipRequestedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts
new file mode 100644
index 0000000..bdefae8
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/GuildEditFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuildEditFailedMessageParser } from '../../parser';
+
+export class GuildEditFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuildEditFailedMessageParser);
+ }
+
+ public getParser(): GuildEditFailedMessageParser
+ {
+ return this.parser as GuildEditFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts
new file mode 100644
index 0000000..d4f67a1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuildMemberMgmtFailedMessageParser } from '../../parser';
+
+export class GuildMemberMgmtFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuildMemberMgmtFailedMessageParser);
+ }
+
+ public getParser(): GuildMemberMgmtFailedMessageParser
+ {
+ return this.parser as GuildMemberMgmtFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts b/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts
new file mode 100644
index 0000000..7a9d4be
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/GuildMembershipsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { GuildMembershipsMessageParser } from '../../parser';
+
+export class GuildMembershipsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, GuildMembershipsMessageParser);
+ }
+
+ public getParser(): GuildMembershipsMessageParser
+ {
+ return this.parser as GuildMembershipsMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts b/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts
new file mode 100644
index 0000000..4138952
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/HabboGroupBadgesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboGroupBadgesMessageParser } from '../../parser';
+
+export class HabboGroupBadgesMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboGroupBadgesMessageParser);
+ }
+
+ public getParser(): HabboGroupBadgesMessageParser
+ {
+ return this.parser as HabboGroupBadgesMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts b/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts
new file mode 100644
index 0000000..f2e0846
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { HabboGroupJoinFailedMessageParser } from '../../parser';
+
+export class HabboGroupJoinFailedMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, HabboGroupJoinFailedMessageParser);
+ }
+
+ public getParser(): HabboGroupJoinFailedMessageParser
+ {
+ return this.parser as HabboGroupJoinFailedMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts b/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts
new file mode 100644
index 0000000..521cc3d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/IgnoreResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IgnoreResultParser } from '../../parser';
+
+export class IgnoreResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IgnoreResultParser);
+ }
+
+ public getParser(): IgnoreResultParser
+ {
+ return this.parser as IgnoreResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts b/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts
new file mode 100644
index 0000000..9dd6f6a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/IgnoredUsersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { IgnoredUsersParser } from '../../parser';
+
+export class IgnoredUsersEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, IgnoredUsersParser);
+ }
+
+ public getParser(): IgnoredUsersParser
+ {
+ return this.parser as IgnoredUsersParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts b/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts
new file mode 100644
index 0000000..4e8798a
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/InClientLinkEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { InClientLinkParser } from '../../parser';
+
+export class InClientLinkEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, InClientLinkParser);
+ }
+
+ public getParser(): InClientLinkParser
+ {
+ return this.parser as InClientLinkParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/MemberData.ts b/packages/communication/src/messages/incoming/user/MemberData.ts
new file mode 100644
index 0000000..ac60c0e
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/MemberData.ts
@@ -0,0 +1,70 @@
+import { IMessageDataWrapper } from '@nitrots/api';
+
+export class MemberData
+{
+ private static readonly TYPE_OWNER: number = 0;
+ private static readonly TYPE_ADMIN: number = 1;
+ private static readonly TYPE_PENDING: number = 2;
+ private static readonly TYPE_MEMBER: number = 3;
+ private static readonly TYPE_BLOCKED: number = 4;
+
+ private _type: number;
+ private _userId: number;
+ private _userName: string;
+ private _figure: string;
+ private _memberSince: string;
+
+ constructor(wrapper: IMessageDataWrapper)
+ {
+ this._type = wrapper.readInt();
+ this._userId = wrapper.readInt();
+ this._userName = wrapper.readString();
+ this._figure = wrapper.readString();
+ this._memberSince = wrapper.readString();
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public get userName(): string
+ {
+ return this._userName;
+ }
+
+ public get admin(): boolean
+ {
+ return this._type == MemberData.TYPE_ADMIN;
+ }
+
+ public get owner(): boolean
+ {
+ return this._type == MemberData.TYPE_OWNER;
+ }
+
+ public get pending(): boolean
+ {
+ return this._type == MemberData.TYPE_PENDING;
+ }
+
+ public get member(): boolean
+ {
+ return this._type != MemberData.TYPE_MEMBER;
+ }
+
+ public get blocked(): boolean
+ {
+ return this._type == MemberData.TYPE_BLOCKED;
+ }
+
+ public get figure(): string
+ {
+ return this._figure;
+ }
+
+ public get memberSince(): string
+ {
+ return this._memberSince;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts b/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts
new file mode 100644
index 0000000..5e44b95
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/PetRespectNoficationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetRespectNotificationParser } from '../../parser';
+
+export class PetRespectNoficationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetRespectNotificationParser);
+ }
+
+ public getParser(): PetRespectNotificationParser
+ {
+ return this.parser as PetRespectNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts b/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts
new file mode 100644
index 0000000..9e9ff72
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/PetSupplementedNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { PetSupplementedNotificationParser } from '../../parser';
+
+export class PetSupplementedNotificationEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, PetSupplementedNotificationParser);
+ }
+
+ public getParser(): PetSupplementedNotificationParser
+ {
+ return this.parser as PetSupplementedNotificationParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts b/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts
new file mode 100644
index 0000000..3326ae6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/RespectReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RespectReceivedParser } from '../../parser';
+
+export class RespectReceivedEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RespectReceivedParser);
+ }
+
+ public getParser(): RespectReceivedParser
+ {
+ return this.parser as RespectReceivedParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts b/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts
new file mode 100644
index 0000000..faabaf5
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { ScrSendKickbackInfoMessageParser } from '../../parser';
+
+export class ScrSendKickbackInfoMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, ScrSendKickbackInfoMessageParser);
+ }
+
+ public getParser(): ScrSendKickbackInfoMessageParser
+ {
+ return this.parser as ScrSendKickbackInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts b/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts
new file mode 100644
index 0000000..a2a56ff
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { WelcomeGiftChangeEmailResultParser } from '../../parser';
+
+export class WelcomeGiftChangeEmailResultEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, WelcomeGiftChangeEmailResultParser);
+ }
+
+ public getParser(): WelcomeGiftChangeEmailResultParser
+ {
+ return this.parser as WelcomeGiftChangeEmailResultParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts b/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts
new file mode 100644
index 0000000..e5943c4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/access/UserPermissionsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserPermissionsParser } from '../../../parser';
+
+export class UserPermissionsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserPermissionsParser);
+ }
+
+ public getParser(): UserPermissionsParser
+ {
+ return this.parser as UserPermissionsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/access/index.ts b/packages/communication/src/messages/incoming/user/access/index.ts
new file mode 100644
index 0000000..51901c3
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/access/index.ts
@@ -0,0 +1 @@
+export * from './UserPermissionsEvent';
diff --git a/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts b/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts
new file mode 100644
index 0000000..c9caba4
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/RelationshipStatusInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { RelationshipStatusInfoMessageParser } from '../../../parser';
+
+export class RelationshipStatusInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, RelationshipStatusInfoMessageParser);
+ }
+
+ public getParser(): RelationshipStatusInfoMessageParser
+ {
+ return this.parser as RelationshipStatusInfoMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts b/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts
new file mode 100644
index 0000000..600b808
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserCurrentBadgesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserCurrentBadgesParser } from '../../../parser';
+
+export class UserCurrentBadgesEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserCurrentBadgesParser);
+ }
+
+ public getParser(): UserCurrentBadgesParser
+ {
+ return this.parser as UserCurrentBadgesParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts b/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts
new file mode 100644
index 0000000..3231671
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserInfoParser } from '../../../parser';
+
+export class UserInfoEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserInfoParser);
+ }
+
+ public getParser(): UserInfoParser
+ {
+ return this.parser as UserInfoParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts b/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts
new file mode 100644
index 0000000..f0cd532
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserNameChangeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserNameChangeMessageParser } from '../../../parser';
+
+export class UserNameChangeMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserNameChangeMessageParser);
+ }
+
+ public getParser(): UserNameChangeMessageParser
+ {
+ return this.parser as UserNameChangeMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts b/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts
new file mode 100644
index 0000000..cc05661
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserProfileEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserProfileParser } from '../../../parser';
+
+export class UserProfileEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserProfileParser);
+ }
+
+ public getParser(): UserProfileParser
+ {
+ return this.parser as UserProfileParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts b/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts
new file mode 100644
index 0000000..e95508d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserSettingsParser } from '../../../parser';
+
+export class UserSettingsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserSettingsParser);
+ }
+
+ public getParser(): UserSettingsParser
+ {
+ return this.parser as UserSettingsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts b/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts
new file mode 100644
index 0000000..a556251
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/UserTagsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserTagsParser } from '../../../parser';
+
+export class UserTagsMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserTagsParser);
+ }
+
+ public getParser(): UserTagsParser
+ {
+ return this.parser as UserTagsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/data/index.ts b/packages/communication/src/messages/incoming/user/data/index.ts
new file mode 100644
index 0000000..5994aa9
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/data/index.ts
@@ -0,0 +1,7 @@
+export * from './RelationshipStatusInfoEvent';
+export * from './UserCurrentBadgesEvent';
+export * from './UserInfoEvent';
+export * from './UserNameChangeMessageEvent';
+export * from './UserProfileEvent';
+export * from './UserSettingsEvent';
+export * from './UserTagsMessageEvent';
diff --git a/packages/communication/src/messages/incoming/user/index.ts b/packages/communication/src/messages/incoming/user/index.ts
new file mode 100644
index 0000000..f6f8642
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/index.ts
@@ -0,0 +1,27 @@
+export * from './access';
+export * from './AccountSafetyLockStatusChangeMessageEvent';
+export * from './ApproveNameMessageEvent';
+export * from './ChangeEmailResultEvent';
+export * from './data';
+export * from './EmailStatusResultEvent';
+export * from './ExtendedProfileChangedMessageEvent';
+export * from './GroupDetailsChangedMessageEvent';
+export * from './GroupMembershipRequestedMessageEvent';
+export * from './GuildEditFailedMessageEvent';
+export * from './GuildMemberMgmtFailedMessageEvent';
+export * from './GuildMembershipsMessageEvent';
+export * from './HabboGroupBadgesMessageEvent';
+export * from './HabboGroupJoinFailedMessageEvent';
+export * from './IgnoredUsersEvent';
+export * from './IgnoreResultEvent';
+export * from './InClientLinkEvent';
+export * from './inventory';
+export * from './inventory/currency';
+export * from './inventory/subscription';
+export * from './MemberData';
+export * from './PetRespectNoficationEvent';
+export * from './PetSupplementedNotificationEvent';
+export * from './RespectReceivedEvent';
+export * from './ScrSendKickbackInfoMessageEvent';
+export * from './wardrobe';
+export * from './WelcomeGiftChangeEmailResultEvent';
diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts b/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts
new file mode 100644
index 0000000..4b3aa0d
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/currency/UserCreditsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserCreditsParser } from '../../../../parser';
+
+export class UserCreditsEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserCreditsParser);
+ }
+
+ public getParser(): UserCreditsParser
+ {
+ return this.parser as UserCreditsParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts b/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts
new file mode 100644
index 0000000..402cbe6
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserCurrencyParser } from '../../../../parser';
+
+export class UserCurrencyEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserCurrencyParser);
+ }
+
+ public getParser(): UserCurrencyParser
+ {
+ return this.parser as UserCurrencyParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/inventory/currency/index.ts b/packages/communication/src/messages/incoming/user/inventory/currency/index.ts
new file mode 100644
index 0000000..f178ba7
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/currency/index.ts
@@ -0,0 +1,2 @@
+export * from './UserCreditsEvent';
+export * from './UserCurrencyEvent';
diff --git a/packages/communication/src/messages/incoming/user/inventory/index.ts b/packages/communication/src/messages/incoming/user/inventory/index.ts
new file mode 100644
index 0000000..e25bf08
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/index.ts
@@ -0,0 +1,2 @@
+export * from './currency';
+export * from './subscription';
diff --git a/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts b/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts
new file mode 100644
index 0000000..ae780cc
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserSubscriptionParser } from '../../../../parser';
+
+export class UserSubscriptionEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserSubscriptionParser);
+ }
+
+ public getParser(): UserSubscriptionParser
+ {
+ return this.parser as UserSubscriptionParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts b/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts
new file mode 100644
index 0000000..3d8e4a1
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/inventory/subscription/index.ts
@@ -0,0 +1 @@
+export * from './UserSubscriptionEvent';
diff --git a/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts b/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts
new file mode 100644
index 0000000..41b371b
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserWardrobePageParser } from '../../../parser';
+
+export class UserWardrobePageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserWardrobePageParser);
+ }
+
+ public getParser(): UserWardrobePageParser
+ {
+ return this.parser as UserWardrobePageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/user/wardrobe/index.ts b/packages/communication/src/messages/incoming/user/wardrobe/index.ts
new file mode 100644
index 0000000..179e41c
--- /dev/null
+++ b/packages/communication/src/messages/incoming/user/wardrobe/index.ts
@@ -0,0 +1 @@
+export * from './UserWardrobePageEvent';
diff --git a/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts b/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts
new file mode 100644
index 0000000..41bc6db
--- /dev/null
+++ b/packages/communication/src/messages/incoming/userclassification/UserClassificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '@nitrots/api';
+import { MessageEvent } from '@nitrots/events';
+import { UserClassificationMessageParser } from '../../parser';
+
+export class UserClassificationMessageEvent extends MessageEvent implements IMessageEvent
+{
+ constructor(callBack: Function)
+ {
+ super(callBack, UserClassificationMessageParser);
+ }
+
+ public getParser(): UserClassificationMessageParser
+ {
+ return this.parser as UserClassificationMessageParser;
+ }
+}
diff --git a/packages/communication/src/messages/incoming/userclassification/index.ts b/packages/communication/src/messages/incoming/userclassification/index.ts
new file mode 100644
index 0000000..f56a235
--- /dev/null
+++ b/packages/communication/src/messages/incoming/userclassification/index.ts
@@ -0,0 +1 @@
+export * from './UserClassificationMessageEvent';
diff --git a/packages/communication/src/messages/index.ts b/packages/communication/src/messages/index.ts
new file mode 100644
index 0000000..7b88840
--- /dev/null
+++ b/packages/communication/src/messages/index.ts
@@ -0,0 +1,4 @@
+export * from './MessageClassManager';
+export * from './incoming';
+export * from './outgoing';
+export * from './parser';
diff --git a/packages/communication/src/messages/outgoing/OutgoingHeader.ts b/packages/communication/src/messages/outgoing/OutgoingHeader.ts
new file mode 100644
index 0000000..4917a51
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/OutgoingHeader.ts
@@ -0,0 +1,471 @@
+export class OutgoingHeader
+{
+ public static ACHIEVEMENT_LIST = 219;
+ public static AUTHENTICATION = -1;
+ public static BOT_CONFIGURATION = 1986;
+ public static BOT_PICKUP = 3323;
+ public static BOT_PLACE = 1592;
+ public static BOT_SKILL_SAVE = 2624;
+ public static GET_CLUB_OFFERS = 3285;
+ public static GET_CLUB_GIFT_INFO = 487;
+ public static GET_CATALOG_INDEX = 1195;
+ public static GET_CATALOG_PAGE = 412;
+ public static CATALOG_PURCHASE = 3492;
+ public static CATALOG_PURCHASE_GIFT = 1411;
+ public static GET_PRODUCT_OFFER = 2594;
+ public static CLIENT_LATENCY = 295;
+ public static CLIENT_LATENCY_MEASURE = 96;
+ public static CLIENT_POLICY = 26979;
+ public static CLIENT_PONG = 2596;
+ public static CLIENT_TOOLBAR_TOGGLE = 2313;
+ public static CLIENT_VARIABLES = 1053;
+ public static GET_CURRENT_TIMING_CODE = 2912;
+ public static DESKTOP_NEWS = 1827;
+ public static DESKTOP_VIEW = 105;
+ public static GET_BUNDLE_DISCOUNT_RULESET = 223;
+ public static EVENT_TRACKER = 3457;
+ public static FIND_NEW_FRIENDS = 516;
+ public static FURNITURE_ALIASES = 3898;
+ public static FURNITURE_FLOOR_UPDATE = 248;
+ public static FURNITURE_MULTISTATE = 99;
+ public static FURNITURE_PICKUP = 3456;
+ public static FURNITURE_PLACE = 1258;
+ public static FURNITURE_POSTIT_PLACE = 2248;
+ public static FURNITURE_POSTIT_SAVE_STICKY_POLE = 3283;
+ public static FURNITURE_RANDOMSTATE = 3617;
+ public static FURNITURE_WALL_MULTISTATE = 210;
+ public static FURNITURE_WALL_UPDATE = 168;
+ public static GAMES_INIT = 2914;
+ public static GAMES_LIST = 741;
+ public static ACCEPTGAMEINVITE = 3802;
+ public static GAMEUNLOADEDMESSAGE = 3207;
+ public static GETGAMEACHIEVEMENTSMESSAGE = 2399;
+ public static GETGAMESTATUSMESSAGE = 3171;
+ public static GETUSERGAMEACHIEVEMENTSMESSAGE = 389;
+ public static JOINQUEUEMESSAGE = 1458;
+ public static LEAVEQUEUEMESSAGE = 2384;
+ public static RESETRESOLUTIONACHIEVEMENTMESSAGE = 3144;
+ public static GETWEEKLYGAMEREWARDWINNERS = 1054;
+ public static GAME2GETACCOUNTGAMESTATUSMESSAGE = 11;
+ public static GAME2CHECKGAMEDIRECTORYSTATUSMESSAGE = 3259;
+ public static GAME2EXITGAMEMESSAGE = 1445;
+ public static GAME2GAMECHATMESSAGE = 2502;
+ public static GAME2LOADSTAGEREADYMESSAGE = 2415;
+ public static GAME2PLAYAGAINMESSAGE = 3196;
+ public static GAME2REQUESTFULLSTATUSUPDATEMESSAGE = 1598;
+ public static GAME2GETWEEKLYFRIENDSLEADERBOARD = 1232;
+ public static GAME2GETWEEKLYLEADERBOARD = 2565;
+ public static GET_GIFT_WRAPPING_CONFIG = 418;
+ public static GROUP_ADMIN_ADD = 2894;
+ public static GROUP_ADMIN_REMOVE = 722;
+ public static GROUP_CREATE_OPTIONS = 798;
+ public static GROUP_FAVORITE = 3549;
+ public static GET_FORUM_STATS = 3149;
+ public static GET_FORUM_THREADS = 873;
+ public static GET_FORUMS_LIST = 436;
+ public static GET_FORUM_MESSAGES = 232;
+ public static GET_FORUM_THREAD = 3900;
+ public static GET_UNREAD_FORUMS_COUNT = 2908;
+ public static FORUM_MODERATE_MESSAGE = 286;
+ public static FORUM_MODERATE_THREAD = 1397;
+ public static FORUM_POST_MESSAGE = 3529;
+ public static UPDATE_FORUM_READ_MARKER = 1855;
+ public static UPDATE_FORUM_SETTINGS = 2214;
+ public static FORUM_UPDATE_THREAD = 3045;
+ public static GROUP_INFO = 2991;
+ public static GROUP_DELETE = 1134;
+ public static GROUP_MEMBER_REMOVE_CONFIRM = 3593;
+ public static GROUP_MEMBER_REMOVE = 593;
+ public static GROUP_MEMBERS = 312;
+ public static GROUP_MEMBERSHIPS = 367;
+ public static GROUP_REQUEST = 998;
+ public static GROUP_REQUEST_ACCEPT = 3386;
+ public static GROUP_REQUEST_DECLINE = 1894;
+ public static GROUP_SETTINGS = 1004;
+ public static GROUP_PARTS = 813;
+ public static GROUP_BUY = 230;
+ public static GROUP_SAVE_INFORMATION = 3137;
+ public static GROUP_SAVE_BADGE = 1991;
+ public static GROUP_SAVE_COLORS = 1764;
+ public static GROUP_SAVE_PREFERENCES = 3435;
+ public static GROUP_BADGES = 21;
+ public static GROUP_UNBLOCK_MEMBER = 2864;
+ public static GET_BADGE_POINTS_LIMITS = 1371;
+ public static REQUESTABADGE = 3077;
+ public static GETISBADGEREQUESTFULFILLED = 1364;
+ public static ITEM_CLOTHING_REDEEM = 3374;
+ public static ITEM_COLOR_WHEEL_CLICK = 2144;
+ public static ITEM_DICE_CLICK = 1990;
+ public static ITEM_DICE_CLOSE = 1533;
+ public static ITEM_DIMMER_SAVE = 1648;
+ public static ITEM_DIMMER_SETTINGS = 2813;
+ public static ITEM_DIMMER_TOGGLE = 2296;
+ public static ITEM_EXCHANGE_REDEEM = 3115;
+ public static ITEM_PAINT = 711;
+ public static SET_OBJECT_DATA = 3608;
+ public static ITEM_STACK_HELPER = 3839;
+ public static ITEM_WALL_CLICK = 210;
+ public static ITEM_WALL_UPDATE = 168;
+ public static MARKETPLACE_CONFIG = 2597;
+ public static ACCEPT_FRIEND = 137;
+ public static MESSENGER_CHAT = 3567;
+ public static DECLINE_FRIEND = 2890;
+ public static FOLLOW_FRIEND = 3997;
+ public static MESSENGER_FRIENDS = 1523;
+ public static MESSENGER_INIT = 2781;
+ public static MESSENGER_RELATIONSHIPS = 2138;
+ public static SET_RELATIONSHIP_STATUS = 3768;
+ public static REMOVE_FRIEND = 1689;
+ public static REQUEST_FRIEND = 3157;
+ public static GET_FRIEND_REQUESTS = 2448;
+ public static SEND_ROOM_INVITE = 1276;
+ public static HABBO_SEARCH = 1210;
+ public static FRIEND_LIST_UPDATE = 1419;
+ public static MOD_TOOL_USER_INFO = 3295;
+ public static GET_USER_FLAT_CATS = 3027;
+ public static NAVIGATOR_INIT = 2110;
+ public static NAVIGATOR_SEARCH = 249;
+ public static NAVIGATOR_SEARCH_CLOSE = 1834;
+ public static NAVIGATOR_SEARCH_OPEN = 637;
+ public static NAVIGATOR_SEARCH_SAVE = 2226;
+ public static GET_USER_EVENT_CATS = 1782;
+ public static NAVIGATOR_SETTINGS_SAVE = 3159;
+ public static NAVIGATOR_CATEGORY_LIST_MODE = 1202;
+ public static NAVIGATOR_DELETE_SAVED_SEARCH = 1954;
+ public static PET_INFO = 2934;
+ public static PET_PICKUP = 1581;
+ public static PET_PLACE = 2647;
+ public static PET_RESPECT = 3202;
+ public static PET_RIDE = 1036;
+ public static PET_MOVE = 3449;
+ public static PET_OPEN_PACKAGE = 3698;
+ public static PET_SELECTED = 549;
+ public static PETS_BREED = 1638;
+ public static PET_CANCEL_BREEDING = 2713;
+ public static PET_CONFIRM_BREEDING = 3382;
+ public static GET_PET_TRAINING_PANEL = 2161;
+ public static RECYCLER_PRIZES = 398;
+ public static RECYCLER_STATUS = 1342;
+ public static RECYCLER_ITEMS = 2771;
+ public static RELEASE_VERSION = 4000;
+ public static CALL_FOR_HELP = 1691;
+ public static ROOM_AMBASSADOR_ALERT = 2996;
+ public static ROOM_BAN_GIVE = 1477;
+ public static ROOM_BAN_LIST = 2267;
+ public static ROOM_BAN_REMOVE = 992;
+ public static ROOM_CREATE = 2752;
+ public static ROOM_DELETE = 532;
+ public static ROOM_DOORBELL = 1644;
+ public static ROOM_ENTER = 2312;
+ public static ROOM_FAVORITE = 3817;
+ public static ROOM_FAVORITE_REMOVE = 309;
+ public static CAN_CREATE_ROOM = 2128;
+ public static CANCEL_ROOM_EVENT = 2725;
+ public static EDIT_ROOM_EVENT = 3991;
+ public static COMPETITION_ROOM_SEARCH = 433;
+ public static FORWARD_TO_RANDOM_PROMOTED_ROOM = 10;
+ public static FORWARD_TO_SOME_ROOM = 1703;
+ public static GET_CATEGORIES_WITH_USER_COUNT = 3782;
+ public static GET_GUEST_ROOM = 2230;
+ public static GET_OFFICIAL_ROOMS = 1229;
+ public static GET_POPULAR_ROOM_TAGS = 826;
+ public static GUILD_BASE_SEARCH = 2930;
+ public static MY_FAVOURITE_ROOMS_SEARCH = 2578;
+ public static MY_FREQUENT_ROOM_HISTORY_SEARCH = 1002;
+ public static MY_FRIENDS_ROOM_SEARCH = 2266;
+ public static MY_GUILD_BASES_SEARCH = 39;
+ public static MY_RECOMMENDED_ROOMS = 2537;
+ public static MY_ROOM_HISTORY_SEARCH = 2264;
+ public static MY_ROOM_RIGHTS_SEARCH = 272;
+ public static MY_ROOMS_SEARCH = 2277;
+ public static POPULAR_ROOMS_SEARCH = 2758;
+ public static ROOM_AD_EVENT_TAB_CLICKED = 2412;
+ public static ROOM_AD_EVENT_TAB_VIEWED = 2668;
+ public static ROOM_AD_SEARCH = 2809;
+ public static ROOM_TEXT_SEARCH = 3943;
+ public static ROOMS_WHERE_MY_FRIENDS_ARE = 1786;
+ public static ROOMS_WITH_HIGHEST_SCORE_SEARCH = 2939;
+ public static SET_ROOM_SESSION_TAGS = 3305;
+ public static UPDATE_ROOM_THUMBNAIL = 2468;
+ public static ROOM_KICK = 1320;
+ public static ROOM_LIKE = 3582;
+ public static ROOM_MODEL = 2300;
+ public static GET_OCCUPIED_TILES = 1687;
+ public static GET_ROOM_ENTRY_TILE = 3559;
+ public static ROOM_MODEL_SAVE = 875;
+ public static ROOM_MUTE = 3637;
+ public static ROOM_MUTE_USER = 3485;
+ public static ROOM_RIGHTS_GIVE = 808;
+ public static ROOM_RIGHTS_LIST = 3385;
+ public static ROOM_RIGHTS_REMOVE = 2064;
+ public static ROOM_RIGHTS_REMOVE_ALL = 2683;
+ public static ROOM_RIGHTS_REMOVE_OWN = 3182;
+ public static ROOM_SETTINGS = 3129;
+ public static ROOM_SETTINGS_SAVE = 1969;
+ public static ROOM_SETTINGS_UPDATE_ROOM_CATEGORY_AND_TRADE = 1265;
+ public static ROOM_STAFF_PICK = 1918;
+ public static ROOM_FILTER_WORDS = 1911;
+ public static ROOM_FILTER_WORDS_MODIFY = 3001;
+ public static MYSTERYBOXWAITINGCANCELEDMESSAGE = 2012;
+ public static MYSTERYBOX_OPEN_TROPHY = 3074;
+ public static SECURITY_MACHINE = 2490;
+ public static SECURITY_TICKET = 2419;
+ public static TRADE = 1481;
+ public static TRADE_ACCEPT = 3863;
+ public static TRADE_CANCEL = 2341;
+ public static TRADE_CLOSE = 2551;
+ public static TRADE_CONFIRM = 2760;
+ public static TRADE_ITEM = 3107;
+ public static TRADE_ITEM_REMOVE = 3845;
+ public static TRADE_ITEMS = 1263;
+ public static TRADE_UNACCEPT = 1444;
+ public static UNIT_ACTION = 2456;
+ public static UNIT_CHAT = 1314;
+ public static UNIT_CHAT_SHOUT = 2085;
+ public static UNIT_CHAT_WHISPER = 1543;
+ public static UNIT_DANCE = 2080;
+ public static UNIT_DROP_HAND_ITEM = 2814;
+ public static UNIT_GIVE_HANDITEM = 2941;
+ public static UNIT_LOOK = 3301;
+ public static UNIT_POSTURE = 2235;
+ public static UNIT_SIGN = 1975;
+ public static UNIT_TYPING = 1597;
+ public static UNIT_TYPING_STOP = 1474;
+ public static UNIT_WALK = 3320;
+ public static USER_BADGES = 2769;
+ public static USER_BADGES_CURRENT = 2091;
+ public static USER_BADGES_CURRENT_UPDATE = 644;
+ public static USER_BOTS = 3848;
+ public static USER_CURRENCY = 273;
+ public static USER_EFFECT_ACTIVATE = 2959;
+ public static USER_EFFECT_ENABLE = 1752;
+ public static USER_FIGURE = 2730;
+ public static USER_FURNITURE = 3150; // sent when in room
+ public static REQUESTFURNIINVENTORYWHENNOTINROOM = 3500; // sent when not in room
+ public static USER_HOME_ROOM = 1740;
+ public static USER_INFO = 357;
+ public static USER_MOTTO = 2228;
+ public static USER_IGNORED = 3878;
+ public static USER_PETS = 3095;
+ public static USER_PROFILE = 3265;
+ public static USER_PROFILE_BY_NAME = 2249;
+ public static USER_RESPECT = 2694;
+ public static GET_SOUND_SETTINGS = 2388;
+ public static USER_SETTINGS_CAMERA = 1461;
+ public static USER_SETTINGS_CHAT_STYLE = 1030;
+ public static USER_SETTINGS_INVITES = 1086;
+ public static USER_SETTINGS_OLD_CHAT = 1262;
+ public static USER_SETTINGS_VOLUME = 1367;
+ public static USER_SUBSCRIPTION = 3166;
+ public static GET_WARDROBE = 2742;
+ public static SAVE_WARDROBE_OUTFIT = 800;
+ public static USER_TAGS = 17;
+ public static PEER_USERS_CLASSIFICATION = 1160;
+ public static USER_CLASSIFICATION = 2285;
+ public static VISIT_USER = 2970;
+ public static WIRED_ACTION_SAVE = 2281;
+ public static WIRED_APPLY_SNAPSHOT = 3373;
+ public static WIRED_CONDITION_SAVE = 3203;
+ public static WIRED_OPEN = 768;
+ public static WIRED_TRIGGER_SAVE = 1520;
+ public static GET_ITEM_DATA = 3964;
+ public static ONE_WAY_DOOR_CLICK = 2765;
+ public static REMOVE_WALL_ITEM = 3336;
+ public static SET_ITEM_DATA = 3666;
+ public static CATALOG_REDEEM_VOUCHER = 339;
+ public static ROOM_TONER_APPLY = 2880;
+ public static FRIEND_FURNI_CONFIRM_LOCK = 3775;
+ public static MANNEQUIN_SAVE_NAME = 2850;
+ public static MANNEQUIN_SAVE_LOOK = 2209;
+ public static PRESENT_OPEN_PRESENT = 3558;
+ public static CATALOG_SELECT_VIP_GIFT = 2276;
+ public static USER_IGNORE_ID = 3314;
+ public static USER_IGNORE = 1117;
+ public static USER_UNIGNORE = 2061;
+ public static MODTOOL_REQUEST_ROOM_INFO = 707;
+ public static MODTOOL_CHANGE_ROOM_SETTINGS = 3260;
+ public static MODTOOL_REQUEST_USER_CHATLOG = 1391;
+ public static MODTOOL_REQUEST_ROOM_CHATLOG = 2587;
+ public static MODTOOL_SANCTION_ALERT = 229;
+ public static MODTOOL_SANCTION_BAN = 2766;
+ public static MODTOOL_SANCTION_KICK = 2582;
+ public static MODTOOL_SANCTION_TRADELOCK = 3742;
+ public static MODTOOL_ALERTEVENT = 1840;
+ public static MODTOOL_SANCTION_MUTE = 1945;
+ public static MODTOOL_REQUEST_USER_ROOMS = 3526;
+ public static MODTOOL_ROOM_ALERT = 3842;
+ public static MODTOOL_PREFERENCES = 31;
+ public static CLOSE_ISSUE_DEFAULT_ACTION = 2717;
+ public static CLOSE_ISSUES = 2067;
+ public static DEFAULT_SANCTION = 1681;
+ public static GET_CFH_CHATLOG = 211;
+ public static MODTOOL_SANCTION = 1392;
+ public static PICK_ISSUES = 15;
+ public static RELEASE_ISSUES = 1572;
+ public static CONVERT_GLOBAL_ROOM_ID = 314;
+ public static REQUEST_SELL_ITEM = 848;
+ public static REQUEST_MARKETPLACE_ITEM_STATS = 3288;
+ public static MARKETPLACE_SELL_ITEM = 3447;
+ public static MARKETPLACE_REQUEST_OWN_ITEMS = 2105;
+ public static MARKETPLACE_TAKE_BACK_ITEM = 434;
+ public static MARKETPLACE_REDEEM_CREDITS = 2650;
+ public static MARKETPLACE_REQUEST_OFFERS = 2407;
+ public static MARKETPLACE_BUY_OFFER = 1603;
+ public static MARKETPLACE_BUY_TOKENS = 1866;
+ public static CATALOG_REQUESET_PET_BREEDS = 1756;
+ public static APPROVE_NAME = 2109;
+ public static UNIT_GIVE_HANDITEM_PET = 2768;
+ public static PET_MOUNT = 1036;
+ public static PET_SUPPLEMENT = 749;
+ public static FURNITURE_GROUP_INFO = 2651;
+ public static ACHIEVEMENT_RESOLUTION_OPEN = 359;
+ public static USE_PET_PRODUCT = 1328;
+ public static REMOVE_PET_SADDLE = 186;
+ public static TOGGLE_PET_RIDING = 1472;
+ public static TOGGLE_PET_BREEDING = 3379;
+ public static UNSEEN_RESET_CATEGORY = 3493;
+ public static UNSEEN_RESET_ITEMS = 2343;
+ public static COMMUNITY_GOAL_VOTE_COMPOSER = 3536;
+ public static GET_PROMO_ARTICLES = 1827;
+ public static ACCEPT_QUEST = 3604;
+ public static ACTIVATE_QUEST = 793;
+ public static CANCEL_QUEST = 3133;
+ public static FRIEND_REQUEST_QUEST_COMPLETE = 1148;
+ public static GET_COMMUNITY_GOAL_EARNED_PRIZES = 2688;
+ public static GET_COMMUNITY_GOAL_HALL_OF_FAME = 2167;
+ public static GET_COMMUNITY_GOAL_PROGRESS = 1145;
+ public static GET_CONCURRENT_USERS_GOAL_PROGRESS = 1343;
+ public static GET_CONCURRENT_USERS_REWARD = 3872;
+ public static GET_DAILY_QUEST = 2486;
+ public static GET_QUESTS = 3333;
+ public static GET_SEASONAL_QUESTS_ONLY = 1190;
+ public static OPEN_QUEST_TRACKER = 2750;
+ public static REDEEM_COMMUNITY_GOAL_PRIZE = 90;
+ public static REJECT_QUEST = 2397;
+ public static START_CAMPAIGN = 1697;
+ public static GET_BONUS_RARE_INFO = 957;
+ public static CRAFT = 3591;
+ public static CRAFT_SECRET = 1251;
+ public static GET_CRAFTABLE_PRODUCTS = 633;
+ public static GET_CRAFTING_RECIPE = 1173;
+ public static GET_CRAFTING_RECIPES_AVAILABLE = 3086;
+ public static PHOTO_COMPETITION = 3959;
+ public static PUBLISH_PHOTO = 2068;
+ public static PURCHASE_PHOTO = 2408;
+ public static RENDER_ROOM = 3226;
+ public static RENDER_ROOM_THUMBNAIL = 1982;
+ public static REQUEST_CAMERA_CONFIGURATION = 796;
+ public static ADD_JUKEBOX_DISK = 753;
+ public static GET_JUKEBOX_PLAYLIST = 1435;
+ public static GET_NOW_PLAYING = 1325;
+ public static GET_OFFICIAL_SONG_ID = 3189;
+ public static GET_SONG_INFO = 3082;
+ public static GET_SOUND_MACHINE_PLAYLIST = 3498;
+ public static GET_USER_SONG_DISKS = 2304;
+ public static REMOVE_JUKEBOX_DISK = 3050;
+ public static INTERSTITIAL_SHOWN = 1109;
+ public static GET_INTERSTITIAL = 2519;
+ public static CHANGE_USERNAME = 2977;
+ public static CHECK_USERNAME = 3950;
+ public static OPEN_CAMPAIGN_CALENDAR_DOOR_STAFF= 3889;
+ public static OPEN_CAMPAIGN_CALENDAR_DOOR = 2257;
+ public static BUILDERS_CLUB_PLACE_ROOM_ITEM = 1051;
+ public static BUILDERS_CLUB_PLACE_WALL_ITEM = 462;
+ public static BUILDERS_CLUB_QUERY_FURNI_COUNT = 2529;
+ public static GET_CATALOG_PAGE_EXPIRATION = 742;
+ public static GET_CATALOG_PAGE_WITH_EARLIEST_EXP = 3135;
+ public static GET_DIRECT_CLUB_BUY_AVAILABLE = 801;
+ public static GET_HABBO_BASIC_MEMBERSHIP_EXTEND_OFFER = 603;
+ public static GET_HABBO_CLUB_EXTEND_OFFER = 2462;
+ public static GET_IS_OFFER_GIFTABLE = 1347;
+ public static GET_LIMITED_OFFER_APPEARING_NEXT = 410;
+ public static GET_NEXT_TARGETED_OFFER = 596;
+ public static GET_ROOM_AD_PURCHASE_INFO = 1075;
+ public static GET_SEASONAL_CALENDAR_DAILY_OFFER = 3257;
+ public static GET_TARGETED_OFFER = 2487;
+ public static MARK_CATALOG_NEW_ADDITIONS_PAGE_OPENED = 2150;
+ public static PURCHASE_BASIC_MEMBERSHIP_EXTENSION = 2735;
+ public static PURCHASE_ROOM_AD = 777;
+ public static PURCHASE_TARGETED_OFFER = 1826;
+ public static PURCHASE_VIP_MEMBERSHIP_EXTENSION = 3407;
+ public static ROOM_AD_PURCHASE_INITIATED = 2283;
+ public static SET_TARGETTED_OFFER_STATE = 2041;
+ public static SHOP_TARGETED_OFFER_VIEWED = 3483;
+ public static HELPER_TALENT_TRACK = 196;
+ public static TALENT_TRACK_GET_LEVEL = 2127;
+ public static FORWARD_TO_A_COMPETITION_ROOM = 172;
+ public static FORWARD_TO_A_SUBMITTABLE_ROOM = 1450;
+ public static FORWARD_TO_RANDOM_COMPETITION_ROOM = 865;
+ public static GET_IS_USER_PART_OF_COMPETITION = 2077;
+ public static GET_SECONDS_UNTIL = 271;
+ public static ROOM_COMPETITION_INIT = 1334;
+ public static SUBMIT_ROOM_TO_COMPETITION = 2595;
+ public static VOTE_FOR_ROOM = 143;
+ public static GET_GIFT = 2436;
+ public static RESET_PHONE_NUMBER_STATE = 2741;
+ public static SET_PHONE_NUMBER_VERIFICATION_STATUS = 1379;
+ public static TRY_PHONE_NUMBER = 790;
+ public static VERIFY_CODE = 2721;
+ public static CONTROL_YOUTUBE_DISPLAY_PLAYBACK = 3005;
+ public static GET_YOUTUBE_DISPLAY_STATUS = 336;
+ public static SET_YOUTUBE_DISPLAY_PLAYLIST = 2069;
+ public static GO_TO_FLAT = 685;
+ public static CHANGE_QUEUE = 3093;
+ public static CALL_FOR_HELP_FROM_FORUM_MESSAGE = 1412;
+ public static CALL_FOR_HELP_FROM_FORUM_THREAD = 534;
+ public static CALL_FOR_HELP_FROM_IM = 2950;
+ public static CALL_FOR_HELP_FROM_PHOTO = 2492;
+ public static CALL_FOR_HELP_FROM_SELFIE = 2755;
+ public static CHAT_REVIEW_GUIDE_DECIDES = 3365;
+ public static CHAT_REVIEW_GUIDE_DETACHED = 2501;
+ public static CHAT_REVIEW_GUIDE_VOTE = 3961;
+ public static CHAT_REVIEW_SESSION_CREATE = 3060;
+ public static DELETE_PENDING_CALLS_FOR_HELP = 3605;
+ public static GET_CFH_STATUS = 2746;
+ public static GET_FAQ_CATEGORY = 3445;
+ public static GET_FAQ_TEXT = 1849;
+ public static GET_GUIDE_REPORTING_STATUS = 3786;
+ public static GET_PENDING_CALLS_FOR_HELP = 3267;
+ public static GET_QUIZ_QUESTIONS = 1296;
+ public static GUIDE_SESSION_CREATE = 3338;
+ public static GUIDE_SESSION_FEEDBACK = 477;
+ public static GUIDE_SESSION_GET_REQUESTER_ROOM = 1052;
+ public static GUIDE_SESSION_GUIDE_DECIDES = 1424;
+ public static GUIDE_SESSION_INVITE_REQUESTER = 234;
+ public static GUIDE_SESSION_IS_TYPING = 519;
+ public static GUIDE_SESSION_MESSAGE = 3899;
+ public static GUIDE_SESSION_ON_DUTY_UPDATE = 1922;
+ public static GUIDE_SESSION_REPORT = 3969;
+ public static GUIDE_SESSION_REQUESTER_CANCELS = 291;
+ public static GUIDE_SESSION_RESOLVED = 887;
+ public static POST_QUIZ_ANSWERS = 3720;
+ public static SEARCH_FAQS = 2031;
+ public static POLL_ANSWER = 3505;
+ public static POLL_REJECT = 1773;
+ public static POLL_START = 109;
+ public static POLL_VOTE_COUNTER = 6200;
+ public static DISCONNECT = 2445;
+ public static SCR_GET_KICKBACK_INFO = 869;
+ public static COMPOST_PLANT = 3835;
+ public static HARVEST_PET = 1521;
+ public static SET_CLOTHING_CHANGE_DATA = 924;
+ public static GROUP_UNFAVORITE = 1820;
+ public static NEW_USER_EXPERIENCE_GET_GIFTS = 1822;
+ public static NEW_USER_EXPERIENCE_SCRIPT_PROCEED = 1299;
+ public static HANDSHAKE_INIT_DIFFIE = 3110;
+ public static HANDSHAKE_COMPLETE_DIFFIE = 773;
+ public static WELCOME_OPEN_GIFT = 2638;
+ public static WELCOME_GIFT_CHANGE_EMAIL = 66;
+ public static EMAIL_GET_STATUS = 2557;
+ public static EMAIL_CHANGE = 3965;
+ public static APPROVE_ALL_MEMBERSHIP_REQUESTS = 882;
+ public static RENTABLE_SPACE_CANCEL_RENT = 1667;
+ public static RENTABLE_SPACE_RENT = 2946;
+ public static RENTABLE_SPACE_STATUS = 872;
+ public static TRACKING_PERFORMANCE_LOG = 3230;
+ public static TRACKING_LAG_WARNING_REPORT = 3847;
+ public static ROOM_DIRECTORY_ROOM_NETWORK_OPEN_CONNECTION = 3736;
+ public static RENTABLE_EXTEND_RENT_OR_BUYOUT_STRIP_ITEM = 2115;
+ public static RENTABLE_EXTEND_RENT_OR_BUYOUT_FURNI = 1071;
+ public static RENTABLE_GET_RENT_OR_BUYOUT_OFFER = 2518;
+}
diff --git a/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts
new file mode 100644
index 0000000..187c2b7
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetInterstitialMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts
new file mode 100644
index 0000000..7af8212
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class InterstitialShownMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts b/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts
new file mode 100644
index 0000000..a61513e
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class RequestAchievementsMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/advertisement/index.ts b/packages/communication/src/messages/outgoing/advertisement/index.ts
new file mode 100644
index 0000000..20e10fa
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/advertisement/index.ts
@@ -0,0 +1,3 @@
+export * from './GetInterstitialMessageComposer';
+export * from './InterstitialShownMessageComposer';
+export * from './RequestAchievementsMessageComposer';
diff --git a/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts
new file mode 100644
index 0000000..c720e17
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class ChangeUserNameMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(name: string)
+ {
+ this._data = [name];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts
new file mode 100644
index 0000000..05c0f99
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/avatar/CheckUserNameMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class CheckUserNameMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(name: string)
+ {
+ this._data = [name];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts
new file mode 100644
index 0000000..ff75801
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/avatar/GetWardrobeMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetWardrobeMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(pageId: number = 0)
+ {
+ this._data = [pageId];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts b/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts
new file mode 100644
index 0000000..0862e91
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class SaveWardrobeOutfitMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(slotId: number, look: string, gender: string)
+ {
+ this._data = [slotId, look, gender];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/avatar/index.ts b/packages/communication/src/messages/outgoing/avatar/index.ts
new file mode 100644
index 0000000..fc2f210
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/avatar/index.ts
@@ -0,0 +1,4 @@
+export * from './ChangeUserNameMessageComposer';
+export * from './CheckUserNameMessageComposer';
+export * from './GetWardrobeMessageComposer';
+export * from './SaveWardrobeOutfitMessageComposer';
diff --git a/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts
new file mode 100644
index 0000000..edc6c36
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class PhotoCompetitionMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts
new file mode 100644
index 0000000..3ba3789
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/PublishPhotoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class PublishPhotoMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts
new file mode 100644
index 0000000..6ee27d0
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/PurchasePhotoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class PurchasePhotoMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(photoId: string)
+ {
+ this._data = [photoId];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts
new file mode 100644
index 0000000..cf4c3ac
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/RenderRoomMessageComposer.ts
@@ -0,0 +1,43 @@
+import { IMessageComposer } from '@nitrots/api';
+import { TextureUtils } from '@nitrots/utils';
+import { RenderTexture } from 'pixi.js';
+
+export class RenderRoomMessageComposer implements IMessageComposer>
+{
+ private _data: any;
+
+ constructor(k: any = '', _arg_2: string = '', _arg_3: string = '', _arg_4: number = -1, _arg_5: number = -1)
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = [];
+ }
+
+ public async assignBitmap(texture: RenderTexture): Promise
+ {
+ const url = await TextureUtils.generateImageUrl(texture);
+
+ if(!url) return;
+
+ const base64Data = url.split(',')[1];
+ const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));
+
+ this._data.push(binaryData.byteLength, binaryData.buffer);
+ }
+
+ public assignBase64(base64: string): void
+ {
+ const base64Data = base64.split(',')[1];
+ const binaryData = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));
+
+ this._data.push(binaryData.byteLength, binaryData.buffer);
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts b/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts
new file mode 100644
index 0000000..78a2bf4
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts
@@ -0,0 +1,9 @@
+import { RenderRoomMessageComposer } from './RenderRoomMessageComposer';
+
+export class RenderRoomThumbnailMessageComposer extends RenderRoomMessageComposer
+{
+ constructor(k:any = '', _arg_2: string = '', _arg_3: string = '', _arg_4: number = -1, _arg_5: number = -1)
+ {
+ super(k, _arg_2, _arg_3, _arg_4, _arg_5);
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts b/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts
new file mode 100644
index 0000000..e845049
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/RequestCameraConfigurationComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class RequestCameraConfigurationComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/camera/index.ts b/packages/communication/src/messages/outgoing/camera/index.ts
new file mode 100644
index 0000000..626c1cd
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/camera/index.ts
@@ -0,0 +1,6 @@
+export * from './PhotoCompetitionMessageComposer';
+export * from './PublishPhotoMessageComposer';
+export * from './PurchasePhotoMessageComposer';
+export * from './RenderRoomMessageComposer';
+export * from './RenderRoomThumbnailMessageComposer';
+export * from './RequestCameraConfigurationComposer';
diff --git a/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts
new file mode 100644
index 0000000..d58a329
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class OpenCampaignCalendarDoorAsStaffComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: string, _arg_2: number)
+ {
+ this._data = [k, _arg_2];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts
new file mode 100644
index 0000000..27290a7
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class OpenCampaignCalendarDoorComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: string, _arg_2: number)
+ {
+ this._data = [k, _arg_2];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/campaign/index.ts b/packages/communication/src/messages/outgoing/campaign/index.ts
new file mode 100644
index 0000000..2ecdb09
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/campaign/index.ts
@@ -0,0 +1,2 @@
+export * from './OpenCampaignCalendarDoorAsStaffComposer';
+export * from './OpenCampaignCalendarDoorComposer';
diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts
new file mode 100644
index 0000000..5ee050a
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class BuildersClubPlaceRoomItemMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: number, _arg_2: number, _arg_3: string, _arg_4: number, _arg_5: number, _arg_6: number)
+ {
+ this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts
new file mode 100644
index 0000000..85a560b
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class BuildersClubPlaceWallItemMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: number, _arg_2: number, _arg_3: string, _arg_4: string)
+ {
+ this._data = [k, _arg_2, _arg_3, _arg_4];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts
new file mode 100644
index 0000000..6250ea9
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class BuildersClubQueryFurniCountMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts
new file mode 100644
index 0000000..b95e3f3
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetBonusRareInfoMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts
new file mode 100644
index 0000000..24e3564
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetBundleDiscountRulesetComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ dispose(): void
+ {
+ this._data = null;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts
new file mode 100644
index 0000000..9fbc8f3
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogIndexComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetCatalogIndexComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(mode: string)
+ {
+ this._data = [mode];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts
new file mode 100644
index 0000000..0b174ea
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetCatalogPageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(pageId: number, offerId: number, catalogType: string)
+ {
+ this._data = [pageId, offerId, catalogType];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts
new file mode 100644
index 0000000..c55aa49
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetCatalogPageExpirationComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: string)
+ {
+ this._data = [k];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts
new file mode 100644
index 0000000..9599381
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetCatalogPageWithEarliestExpiryComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetCatalogPageWithEarliestExpiryComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts b/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts
new file mode 100644
index 0000000..ed23ada
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetClubGiftInfo.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetClubGiftInfo implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts
new file mode 100644
index 0000000..bd9bbf8
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetClubOffersMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetClubOffersMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(offerId: number)
+ {
+ this._data = [offerId];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts
new file mode 100644
index 0000000..8b6ab07
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetDirectClubBuyAvailableComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetDirectClubBuyAvailableComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(days: number)
+ {
+ this._data = [days];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts
new file mode 100644
index 0000000..34e1dc1
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetGiftWrappingConfigurationComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetGiftWrappingConfigurationComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts
new file mode 100644
index 0000000..03611db
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetHabboBasicMembershipExtendOfferComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetHabboBasicMembershipExtendOfferComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts
new file mode 100644
index 0000000..ab895bc
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetHabboClubExtendOfferMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetHabboClubExtendOfferMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts
new file mode 100644
index 0000000..25ba416
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetIsOfferGiftableComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetIsOfferGiftableComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: number)
+ {
+ this._data = [k];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts
new file mode 100644
index 0000000..69ff44e
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetLimitedOfferAppearingNextComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetLimitedOfferAppearingNextComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts
new file mode 100644
index 0000000..5384330
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetNextTargetedOfferComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetNextTargetedOfferComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: number)
+ {
+ this._data = [k];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts
new file mode 100644
index 0000000..65ac19b
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetProductOfferComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetProductOfferComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(offerId: number)
+ {
+ this._data = [offerId];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts
new file mode 100644
index 0000000..6f7d3f0
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetRoomAdPurchaseInfoComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetRoomAdPurchaseInfoComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts
new file mode 100644
index 0000000..3cff9bd
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetSeasonalCalendarDailyOfferComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetSeasonalCalendarDailyOfferComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts
new file mode 100644
index 0000000..7b00e14
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetSellablePetPalettesComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetSellablePetPalettesComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(name: string)
+ {
+ this._data = [name];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts b/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts
new file mode 100644
index 0000000..bb70069
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/GetTargetedOfferComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class GetTargetedOfferComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts b/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts
new file mode 100644
index 0000000..0989a39
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/MarkCatalogNewAdditionsPageOpenedComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class MarkCatalogNewAdditionsPageOpenedComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts
new file mode 100644
index 0000000..34249dd
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/PurchaseBasicMembershipExtensionComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class PurchaseBasicMembershipExtensionComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor(k: number)
+ {
+ this._data = [k];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ this._data = null;
+ }
+}
diff --git a/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts
new file mode 100644
index 0000000..7471d73
--- /dev/null
+++ b/packages/communication/src/messages/outgoing/catalog/PurchaseFromCatalogAsGiftComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '@nitrots/api';
+
+export class PurchaseFromCatalogAsGiftComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters