diff --git a/package.json b/package.json
index e541bc3..183de94 100644
--- a/package.json
+++ b/package.json
@@ -4,13 +4,14 @@
"homepage": ".",
"private": true,
"scripts": {
- "start": "vite",
- "build": "vite build",
+ "start": "vite --base=/client/ --host",
+ "build": "vite build --base=/client/",
+ "preview": "vite preview --base=/client/ --host",
"build:prod": "npx browserslist@latest --update-db && yarn build",
"eslint": "eslint src --ext .ts,.tsx"
},
"dependencies": {
- "@nitrots/nitro-renderer": "^1.6.6",
+ "@nitrots/nitro-renderer": "file:submodules/renderer",
"@tanstack/react-virtual": "^3.0.0-alpha.0",
"emoji-toolkit": "^7.0.1",
"react": "^18.2.0",
@@ -38,4 +39,4 @@
"sass": "^1.56.2",
"vite": "^4.0.1"
}
-}
+}
\ No newline at end of file
diff --git a/submodules/renderer/.browserslistrc b/submodules/renderer/.browserslistrc
new file mode 100644
index 0000000..c529e38
--- /dev/null
+++ b/submodules/renderer/.browserslistrc
@@ -0,0 +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 2 Edge major versions
+last 2 Safari major versions
+last 2 iOS major versions
diff --git a/submodules/renderer/.editorconfig b/submodules/renderer/.editorconfig
new file mode 100644
index 0000000..0792692
--- /dev/null
+++ b/submodules/renderer/.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/submodules/renderer/.eslintrc.json b/submodules/renderer/.eslintrc.json
new file mode 100644
index 0000000..23546cf
--- /dev/null
+++ b/submodules/renderer/.eslintrc.json
@@ -0,0 +1,135 @@
+{
+ "env": {
+ "browser": true,
+ "es2021": true,
+ "node": true
+ },
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": 12,
+ "sourceType": "module"
+ },
+ "plugins": [
+ "@typescript-eslint"
+ ],
+ "rules": {
+ "indent": [
+ "error",
+ 4,
+ {
+ "SwitchCase": 1
+ }
+ ],
+ "no-multi-spaces": [
+ "error"
+ ],
+ "no-trailing-spaces": [
+ "error",
+ {
+ "skipBlankLines": false,
+ "ignoreComments": true
+ }
+ ],
+ "linebreak-style": [
+ "off"
+ ],
+ "quotes": [
+ "error",
+ "single"
+ ],
+ "semi": [
+ "error",
+ "always"
+ ],
+ "brace-style": [
+ "error",
+ "allman"
+ ],
+ "object-curly-spacing": [
+ "error",
+ "always"
+ ],
+ "keyword-spacing": [
+ "error",
+ {
+ "overrides":
+ {
+ "if":
+ {
+ "after": false
+ },
+ "for":
+ {
+ "after": false
+ },
+ "while":
+ {
+ "after": false
+ },
+ "switch":
+ {
+ "after": false
+ }
+ }
+ }
+ ],
+ "@typescript-eslint/no-explicit-any": [
+ "off"
+ ],
+ "@typescript-eslint/explicit-module-boundary-types": [
+ "off",
+ {
+ "allowedNames": [
+ "getMessageArray"
+ ]
+ }
+ ],
+ "@typescript-eslint/ban-ts-comment": [
+ "off"
+ ],
+ "@typescript-eslint/no-empty-function": [
+ "error",
+ {
+ "allow": [
+ "functions",
+ "arrowFunctions",
+ "generatorFunctions",
+ "methods",
+ "generatorMethods",
+ "constructors"
+ ]
+ }
+ ],
+ "@typescript-eslint/no-unused-vars": [
+ "off"
+ ],
+ "@typescript-eslint/no-inferrable-types": [
+ "error",
+ {
+ "ignoreParameters": true,
+ "ignoreProperties": true
+ }
+ ],
+ "@typescript-eslint/ban-types": [
+ "error",
+ {
+ "types":
+ {
+ "String": true,
+ "Boolean": true,
+ "Number": true,
+ "Symbol": true,
+ "{}": false,
+ "Object": false,
+ "object": false,
+ "Function": false
+ },
+ "extendDefaults": true
+ }
+ ]
+ }
+}
diff --git a/submodules/renderer/.gitignore b/submodules/renderer/.gitignore
new file mode 100644
index 0000000..1413af9
--- /dev/null
+++ b/submodules/renderer/.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/submodules/renderer/.gitlab-ci.yml b/submodules/renderer/.gitlab-ci.yml
new file mode 100644
index 0000000..5952b51
--- /dev/null
+++ b/submodules/renderer/.gitlab-ci.yml
@@ -0,0 +1,25 @@
+image: node:16.3
+
+stages:
+ - test
+ - compile
+
+ESLinter:
+ stage: test
+ script:
+ - npm i
+ - node ./node_modules/eslint/bin/eslint.js src/
+ cache:
+ key: ${CI_COMMIT_BRANCH}
+ paths:
+ - node_modules
+
+Compile:
+ stage: compile
+ script:
+ - yarn install
+ - yarn compile
+ cache:
+ key: ${CI_COMMIT_BRANCH}
+ paths:
+ - node_modules
diff --git a/submodules/renderer/.vscode/settings.json b/submodules/renderer/.vscode/settings.json
new file mode 100644
index 0000000..3fdf856
--- /dev/null
+++ b/submodules/renderer/.vscode/settings.json
@@ -0,0 +1,32 @@
+{
+ "typescript.tsdk": "node_modules\\typescript\\lib",
+ "typescript.preferences.importModuleSpecifier": "relative",
+ "typescript.preferences.quoteStyle": "single",
+ "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true,
+ "typescript.format.placeOpenBraceOnNewLineForFunctions": true,
+ "editor.wordWrap": "on",
+ "editor.codeActionsOnSave": {
+ "source.fixAll.eslint": true,
+ "source.fixAll.sortJSON": false,
+ "source.organizeImports": true
+ },
+ "editor.formatOnSave": false,
+ "git.ignoreLimitWarning": true,
+ "files.eol": "\n",
+ "files.insertFinalNewline": true,
+ "files.trimFinalNewlines": true,
+ "emmet.showExpandedAbbreviation": "never",
+ "eslint.format.enable": true,
+ "eslint.validate": [
+ "javascript",
+ "typescript"
+ ],
+ "eslint.workingDirectories": [
+ {
+ "pattern": "./src"
+ }
+ ],
+ "javascript.format.enable": false,
+ "thunder-client.saveToWorkspace": false,
+ "thunder-client.workspaceRelativePath": "."
+}
diff --git a/submodules/renderer/LICENSE b/submodules/renderer/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/submodules/renderer/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/submodules/renderer/README.md b/submodules/renderer/README.md
new file mode 100644
index 0000000..33c4b6b
--- /dev/null
+++ b/submodules/renderer/README.md
@@ -0,0 +1,17 @@
+# Nitro Renderer
+
+nitro-renderer is a Javascript library for rendering Nitro in the browser using PixiJS
+
+## Installation
+
+npm
+
+```
+npm install @nitrots/nitro-renderer
+```
+
+yarn
+
+```
+yarn add @nitrots/nitro-renderer
+```
diff --git a/submodules/renderer/index.ts b/submodules/renderer/index.ts
new file mode 100644
index 0000000..8420b10
--- /dev/null
+++ b/submodules/renderer/index.ts
@@ -0,0 +1 @@
+export * from './src';
diff --git a/submodules/renderer/package.json b/submodules/renderer/package.json
new file mode 100644
index 0000000..bf95445
--- /dev/null
+++ b/submodules/renderer/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "@nitrots/nitro-renderer",
+ "description": "Javascript library for rendering Nitro in the browser using PixiJS",
+ "version": "1.6.6",
+ "publishConfig": {
+ "access": "public"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://git.krews.org/nitro/nitro-renderer.git"
+ },
+ "license": "GPL-3.0",
+ "bugs": {
+ "url": "https://git.krews.org/nitro/nitro-renderer/issues"
+ },
+ "homepage": "https://git.krews.org/nitro/nitro-renderer",
+ "type": "module",
+ "scripts": {
+ "build": "vite build",
+ "compile": "tsc --project ./tsconfig.json --noEmit false",
+ "eslint": "eslint ./src --fix"
+ },
+ "main": "./index",
+ "dependencies": {
+ "@pixi/app": "~6.5.0",
+ "@pixi/basis": "~6.5.0",
+ "@pixi/canvas-display": "~6.5.0",
+ "@pixi/canvas-extract": "~6.5.0",
+ "@pixi/canvas-renderer": "~6.5.0",
+ "@pixi/constants": "~6.5.0",
+ "@pixi/core": "~6.5.0",
+ "@pixi/display": "~6.5.0",
+ "@pixi/events": "~6.5.0",
+ "@pixi/extensions": "~6.5.0",
+ "@pixi/extract": "~6.5.0",
+ "@pixi/filter-alpha": "~6.5.0",
+ "@pixi/filter-color-matrix": "~6.5.0",
+ "@pixi/graphics": "~6.5.0",
+ "@pixi/graphics-extras": "~6.5.0",
+ "@pixi/interaction": "~6.5.0",
+ "@pixi/loaders": "~6.5.0",
+ "@pixi/math": "~6.5.0",
+ "@pixi/math-extras": "~6.5.0",
+ "@pixi/mixin-cache-as-bitmap": "~6.5.0",
+ "@pixi/mixin-get-child-by-name": "~6.5.0",
+ "@pixi/mixin-get-global-position": "~6.5.0",
+ "@pixi/polyfill": "~6.5.0",
+ "@pixi/runner": "~6.5.0",
+ "@pixi/settings": "~6.5.0",
+ "@pixi/sprite": "~6.5.0",
+ "@pixi/sprite-tiling": "~6.5.0",
+ "@pixi/spritesheet": "~6.5.0",
+ "@pixi/text": "~6.5.0",
+ "@pixi/ticker": "~6.5.0",
+ "@pixi/tilemap": "^3.2.2",
+ "@pixi/utils": "~6.5.0",
+ "gifuct-js": "^2.1.2",
+ "howler": "^2.2.3",
+ "pako": "^2.0.4"
+ },
+ "devDependencies": {
+ "@rollup/plugin-typescript": "^10.0.1",
+ "@types/howler": "^2.2.7",
+ "@types/pako": "^1.0.3",
+ "@typescript-eslint/eslint-plugin": "^5.30.7",
+ "@typescript-eslint/parser": "^5.30.7",
+ "eslint": "^8.20.0",
+ "tslib": "^2.3.1",
+ "typescript": "~4.4.4",
+ "vite": "^4.0.2",
+ "vite-plugin-minify": "^1.5.2"
+ }
+}
diff --git a/submodules/renderer/src/api/INitroCore.ts b/submodules/renderer/src/api/INitroCore.ts
new file mode 100644
index 0000000..a63afc4
--- /dev/null
+++ b/submodules/renderer/src/api/INitroCore.ts
@@ -0,0 +1,9 @@
+import { IDisposable } from './common';
+import { ICommunicationManager } from './communication';
+import { IConfigurationManager } from './configuration';
+
+export interface INitroCore extends IDisposable
+{
+ configuration: IConfigurationManager;
+ communication: ICommunicationManager;
+}
diff --git a/submodules/renderer/src/api/asset/AssetManager.ts b/submodules/renderer/src/api/asset/AssetManager.ts
new file mode 100644
index 0000000..fa23735
--- /dev/null
+++ b/submodules/renderer/src/api/asset/AssetManager.ts
@@ -0,0 +1,205 @@
+import { BaseTexture, Resource, Texture } from '@pixi/core';
+import { Spritesheet } from '@pixi/spritesheet';
+import { NitroLogger } from '../common';
+import { ArrayBufferToBase64, NitroBundle } from '../utils';
+import { GraphicAssetCollection } from './GraphicAssetCollection';
+import { IAssetData } from './IAssetData';
+import { IAssetManager } from './IAssetManager';
+import { IGraphicAsset } from './IGraphicAsset';
+import { IGraphicAssetCollection } from './IGraphicAssetCollection';
+
+export class AssetManager implements IAssetManager
+{
+ public static _INSTANCE: IAssetManager = new AssetManager();
+
+ private _textures: Map> = new Map();
+ private _collections: Map = new Map();
+
+ public getTexture(name: string): Texture
+ {
+ if(!name) return null;
+
+ const existing = this._textures.get(name);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public setTexture(name: string, texture: Texture): void
+ {
+ if(!name || !texture) return;
+
+ 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;
+ }
+
+ return null;
+ }
+
+ public getCollection(name: string): IGraphicAssetCollection
+ {
+ if(!name) return null;
+
+ const existing = this._collections.get(name);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ public createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection
+ {
+ if(!data) return null;
+
+ const collection = new GraphicAssetCollection(data, spritesheet);
+
+ if(collection)
+ {
+ for(const [name, texture] of collection.textures.entries()) this.setTexture(name, texture);
+
+ this._collections.set(collection.name, collection);
+ }
+
+ return collection;
+ }
+
+ public async downloadAsset(url: string): Promise
+ {
+ return await this.downloadAssets([url]);
+ }
+
+ public async downloadAssets(urls: string[]): Promise
+ {
+ if(!urls || !urls.length) return Promise.resolve(true);
+
+ try
+ {
+ for(const url of urls)
+ {
+ const response = await fetch(url);
+
+ if(response.status !== 200) continue;
+
+ let contentType = 'application/octet-stream';
+
+ if(response.headers.has('Content-Type'))
+ {
+ contentType = response.headers.get('Content-Type');
+ }
+
+ switch(contentType)
+ {
+ case 'application/octet-stream': {
+ const buffer = await response.arrayBuffer();
+ const nitroBundle = new NitroBundle(buffer);
+
+ await this.processAsset(
+ nitroBundle.baseTexture,
+ nitroBundle.jsonFile as IAssetData
+ );
+ break;
+ }
+ case 'image/png':
+ case 'image/jpeg':
+ case 'image/gif': {
+ const buffer = await response.arrayBuffer();
+ const base64 = ArrayBufferToBase64(buffer);
+ const baseTexture = BaseTexture.from(
+ `data:${ contentType };base64,${ base64 }`
+ );
+
+ const createAsset = async () =>
+ {
+ const texture = new Texture(baseTexture);
+ this.setTexture(url, texture);
+ };
+
+ if(baseTexture.valid)
+ {
+ await createAsset();
+ }
+ else
+ {
+ await new Promise((resolve, reject) =>
+ {
+ baseTexture.once('update', async () =>
+ {
+ await createAsset();
+
+ return resolve();
+ });
+ });
+ }
+ break;
+ }
+ }
+ }
+
+ return Promise.resolve(true);
+ }
+ catch (err)
+ {
+ NitroLogger.error(err);
+
+ return Promise.resolve(false);
+ }
+ }
+
+ private async processAsset(baseTexture: BaseTexture, data: IAssetData): Promise
+ {
+ const spritesheetData = data.spritesheet;
+
+ if(!baseTexture || !spritesheetData || !Object.keys(spritesheetData).length)
+ {
+ this.createCollection(data, null);
+
+ return;
+ }
+
+ const createAsset = async () =>
+ {
+ const spritesheet = new Spritesheet(baseTexture, spritesheetData);
+
+ await spritesheet.parse();
+
+ this.createCollection(data, spritesheet);
+ };
+
+ if(baseTexture.valid)
+ {
+ await createAsset();
+ }
+ else
+ {
+ await new Promise((resolve, reject) =>
+ {
+ baseTexture.once('update', async () =>
+ {
+ await createAsset();
+
+ return resolve();
+ });
+ });
+ }
+ }
+
+ public get collections(): Map
+ {
+ return this._collections;
+ }
+}
diff --git a/submodules/renderer/src/api/asset/GetAssetManager.ts b/submodules/renderer/src/api/asset/GetAssetManager.ts
new file mode 100644
index 0000000..e17c720
--- /dev/null
+++ b/submodules/renderer/src/api/asset/GetAssetManager.ts
@@ -0,0 +1,3 @@
+import { AssetManager } from './AssetManager';
+
+export const GetAssetManager = () => AssetManager._INSTANCE;
diff --git a/submodules/renderer/src/api/asset/GraphicAsset.ts b/submodules/renderer/src/api/asset/GraphicAsset.ts
new file mode 100644
index 0000000..b99bb71
--- /dev/null
+++ b/submodules/renderer/src/api/asset/GraphicAsset.ts
@@ -0,0 +1,148 @@
+import { Resource, Texture } from '@pixi/core';
+import { Rectangle } from '@pixi/math';
+import { Sprite } from '@pixi/sprite';
+import { TextureUtils } from '../../pixi-proxy';
+import { IGraphicAsset } from './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 getImageUrl(): string
+ {
+ return TextureUtils.generateImageUrl(new Sprite(this._texture));
+ }
+
+ 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/submodules/renderer/src/api/asset/GraphicAssetCollection.ts b/submodules/renderer/src/api/asset/GraphicAssetCollection.ts
new file mode 100644
index 0000000..990b78c
--- /dev/null
+++ b/submodules/renderer/src/api/asset/GraphicAssetCollection.ts
@@ -0,0 +1,392 @@
+import { BaseTexture, Resource, Texture } from '@pixi/core';
+import { Spritesheet } from '@pixi/spritesheet';
+import { Dict } from '@pixi/utils';
+import { GetTickerTime } from '../../pixi-proxy';
+import { GraphicAsset } from './GraphicAsset';
+import { GraphicAssetPalette } from './GraphicAssetPalette';
+import { IAsset } from './IAsset';
+import { IAssetData } from './IAssetData';
+import { IAssetPalette } from './IAssetPalette';
+import { IGraphicAsset } from './IGraphicAsset';
+import { IGraphicAssetCollection } from './IGraphicAssetCollection';
+
+export class GraphicAssetCollection implements IGraphicAssetCollection
+{
+ private static PALETTE_ASSET_DISPOSE_THRESHOLD: number = 10;
+
+ private _referenceCount: number;
+ private _referenceTimestamp: number;
+
+ private _name: string;
+ private _baseTexture: BaseTexture;
+ 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._baseTexture = ((spritesheet && spritesheet.baseTexture) || 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)
+ {
+ for(const palette of this._palettes.values()) palette.dispose();
+
+ 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++;
+ this._referenceTimestamp = GetTickerTime();
+ }
+
+ public removeReference(): void
+ {
+ this._referenceCount--;
+
+ if(this._referenceCount <= 0)
+ {
+ this._referenceCount = 0;
+ this._referenceTimestamp = GetTickerTime();
+
+ 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): GraphicAssetPalette
+ {
+ if(!name) return null;
+
+ const existing = this._palettes.get(name);
+
+ if(!existing) return null;
+
+ return existing;
+ }
+
+ 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.baseTexture = texture.baseTexture;
+ existingTexture.frame = texture.frame;
+ 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 referenceTimestamp(): number
+ {
+ return this._referenceTimestamp;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+
+ public get baseTexture(): BaseTexture
+ {
+ return this._baseTexture;
+ }
+
+ public get data(): IAssetData
+ {
+ return this._data;
+ }
+
+ public get textures(): Map
+ {
+ return this._textures;
+ }
+
+ public get assets(): Map
+ {
+ return this._assets;
+ }
+}
diff --git a/submodules/renderer/src/api/asset/GraphicAssetGifCollection.ts b/submodules/renderer/src/api/asset/GraphicAssetGifCollection.ts
new file mode 100644
index 0000000..a09adbc
--- /dev/null
+++ b/submodules/renderer/src/api/asset/GraphicAssetGifCollection.ts
@@ -0,0 +1,11 @@
+import { Resource, Texture } from '@pixi/core';
+
+export class GraphicAssetGifCollection
+{
+ constructor(
+ public name: string,
+ public textures: Texture[],
+ public durations: number[]
+ )
+ {}
+}
diff --git a/submodules/renderer/src/api/asset/GraphicAssetPalette.ts b/submodules/renderer/src/api/asset/GraphicAssetPalette.ts
new file mode 100644
index 0000000..0a1ecc7
--- /dev/null
+++ b/submodules/renderer/src/api/asset/GraphicAssetPalette.ts
@@ -0,0 +1,61 @@
+import { Renderer, Resource, Texture } from '@pixi/core';
+import { Sprite } from '@pixi/sprite';
+import { PixiApplicationProxy, TextureUtils } from '../../pixi-proxy';
+
+export class GraphicAssetPalette
+{
+ 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 dispose(): void
+ {
+
+ }
+
+ public applyPalette(texture: Texture): Texture
+ {
+ const renderTexture = TextureUtils.createAndWriteRenderTexture(texture.width, texture.height, new Sprite(texture));
+ const pixels = TextureUtils.getPixels(renderTexture);
+
+ for(let i = 0; i < pixels.length; i += 4)
+ {
+ let paletteColor = this._palette[pixels[i + 1]];
+
+ if(paletteColor === undefined) paletteColor = [0, 0, 0];
+
+ pixels[i] = paletteColor[0];
+ pixels[i + 1] = paletteColor[1];
+ pixels[i + 2] = paletteColor[2];
+ }
+
+ const canvaGLTexture = renderTexture.baseTexture._glTextures['1']?.texture;
+ const gl = (PixiApplicationProxy.instance.renderer as Renderer)?.gl;
+
+ gl.bindTexture(gl.TEXTURE_2D, canvaGLTexture);
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, renderTexture.width, renderTexture.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
+ gl.bindTexture(gl.TEXTURE_2D, null);
+
+ return renderTexture;
+ }
+
+ public get primaryColor(): number
+ {
+ return this._primaryColor;
+ }
+
+ public get secondaryColor(): number
+ {
+ return this._secondaryColor;
+ }
+}
diff --git a/submodules/renderer/src/api/asset/IAsset.ts b/submodules/renderer/src/api/asset/IAsset.ts
new file mode 100644
index 0000000..f4e4fb4
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/IAssetAlias.ts b/submodules/renderer/src/api/asset/IAssetAlias.ts
new file mode 100644
index 0000000..5c14027
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IAssetAlias.ts
@@ -0,0 +1,6 @@
+export interface IAssetAlias
+{
+ link?: string;
+ flipH?: boolean;
+ flipV?: boolean;
+}
diff --git a/submodules/renderer/src/api/asset/IAssetData.ts b/submodules/renderer/src/api/asset/IAssetData.ts
new file mode 100644
index 0000000..f12820f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/IAssetManager.ts b/submodules/renderer/src/api/asset/IAssetManager.ts
new file mode 100644
index 0000000..d2be282
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IAssetManager.ts
@@ -0,0 +1,18 @@
+
+import { Resource, Texture } from '@pixi/core';
+import { Spritesheet } from '@pixi/spritesheet';
+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;
+ getAsset(name: string): IGraphicAsset;
+ getCollection(name: string): IGraphicAssetCollection;
+ createCollection(data: IAssetData, spritesheet: Spritesheet): IGraphicAssetCollection;
+ downloadAssets(urls: string[]): Promise;
+ downloadAsset(url: string): Promise;
+ collections: Map;
+}
diff --git a/submodules/renderer/src/api/asset/IAssetPalette.ts b/submodules/renderer/src/api/asset/IAssetPalette.ts
new file mode 100644
index 0000000..9b0384b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/IGraphicAsset.ts b/submodules/renderer/src/api/asset/IGraphicAsset.ts
new file mode 100644
index 0000000..ea4c633
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IGraphicAsset.ts
@@ -0,0 +1,19 @@
+import { Resource, Texture } from '@pixi/core';
+import { Rectangle } from '@pixi/math';
+
+export interface IGraphicAsset
+{
+ name: string;
+ source: string;
+ texture: Texture;
+ usesPalette: boolean;
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ offsetX: number;
+ offsetY: number;
+ flipH: boolean;
+ flipV: boolean;
+ rectangle: Rectangle;
+}
diff --git a/submodules/renderer/src/api/asset/IGraphicAssetCollection.ts b/submodules/renderer/src/api/asset/IGraphicAssetCollection.ts
new file mode 100644
index 0000000..50b797a
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IGraphicAssetCollection.ts
@@ -0,0 +1,25 @@
+import { BaseTexture, Resource, Texture } from '@pixi/core';
+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;
+ referenceTimestamp: number;
+ name: string;
+ baseTexture: BaseTexture;
+ data: IAssetData;
+}
diff --git a/submodules/renderer/src/api/asset/IGraphicAssetGifCollection.ts b/submodules/renderer/src/api/asset/IGraphicAssetGifCollection.ts
new file mode 100644
index 0000000..c17b368
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IGraphicAssetGifCollection.ts
@@ -0,0 +1,8 @@
+import { Resource, Texture } from '@pixi/core';
+
+export interface IGraphicAssetGifCollection
+{
+ name: string;
+ textures: Texture[];
+ durations: number[];
+}
diff --git a/submodules/renderer/src/api/asset/IGraphicAssetPalette.ts b/submodules/renderer/src/api/asset/IGraphicAssetPalette.ts
new file mode 100644
index 0000000..60e8223
--- /dev/null
+++ b/submodules/renderer/src/api/asset/IGraphicAssetPalette.ts
@@ -0,0 +1,9 @@
+import { Resource, Texture } from '@pixi/core';
+
+export interface IGraphicAssetPalette
+{
+ dispose: () => void;
+ applyPalette(texture: Texture): Texture;
+ primaryColor: number;
+ secondaryColor: number;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimation.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimation.ts
new file mode 100644
index 0000000..b35e0eb
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/animation/IAssetAnimationAdd.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationAdd.ts
new file mode 100644
index 0000000..3da37c6
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationAdd.ts
@@ -0,0 +1,8 @@
+export interface IAssetAnimationAdd
+{
+ id?: string;
+ align?: string;
+ blend?: string;
+ ink?: number;
+ base?: string;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationAvatar.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationAvatar.ts
new file mode 100644
index 0000000..dcd030e
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationAvatar.ts
@@ -0,0 +1,6 @@
+export interface IAssetAnimationAvatar
+{
+ ink?: number;
+ foreground?: string;
+ background?: string;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationDirection.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationDirection.ts
new file mode 100644
index 0000000..0c18eae
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationDirection.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationDirection
+{
+ offset?: number;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationFrame.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationFrame.ts
new file mode 100644
index 0000000..b8b88a0
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationFrame.ts
@@ -0,0 +1,8 @@
+import { IAssetAnimationFramePart } from './IAssetAnimationFramePart';
+
+export interface IAssetAnimationFrame
+{
+ repeats?: number;
+ fxs?: IAssetAnimationFramePart[];
+ bodyparts?: IAssetAnimationFramePart[];
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationFramePart.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationFramePart.ts
new file mode 100644
index 0000000..ac8c093
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/animation/IAssetAnimationFramePartItem.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationFramePartItem.ts
new file mode 100644
index 0000000..45a7642
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationFramePartItem.ts
@@ -0,0 +1,5 @@
+export interface IAssetAnimationFramePartItem
+{
+ id?: string;
+ base?: string;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationOverride.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationOverride.ts
new file mode 100644
index 0000000..3d56833
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationOverride.ts
@@ -0,0 +1,8 @@
+import { IAssetAnimationFrame } from './IAssetAnimationFrame';
+
+export interface IAssetAnimationOverride
+{
+ name?: string;
+ override?: string;
+ frames?: IAssetAnimationFrame[];
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationRemove.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationRemove.ts
new file mode 100644
index 0000000..ac65fb5
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationRemove.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationRemove
+{
+ id?: string;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationShadow.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationShadow.ts
new file mode 100644
index 0000000..dfe22a8
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationShadow.ts
@@ -0,0 +1,4 @@
+export interface IAssetAnimationShadow
+{
+ id?: string;
+}
diff --git a/submodules/renderer/src/api/asset/animation/IAssetAnimationSprite.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationSprite.ts
new file mode 100644
index 0000000..afc7b05
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/animation/IAssetAnimationSpriteDirection.ts b/submodules/renderer/src/api/asset/animation/IAssetAnimationSpriteDirection.ts
new file mode 100644
index 0000000..746719d
--- /dev/null
+++ b/submodules/renderer/src/api/asset/animation/IAssetAnimationSpriteDirection.ts
@@ -0,0 +1,7 @@
+export interface IAssetAnimationSpriteDirection
+{
+ id?: number;
+ dx?: number;
+ dy?: number;
+ dz?: number;
+}
diff --git a/submodules/renderer/src/api/asset/animation/index.ts b/submodules/renderer/src/api/asset/animation/index.ts
new file mode 100644
index 0000000..56543d0
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/index.ts b/submodules/renderer/src/api/asset/index.ts
new file mode 100644
index 0000000..3ba873f
--- /dev/null
+++ b/submodules/renderer/src/api/asset/index.ts
@@ -0,0 +1,26 @@
+export * from './animation';
+export * from './AssetManager';
+export * from './GetAssetManager';
+export * from './GraphicAsset';
+export * from './GraphicAssetCollection';
+export * from './GraphicAssetGifCollection';
+export * from './GraphicAssetPalette';
+export * from './IAsset';
+export * from './IAssetAlias';
+export * from './IAssetData';
+export * from './IAssetManager';
+export * from './IAssetPalette';
+export * from './IGraphicAsset';
+export * from './IGraphicAssetCollection';
+export * from './IGraphicAssetGifCollection';
+export * from './IGraphicAssetPalette';
+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/submodules/renderer/src/api/asset/logic/IAssetLogicCustomVars.ts b/submodules/renderer/src/api/asset/logic/IAssetLogicCustomVars.ts
new file mode 100644
index 0000000..1ebd4a8
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/IAssetLogicCustomVars.ts
@@ -0,0 +1,4 @@
+export interface ICustomVars
+{
+ variables?: string[];
+}
diff --git a/submodules/renderer/src/api/asset/logic/IAssetLogicData.ts b/submodules/renderer/src/api/asset/logic/IAssetLogicData.ts
new file mode 100644
index 0000000..acf484c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/IAssetLogicPlanetSystem.ts b/submodules/renderer/src/api/asset/logic/IAssetLogicPlanetSystem.ts
new file mode 100644
index 0000000..47521bc
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/ISoundSample.ts b/submodules/renderer/src/api/asset/logic/ISoundSample.ts
new file mode 100644
index 0000000..003f9f6
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/ISoundSample.ts
@@ -0,0 +1,5 @@
+export interface ISoundSample
+{
+ id?: number;
+ noPitch?: boolean;
+}
diff --git a/submodules/renderer/src/api/asset/logic/index.ts b/submodules/renderer/src/api/asset/logic/index.ts
new file mode 100644
index 0000000..569907b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/model/IAssetDimension.ts b/submodules/renderer/src/api/asset/logic/model/IAssetDimension.ts
new file mode 100644
index 0000000..4a4629f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/model/IAssetLogicModel.ts b/submodules/renderer/src/api/asset/logic/model/IAssetLogicModel.ts
new file mode 100644
index 0000000..eef3245
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/model/IAssetLogicModel.ts
@@ -0,0 +1,7 @@
+import { IAssetDimension } from './IAssetDimension';
+
+export interface IAssetLogicModel
+{
+ dimensions?: IAssetDimension;
+ directions?: number[];
+}
diff --git a/submodules/renderer/src/api/asset/logic/model/index.ts b/submodules/renderer/src/api/asset/logic/model/index.ts
new file mode 100644
index 0000000..4d08a72
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/model/index.ts
@@ -0,0 +1,2 @@
+export * from './IAssetDimension';
+export * from './IAssetLogicModel';
diff --git a/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystem.ts b/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystem.ts
new file mode 100644
index 0000000..871f5f3
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemEmitter.ts b/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemEmitter.ts
new file mode 100644
index 0000000..fa175e2
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemParticle.ts b/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemParticle.ts
new file mode 100644
index 0000000..99281fa
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemParticle.ts
@@ -0,0 +1,7 @@
+export interface IParticleSystemParticle
+{
+ isEmitter?: boolean;
+ lifeTime?: number;
+ fade?: boolean;
+ frames?: string[];
+}
diff --git a/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemSimulation.ts b/submodules/renderer/src/api/asset/logic/particlesystem/IParticleSystemSimulation.ts
new file mode 100644
index 0000000..fef400c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/logic/particlesystem/index.ts b/submodules/renderer/src/api/asset/logic/particlesystem/index.ts
new file mode 100644
index 0000000..428f6fc
--- /dev/null
+++ b/submodules/renderer/src/api/asset/logic/particlesystem/index.ts
@@ -0,0 +1,4 @@
+export * from './IParticleSystem';
+export * from './IParticleSystemEmitter';
+export * from './IParticleSystemParticle';
+export * from './IParticleSystemSimulation';
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlane.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlane.ts
new file mode 100644
index 0000000..6007641
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMask.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMask.ts
new file mode 100644
index 0000000..0fd8465
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMask.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaskVisualization } from './IAssetPlaneMaskVisualization';
+
+export interface IAssetPlaneMask
+{
+ id?: string;
+ visualizations?: IAssetPlaneMaskVisualization[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskData.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskData.ts
new file mode 100644
index 0000000..2767b59
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskData.ts
@@ -0,0 +1,6 @@
+import { IAssetPlaneMask } from './IAssetPlaneMask';
+
+export interface IAssetPlaneMaskData
+{
+ masks?: IAssetPlaneMask[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskVisualization.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskVisualization.ts
new file mode 100644
index 0000000..66c5ae8
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaskVisualization.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap';
+
+export interface IAssetPlaneMaskVisualization
+{
+ size?: number;
+ bitmaps?: IAssetPlaneTextureBitmap[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterial.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterial.ts
new file mode 100644
index 0000000..59ae007
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterial.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaterialCellMatrix } from './IAssetPlaneMaterialCellMatrix';
+
+export interface IAssetPlaneMaterial
+{
+ id?: string;
+ matrices?: IAssetPlaneMaterialCellMatrix[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCell.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCell.ts
new file mode 100644
index 0000000..fafae27
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCell.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneMaterialCellExtraItemData } from './IAssetPlaneMaterialCellExtraItemData';
+
+export interface IAssetPlaneMaterialCell
+{
+ textureId?: string;
+ extraData?: IAssetPlaneMaterialCellExtraItemData;
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellColumn.ts
new file mode 100644
index 0000000..d2b36d3
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts
new file mode 100644
index 0000000..a49833f
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellExtraItemData.ts
@@ -0,0 +1,6 @@
+export interface IAssetPlaneMaterialCellExtraItemData
+{
+ limitMax?: number;
+ extraItemTypes?: string[];
+ offsets?: [number, number][];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneMaterialCellMatrix.ts
new file mode 100644
index 0000000..526cde2
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneTexture.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneTexture.ts
new file mode 100644
index 0000000..fff62fa
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneTexture.ts
@@ -0,0 +1,7 @@
+import { IAssetPlaneTextureBitmap } from './IAssetPlaneTextureBitmap';
+
+export interface IAssetPlaneTexture
+{
+ id?: string;
+ bitmaps?: IAssetPlaneTextureBitmap[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneTextureBitmap.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneTextureBitmap.ts
new file mode 100644
index 0000000..e1af985
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualization.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualization.ts
new file mode 100644
index 0000000..db3b4de
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts
new file mode 100644
index 0000000..4cd50c2
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayer.ts
@@ -0,0 +1,6 @@
+import { IAssetPlaneVisualizationAnimatedLayerItem } from './IAssetPlaneVisualizationAnimatedLayerItem';
+
+export interface IAssetPlaneVisualizationAnimatedLayer
+{
+ items?: IAssetPlaneVisualizationAnimatedLayerItem[];
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationAnimatedLayerItem.ts
new file mode 100644
index 0000000..9ee426e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationData.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationData.ts
new file mode 100644
index 0000000..4e48d53
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationLayer.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationLayer.ts
new file mode 100644
index 0000000..e009893
--- /dev/null
+++ b/submodules/renderer/src/api/asset/room-visualization/IAssetPlaneVisualizationLayer.ts
@@ -0,0 +1,7 @@
+export interface IAssetPlaneVisualizationLayer
+{
+ materialId?: string;
+ color?: number;
+ offset?: number;
+ align?: string;
+}
diff --git a/submodules/renderer/src/api/asset/room-visualization/IAssetRoomVisualizationData.ts b/submodules/renderer/src/api/asset/room-visualization/IAssetRoomVisualizationData.ts
new file mode 100644
index 0000000..e82ea8f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/room-visualization/index.ts b/submodules/renderer/src/api/asset/room-visualization/index.ts
new file mode 100644
index 0000000..4d6face
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/spritesheet/ISpritesheetData.ts b/submodules/renderer/src/api/asset/spritesheet/ISpritesheetData.ts
new file mode 100644
index 0000000..2858958
--- /dev/null
+++ b/submodules/renderer/src/api/asset/spritesheet/ISpritesheetData.ts
@@ -0,0 +1,7 @@
+import { ISpritesheetData as PixiSpritesheet } from '@pixi/spritesheet';
+import { ISpritesheetMeta } from './ISpritesheetMeta';
+
+export interface ISpritesheetData extends PixiSpritesheet
+{
+ meta: ISpritesheetMeta;
+}
diff --git a/submodules/renderer/src/api/asset/spritesheet/ISpritesheetFrame.ts b/submodules/renderer/src/api/asset/spritesheet/ISpritesheetFrame.ts
new file mode 100644
index 0000000..0833b50
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/spritesheet/ISpritesheetMeta.ts b/submodules/renderer/src/api/asset/spritesheet/ISpritesheetMeta.ts
new file mode 100644
index 0000000..3a74f7b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/spritesheet/index.ts b/submodules/renderer/src/api/asset/spritesheet/index.ts
new file mode 100644
index 0000000..9c94e8b
--- /dev/null
+++ b/submodules/renderer/src/api/asset/spritesheet/index.ts
@@ -0,0 +1,3 @@
+export * from './ISpritesheetData';
+export * from './ISpritesheetFrame';
+export * from './ISpritesheetMeta';
diff --git a/submodules/renderer/src/api/asset/visualization/IAssetVisualizationData.ts b/submodules/renderer/src/api/asset/visualization/IAssetVisualizationData.ts
new file mode 100644
index 0000000..e17ecdc
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/IAssetVisualizationData.ts
@@ -0,0 +1,20 @@
+import { IAssetVisualAnimation } from './animation/IAssetVisualAnimation';
+import { IAssetColor } from './color/IAssetColor';
+import { IAssetGesture } from './gestures/IAssetGesture';
+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/submodules/renderer/src/api/asset/visualization/IAssetVisualizationDirection.ts b/submodules/renderer/src/api/asset/visualization/IAssetVisualizationDirection.ts
new file mode 100644
index 0000000..cc628f1
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/IAssetVisualizationDirection.ts
@@ -0,0 +1,6 @@
+import { IAssetVisualizationLayer } from './IAssetVisualizationLayer';
+
+export interface IAssetVisualizationDirection
+{
+ layers?: { [index: string]: IAssetVisualizationLayer };
+}
diff --git a/submodules/renderer/src/api/asset/visualization/IAssetVisualizationLayer.ts b/submodules/renderer/src/api/asset/visualization/IAssetVisualizationLayer.ts
new file mode 100644
index 0000000..61fcf56
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimation.ts b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimation.ts
new file mode 100644
index 0000000..4e71438
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationLayer.ts b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationLayer.ts
new file mode 100644
index 0000000..2a274ea
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequence.ts b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequence.ts
new file mode 100644
index 0000000..bb25104
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequenceFrame.ts
new file mode 100644
index 0000000..196631e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
new file mode 100644
index 0000000..bc85461
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/animation/IAssetVisualAnimationSequenceFrameOffset.ts
@@ -0,0 +1,6 @@
+export interface IAssetVisualAnimationSequenceFrameOffset
+{
+ direction?: number;
+ x?: number;
+ y?: number;
+}
diff --git a/submodules/renderer/src/api/asset/visualization/animation/index.ts b/submodules/renderer/src/api/asset/visualization/animation/index.ts
new file mode 100644
index 0000000..19b332c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/asset/visualization/color/IAssetColor.ts b/submodules/renderer/src/api/asset/visualization/color/IAssetColor.ts
new file mode 100644
index 0000000..29ebc75
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/color/IAssetColor.ts
@@ -0,0 +1,6 @@
+import { IAssetColorLayer } from './IAssetColorLayer';
+
+export interface IAssetColor
+{
+ layers?: { [index: string]: IAssetColorLayer };
+}
diff --git a/submodules/renderer/src/api/asset/visualization/color/IAssetColorLayer.ts b/submodules/renderer/src/api/asset/visualization/color/IAssetColorLayer.ts
new file mode 100644
index 0000000..7a1372e
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/color/IAssetColorLayer.ts
@@ -0,0 +1,4 @@
+export interface IAssetColorLayer
+{
+ color?: number;
+}
diff --git a/submodules/renderer/src/api/asset/visualization/color/index.ts b/submodules/renderer/src/api/asset/visualization/color/index.ts
new file mode 100644
index 0000000..00aff50
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/color/index.ts
@@ -0,0 +1,2 @@
+export * from './IAssetColor';
+export * from './IAssetColorLayer';
diff --git a/submodules/renderer/src/api/asset/visualization/gestures/IAssetGesture.ts b/submodules/renderer/src/api/asset/visualization/gestures/IAssetGesture.ts
new file mode 100644
index 0000000..ddf3752
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/gestures/IAssetGesture.ts
@@ -0,0 +1,5 @@
+export interface IAssetGesture
+{
+ id?: string;
+ animationId?: number;
+}
diff --git a/submodules/renderer/src/api/asset/visualization/gestures/index.ts b/submodules/renderer/src/api/asset/visualization/gestures/index.ts
new file mode 100644
index 0000000..2c6e978
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/gestures/index.ts
@@ -0,0 +1 @@
+export * from './IAssetGesture';
diff --git a/submodules/renderer/src/api/asset/visualization/index.ts b/submodules/renderer/src/api/asset/visualization/index.ts
new file mode 100644
index 0000000..334bddc
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/index.ts
@@ -0,0 +1,7 @@
+export * from './animation';
+export * from './color';
+export * from './gestures';
+export * from './IAssetVisualizationData';
+export * from './IAssetVisualizationDirection';
+export * from './IAssetVisualizationLayer';
+export * from './postures';
diff --git a/submodules/renderer/src/api/asset/visualization/postures/IAssetPosture.ts b/submodules/renderer/src/api/asset/visualization/postures/IAssetPosture.ts
new file mode 100644
index 0000000..3313851
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/postures/IAssetPosture.ts
@@ -0,0 +1,5 @@
+export interface IAssetPosture
+{
+ id?: string;
+ animationId?: number;
+}
diff --git a/submodules/renderer/src/api/asset/visualization/postures/index.ts b/submodules/renderer/src/api/asset/visualization/postures/index.ts
new file mode 100644
index 0000000..c24c1b9
--- /dev/null
+++ b/submodules/renderer/src/api/asset/visualization/postures/index.ts
@@ -0,0 +1 @@
+export * from './IAssetPosture';
diff --git a/submodules/renderer/src/api/common/IDisposable.ts b/submodules/renderer/src/api/common/IDisposable.ts
new file mode 100644
index 0000000..b9f6040
--- /dev/null
+++ b/submodules/renderer/src/api/common/IDisposable.ts
@@ -0,0 +1,5 @@
+export interface IDisposable
+{
+ dispose(): void;
+ disposed: boolean;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/common/IEventDispatcher.ts b/submodules/renderer/src/api/common/IEventDispatcher.ts
new file mode 100644
index 0000000..3d4f178
--- /dev/null
+++ b/submodules/renderer/src/api/common/IEventDispatcher.ts
@@ -0,0 +1,10 @@
+import { IDisposable } from './IDisposable';
+import { INitroEvent } from './INitroEvent';
+
+export interface IEventDispatcher extends IDisposable
+{
+ addEventListener(type: string, callback: Function): void
+ removeEventListener(type: string, callback: Function): void;
+ removeAllListeners(): void;
+ dispatchEvent(event: INitroEvent): boolean;
+}
diff --git a/submodules/renderer/src/api/common/ILinkEventTracker.ts b/submodules/renderer/src/api/common/ILinkEventTracker.ts
new file mode 100644
index 0000000..311567d
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/common/INitroEvent.ts b/submodules/renderer/src/api/common/INitroEvent.ts
new file mode 100644
index 0000000..e063ad8
--- /dev/null
+++ b/submodules/renderer/src/api/common/INitroEvent.ts
@@ -0,0 +1,4 @@
+export interface INitroEvent
+{
+ type: string;
+}
diff --git a/submodules/renderer/src/api/common/INitroManager.ts b/submodules/renderer/src/api/common/INitroManager.ts
new file mode 100644
index 0000000..22ac5f8
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/common/IUpdateReceiver.ts b/submodules/renderer/src/api/common/IUpdateReceiver.ts
new file mode 100644
index 0000000..76c3891
--- /dev/null
+++ b/submodules/renderer/src/api/common/IUpdateReceiver.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from './IDisposable';
+
+export interface IUpdateReceiver extends IDisposable
+{
+ update(time: number): void;
+}
diff --git a/submodules/renderer/src/api/common/NitroLogger.ts b/submodules/renderer/src/api/common/NitroLogger.ts
new file mode 100644
index 0000000..d286d2b
--- /dev/null
+++ b/submodules/renderer/src/api/common/NitroLogger.ts
@@ -0,0 +1,48 @@
+export class NitroLogger
+{
+ public static LOG_DEBUG: boolean = false;
+ public static LOG_WARN: boolean = false;
+ public static LOG_ERROR: boolean = false;
+ public static LOG_EVENTS: boolean = false;
+ public static LOG_PACKETS: boolean = false;
+
+ public static log(...messages: any[]): void
+ {
+ if(!this.LOG_DEBUG) return;
+
+ console.log(this.logPrefix(), ...messages);
+ }
+
+ public static warn(...messages: any[]): void
+ {
+ if(!this.LOG_WARN) return;
+
+ console.warn(this.logPrefix(), ...messages);
+ }
+
+ public static error(...messages: any[]): void
+ {
+ if(!this.LOG_ERROR) return;
+
+ console.error(this.logPrefix(), ...messages);
+ }
+
+ public static events(...messages: any[]): void
+ {
+ if(!this.LOG_EVENTS) return;
+
+ console.log(this.logPrefix(), ...messages);
+ }
+
+ public static packets(...messages: any[]): void
+ {
+ if(!this.LOG_PACKETS) return;
+
+ console.log(this.logPrefix(), ...messages);
+ }
+
+ private static logPrefix(): string
+ {
+ return '[Nitro]';
+ }
+}
diff --git a/submodules/renderer/src/api/common/index.ts b/submodules/renderer/src/api/common/index.ts
new file mode 100644
index 0000000..5142ae0
--- /dev/null
+++ b/submodules/renderer/src/api/common/index.ts
@@ -0,0 +1,7 @@
+export * from './IDisposable';
+export * from './IEventDispatcher';
+export * from './ILinkEventTracker';
+export * from './INitroEvent';
+export * from './INitroManager';
+export * from './IUpdateReceiver';
+export * from './NitroLogger';
diff --git a/submodules/renderer/src/api/communication/ICodec.ts b/submodules/renderer/src/api/communication/ICodec.ts
new file mode 100644
index 0000000..39c4b29
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/ICommunicationManager.ts b/submodules/renderer/src/api/communication/ICommunicationManager.ts
new file mode 100644
index 0000000..fc79a49
--- /dev/null
+++ b/submodules/renderer/src/api/communication/ICommunicationManager.ts
@@ -0,0 +1,8 @@
+import { IDisposable } from '../common';
+import { IConnection } from './IConnection';
+import { IConnectionStateListener } from './IConnectionStateListener';
+
+export interface ICommunicationManager extends IDisposable
+{
+ createConnection(stateListener?: IConnectionStateListener): IConnection;
+}
diff --git a/submodules/renderer/src/api/communication/IConnection.ts b/submodules/renderer/src/api/communication/IConnection.ts
new file mode 100644
index 0000000..3aa30ab
--- /dev/null
+++ b/submodules/renderer/src/api/communication/IConnection.ts
@@ -0,0 +1,19 @@
+import { IEventDispatcher } from '../common';
+import { IMessageComposer } from './IMessageComposer';
+import { IMessageConfiguration } from './IMessageConfiguration';
+import { IMessageEvent } from './IMessageEvent';
+
+export interface IConnection extends IEventDispatcher
+{
+ init(socketUrl: string): void;
+ dispose(): void;
+ onReady(): 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/submodules/renderer/src/api/communication/IConnectionStateListener.ts b/submodules/renderer/src/api/communication/IConnectionStateListener.ts
new file mode 100644
index 0000000..d140fd0
--- /dev/null
+++ b/submodules/renderer/src/api/communication/IConnectionStateListener.ts
@@ -0,0 +1,4 @@
+export interface IConnectionStateListener
+{
+ connectionInit(socketUrl: string): void;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/communication/IMessageComposer.ts b/submodules/renderer/src/api/communication/IMessageComposer.ts
new file mode 100644
index 0000000..eb09bc8
--- /dev/null
+++ b/submodules/renderer/src/api/communication/IMessageComposer.ts
@@ -0,0 +1,5 @@
+export interface IMessageComposer
+{
+ dispose(): void;
+ getMessageArray(): T;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/communication/IMessageConfiguration.ts b/submodules/renderer/src/api/communication/IMessageConfiguration.ts
new file mode 100644
index 0000000..03efd30
--- /dev/null
+++ b/submodules/renderer/src/api/communication/IMessageConfiguration.ts
@@ -0,0 +1,5 @@
+export interface IMessageConfiguration
+{
+ events: Map;
+ composers: Map;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/communication/IMessageDataWrapper.ts b/submodules/renderer/src/api/communication/IMessageDataWrapper.ts
new file mode 100644
index 0000000..0f1c39f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/IMessageEvent.ts b/submodules/renderer/src/api/communication/IMessageEvent.ts
new file mode 100644
index 0000000..5949015
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/IMessageParser.ts b/submodules/renderer/src/api/communication/IMessageParser.ts
new file mode 100644
index 0000000..f10a50d
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/enums/ClientDeviceCategoryEnum.ts b/submodules/renderer/src/api/communication/enums/ClientDeviceCategoryEnum.ts
new file mode 100644
index 0000000..abd127f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/enums/ClientPlatformEnum.ts b/submodules/renderer/src/api/communication/enums/ClientPlatformEnum.ts
new file mode 100644
index 0000000..417b811
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/enums/WebSocketEventEnum.ts b/submodules/renderer/src/api/communication/enums/WebSocketEventEnum.ts
new file mode 100644
index 0000000..303b79c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/communication/enums/index.ts b/submodules/renderer/src/api/communication/enums/index.ts
new file mode 100644
index 0000000..42a2270
--- /dev/null
+++ b/submodules/renderer/src/api/communication/enums/index.ts
@@ -0,0 +1,3 @@
+export * from './ClientDeviceCategoryEnum';
+export * from './ClientPlatformEnum';
+export * from './WebSocketEventEnum';
diff --git a/submodules/renderer/src/api/communication/index.ts b/submodules/renderer/src/api/communication/index.ts
new file mode 100644
index 0000000..779143d
--- /dev/null
+++ b/submodules/renderer/src/api/communication/index.ts
@@ -0,0 +1,10 @@
+export * from './enums';
+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';
diff --git a/submodules/renderer/src/api/configuration/IConfigurationManager.ts b/submodules/renderer/src/api/configuration/IConfigurationManager.ts
new file mode 100644
index 0000000..6aee784
--- /dev/null
+++ b/submodules/renderer/src/api/configuration/IConfigurationManager.ts
@@ -0,0 +1,3 @@
+import { INitroManager } from '../common';
+
+export type IConfigurationManager = INitroManager
diff --git a/submodules/renderer/src/api/configuration/NitroConfiguration.ts b/submodules/renderer/src/api/configuration/NitroConfiguration.ts
new file mode 100644
index 0000000..d3e0158
--- /dev/null
+++ b/submodules/renderer/src/api/configuration/NitroConfiguration.ts
@@ -0,0 +1,114 @@
+import { NitroLogger } from '../common';
+
+export class NitroConfiguration
+{
+ private static _definitions: Map = new Map();
+ private static _config: any = {};
+ private static _missingKeys: string[] = [];
+
+ public static parseConfiguration(data: { [index: string]: any }, overrides: boolean = false): boolean
+ {
+ if(!data) return false;
+
+ try
+ {
+ const regex = new RegExp(/\${(.*?)}/g);
+
+ for(const key in data)
+ {
+ let value = data[key];
+
+ if(typeof value === 'string') value = this.interpolate((value as string), regex);
+
+ if(this._definitions.has(key))
+ {
+ if(overrides) this.setValue(key, value);
+ }
+ else
+ {
+ this.setValue(key, value);
+ }
+ }
+
+ return true;
+ }
+
+ catch (e)
+ {
+ NitroLogger.error(e.stack);
+
+ return false;
+ }
+ }
+
+ public static interpolate(value: string, regex: RegExp = null): string
+ {
+ if(!regex) regex = new RegExp(/\${(.*?)}/g);
+
+ const pieces = value.match(regex);
+
+ if(pieces && pieces.length)
+ {
+ for(const piece of pieces)
+ {
+ const existing = (this._definitions.get(this.removeInterpolateKey(piece)) as string);
+
+ if(existing) (value = value.replace(piece, existing));
+ }
+ }
+
+ return value;
+ }
+
+ private static removeInterpolateKey(value: string): string
+ {
+ return value.replace('${', '').replace('}', '');
+ }
+
+ public static getValue(key: string, value: T = null): T
+ {
+ let existing = this._definitions.get(key);
+
+ if(existing === undefined)
+ {
+ if(this._missingKeys.indexOf(key) >= 0) return value;
+
+ this._missingKeys.push(key);
+ NitroLogger.warn(`Missing configuration key: ${key}`);
+
+ existing = value;
+ }
+
+ return (existing as T);
+ }
+
+ public static setValue(key: string, value: T): void
+ {
+ const parts = key.split('.');
+
+ let last = this._config;
+
+ for(let i = 0; i < parts.length; i++)
+ {
+ const part = parts[i].toString();
+
+ if(i !== (parts.length - 1))
+ {
+ if(!last[part]) last[part] = {};
+
+ last = last[part];
+
+ continue;
+ }
+
+ last[part] = value;
+ }
+
+ this._definitions.set(key, value);
+ }
+
+ public static get definitions(): Map
+ {
+ return this._definitions;
+ }
+}
diff --git a/submodules/renderer/src/api/configuration/index.ts b/submodules/renderer/src/api/configuration/index.ts
new file mode 100644
index 0000000..93d8832
--- /dev/null
+++ b/submodules/renderer/src/api/configuration/index.ts
@@ -0,0 +1,2 @@
+export * from './IConfigurationManager';
+export * from './NitroConfiguration';
diff --git a/submodules/renderer/src/api/index.ts b/submodules/renderer/src/api/index.ts
new file mode 100644
index 0000000..808803e
--- /dev/null
+++ b/submodules/renderer/src/api/index.ts
@@ -0,0 +1,48 @@
+export * from './asset';
+export * from './asset/animation';
+export * from './asset/logic';
+export * from './asset/logic/model';
+export * from './asset/logic/particlesystem';
+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 './configuration';
+export * from './INitroCore';
+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/pet';
+export * from './nitro/avatar/structure';
+export * from './nitro/camera';
+export * from './nitro/communication';
+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 './nitro/sound/common';
+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/widget';
+export * from './ui/widget/enums';
+export * from './utils';
diff --git a/submodules/renderer/src/api/nitro/avatar/IAvatarAssetDownloadLibrary.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarAssetDownloadLibrary.ts
new file mode 100644
index 0000000..4ed78f8
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IAvatarAssetDownloadLibrary.ts
@@ -0,0 +1,8 @@
+import { IEventDispatcher } from '../../common';
+
+export interface IAvatarAssetDownloadLibrary extends IEventDispatcher
+{
+ downloadAsset(): void;
+ readonly libraryName: string;
+ readonly isLoaded: boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IAvatarEffectListener.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarEffectListener.ts
new file mode 100644
index 0000000..adb37f0
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IAvatarEffectListener.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from '../../common';
+
+export interface IAvatarEffectListener extends IDisposable
+{
+ resetEffect(effect: number): void;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IAvatarFigureContainer.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarFigureContainer.ts
new file mode 100644
index 0000000..6e11806
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/IAvatarImage.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarImage.ts
new file mode 100644
index 0000000..559a7d3
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IAvatarImage.ts
@@ -0,0 +1,36 @@
+import { RenderTexture } from '@pixi/core';
+import { Sprite } from '@pixi/sprite';
+import { IGraphicAsset } from '../../asset';
+import { IDisposable } from '../../common';
+import { IAnimationLayerData, IAvatarDataContainer, ISpriteDataContainer } from './animation';
+import { IAvatarFigureContainer } from './IAvatarFigureContainer';
+import { IPartColor } from './structure';
+
+export interface IAvatarImage extends IDisposable
+{
+ getServerRenderData(): any;
+ 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;
+ getImage(setType: string, hightlight: boolean, scale?: number, cache?: boolean): RenderTexture;
+ getImageAsSprite(setType: string, scale?: number): Sprite;
+ getCroppedImage(setType: string, scale?: number): HTMLImageElement;
+ getAsset(_arg_1: string): IGraphicAsset;
+ getDirection(): number;
+ getFigure(): IAvatarFigureContainer;
+ getPartColor(_arg_1: string): IPartColor;
+ isAnimating(): boolean;
+ getCanvasOffsets(): number[];
+ initActionAppends(): void;
+ endActionAppends(): void;
+ appendAction(_arg_1: string, ..._args: any[]): boolean;
+ avatarSpriteData: IAvatarDataContainer;
+ isPlaceholder(): boolean;
+ forceActionUpdate(): void;
+ animationHasResetOnToggle: boolean;
+ resetAnimationFrameCounter(): void;
+ mainAction: string;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IAvatarImageListener.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarImageListener.ts
new file mode 100644
index 0000000..cc68c92
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IAvatarImageListener.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from '../../common';
+
+export interface IAvatarImageListener extends IDisposable
+{
+ resetFigure(figure: string): void;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IAvatarRenderManager.ts b/submodules/renderer/src/api/nitro/avatar/IAvatarRenderManager.ts
new file mode 100644
index 0000000..0c983e3
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IAvatarRenderManager.ts
@@ -0,0 +1,26 @@
+import { AvatarAssetDownloadManager, AvatarStructure } from '../../../nitro';
+import { IAssetManager, IGraphicAsset } from '../../asset';
+import { INitroManager } from '../../common';
+import { IAvatarEffectListener } from './IAvatarEffectListener';
+import { IAvatarFigureContainer } from './IAvatarFigureContainer';
+import { IAvatarImage } from './IAvatarImage';
+import { IAvatarImageListener } from './IAvatarImageListener';
+import { IStructureData } from './structure';
+
+export interface IAvatarRenderManager extends INitroManager
+{
+ 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;
+ isReady: boolean;
+ structure: AvatarStructure;
+ structureData: IStructureData;
+ downloadManager: AvatarAssetDownloadManager;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IEffectAssetDownloadLibrary.ts b/submodules/renderer/src/api/nitro/avatar/IEffectAssetDownloadLibrary.ts
new file mode 100644
index 0000000..d08cd31
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IEffectAssetDownloadLibrary.ts
@@ -0,0 +1,10 @@
+import { IAssetAnimation } from '../../asset';
+import { IEventDispatcher } from '../../common';
+
+export interface IEffectAssetDownloadLibrary extends IEventDispatcher
+{
+ downloadAsset(): void;
+ readonly libraryName: string;
+ readonly animation: { [index: string]: IAssetAnimation };
+ readonly isLoaded: boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/IOutfit.ts b/submodules/renderer/src/api/nitro/avatar/IOutfit.ts
new file mode 100644
index 0000000..e797d6f
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/IOutfit.ts
@@ -0,0 +1,5 @@
+export interface IOutfit
+{
+ figure: string;
+ gender: string;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/nitro/avatar/actions/IActionDefinition.ts b/submodules/renderer/src/api/nitro/avatar/actions/IActionDefinition.ts
new file mode 100644
index 0000000..9c0e5f1
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/actions/IActiveActionData.ts b/submodules/renderer/src/api/nitro/avatar/actions/IActiveActionData.ts
new file mode 100644
index 0000000..214c64f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/actions/index.ts b/submodules/renderer/src/api/nitro/avatar/actions/index.ts
new file mode 100644
index 0000000..9e191b0
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/actions/index.ts
@@ -0,0 +1,2 @@
+export * from './IActionDefinition';
+export * from './IActiveActionData';
diff --git a/submodules/renderer/src/api/nitro/avatar/animation/IAnimation.ts b/submodules/renderer/src/api/nitro/avatar/animation/IAnimation.ts
new file mode 100644
index 0000000..2f53b72
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/animation/IAnimationLayerData.ts b/submodules/renderer/src/api/nitro/avatar/animation/IAnimationLayerData.ts
new file mode 100644
index 0000000..8bf9e86
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/animation/IAnimationManager.ts b/submodules/renderer/src/api/nitro/avatar/animation/IAnimationManager.ts
new file mode 100644
index 0000000..2fff676
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/animation/IAvatarDataContainer.ts b/submodules/renderer/src/api/nitro/avatar/animation/IAvatarDataContainer.ts
new file mode 100644
index 0000000..e35443a
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/animation/IAvatarDataContainer.ts
@@ -0,0 +1,12 @@
+import { AdjustmentFilter } from '../../../../pixi-proxy';
+
+export interface IAvatarDataContainer
+{
+ ink: number;
+ colorTransform: AdjustmentFilter;
+ paletteIsGrayscale: boolean;
+ reds: number[];
+ greens: number[];
+ blues: number[];
+ alphas: number[];
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/animation/ISpriteDataContainer.ts b/submodules/renderer/src/api/nitro/avatar/animation/ISpriteDataContainer.ts
new file mode 100644
index 0000000..97df715
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/animation/index.ts b/submodules/renderer/src/api/nitro/avatar/animation/index.ts
new file mode 100644
index 0000000..c6ce58c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarAction.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarAction.ts
new file mode 100644
index 0000000..2d7ac10
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarDirectionAngle.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarDirectionAngle.ts
new file mode 100644
index 0000000..f204774
--- /dev/null
+++ b/submodules/renderer/src/api/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]; //_Str_2204
+ public static DIRECTION_IS_FLIPPED: boolean[] = [false, false, false, false, true, true, true, false]; //_Str_1859
+ public static MIN_DIRECTION: number = 0; //_Str_1562
+ public static MAX_DIRECTION: number = 7; //_Str_1257
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorFigureCategory.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorFigureCategory.ts
new file mode 100644
index 0000000..02e1801
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorInstanceId.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorInstanceId.ts
new file mode 100644
index 0000000..82cfaae
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorSideCategory.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarEditorSideCategory.ts
new file mode 100644
index 0000000..8dfd979
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarFigurePartType.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarFigurePartType.ts
new file mode 100644
index 0000000..30bc564
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarGuideStatus.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarGuideStatus.ts
new file mode 100644
index 0000000..48a5b3c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarScaleType.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarScaleType.ts
new file mode 100644
index 0000000..5933495
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/AvatarSetType.ts b/submodules/renderer/src/api/nitro/avatar/enum/AvatarSetType.ts
new file mode 100644
index 0000000..38df0af
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/GeometryType.ts b/submodules/renderer/src/api/nitro/avatar/enum/GeometryType.ts
new file mode 100644
index 0000000..402c05f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/RenderMode.ts b/submodules/renderer/src/api/nitro/avatar/enum/RenderMode.ts
new file mode 100644
index 0000000..ff9f877
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/enum/index.ts b/submodules/renderer/src/api/nitro/avatar/enum/index.ts
new file mode 100644
index 0000000..8ea559f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureData.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureData.ts
new file mode 100644
index 0000000..86e7901
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataColor.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataColor.ts
new file mode 100644
index 0000000..535dead
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts
new file mode 100644
index 0000000..80f42e6
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataHiddenLayer.ts
@@ -0,0 +1,4 @@
+export interface IFigureDataHiddenLayer
+{
+ partType?: string;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataPalette.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataPalette.ts
new file mode 100644
index 0000000..f83fa06
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataPalette.ts
@@ -0,0 +1,7 @@
+import { IFigureDataColor } from './IFigureDataColor';
+
+export interface IFigureDataPalette
+{
+ id?: number;
+ colors?: IFigureDataColor[];
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataPart.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataPart.ts
new file mode 100644
index 0000000..e57ef47
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataSet.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataSet.ts
new file mode 100644
index 0000000..f3c89d9
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataSetType.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/IFigureDataSetType.ts
new file mode 100644
index 0000000..d9a2d97
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/figuredata/index.ts b/submodules/renderer/src/api/nitro/avatar/figuredata/index.ts
new file mode 100644
index 0000000..579987b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/index.ts b/submodules/renderer/src/api/nitro/avatar/index.ts
new file mode 100644
index 0000000..7ad21f6
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/index.ts
@@ -0,0 +1,14 @@
+export * from './actions';
+export * from './animation';
+export * from './enum';
+export * from './figuredata';
+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 './pet';
+export * from './structure';
diff --git a/submodules/renderer/src/api/nitro/avatar/pet/IPetCustomPart.ts b/submodules/renderer/src/api/nitro/avatar/pet/IPetCustomPart.ts
new file mode 100644
index 0000000..8d4f968
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/pet/IPetCustomPart.ts
@@ -0,0 +1,6 @@
+export interface IPetCustomPart
+{
+ layerId: number;
+ partId: number;
+ paletteId: number;
+}
diff --git a/submodules/renderer/src/api/nitro/avatar/pet/PetType.ts b/submodules/renderer/src/api/nitro/avatar/pet/PetType.ts
new file mode 100644
index 0000000..9058b7b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/pet/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/submodules/renderer/src/api/nitro/avatar/pet/index.ts b/submodules/renderer/src/api/nitro/avatar/pet/index.ts
new file mode 100644
index 0000000..a30c541
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/avatar/pet/index.ts
@@ -0,0 +1,2 @@
+export * from './IPetCustomPart';
+export * from './PetType';
diff --git a/submodules/renderer/src/api/nitro/avatar/structure/IFigurePart.ts b/submodules/renderer/src/api/nitro/avatar/structure/IFigurePart.ts
new file mode 100644
index 0000000..578725b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/IFigurePartSet.ts b/submodules/renderer/src/api/nitro/avatar/structure/IFigurePartSet.ts
new file mode 100644
index 0000000..7e1653e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/IFigureSetData.ts b/submodules/renderer/src/api/nitro/avatar/structure/IFigureSetData.ts
new file mode 100644
index 0000000..5ea24a6
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/IPalette.ts b/submodules/renderer/src/api/nitro/avatar/structure/IPalette.ts
new file mode 100644
index 0000000..8c5c0e2
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/IPartColor.ts b/submodules/renderer/src/api/nitro/avatar/structure/IPartColor.ts
new file mode 100644
index 0000000..6978528
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/ISetType.ts b/submodules/renderer/src/api/nitro/avatar/structure/ISetType.ts
new file mode 100644
index 0000000..9277a47
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/IStructureData.ts b/submodules/renderer/src/api/nitro/avatar/structure/IStructureData.ts
new file mode 100644
index 0000000..392e885
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/avatar/structure/index.ts b/submodules/renderer/src/api/nitro/avatar/structure/index.ts
new file mode 100644
index 0000000..4c63b05
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetEffect.ts b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetEffect.ts
new file mode 100644
index 0000000..321a26b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetEffect.ts
@@ -0,0 +1,11 @@
+import { Resource, Texture } from '@pixi/core';
+import { ColorMatrix } from '@pixi/filter-color-matrix';
+
+export interface IRoomCameraWidgetEffect
+{
+ name: string;
+ minLevel: number;
+ texture: Texture;
+ colorMatrix: ColorMatrix;
+ blendMode: number;
+}
diff --git a/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetManager.ts b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetManager.ts
new file mode 100644
index 0000000..d8847e9
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetManager.ts
@@ -0,0 +1,13 @@
+import { Resource, Texture } from '@pixi/core';
+import { IEventDispatcher } from '../../common';
+import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect';
+import { IRoomCameraWidgetSelectedEffect } from './IRoomCameraWidgetSelectedEffect';
+
+export interface IRoomCameraWidgetManager
+{
+ init(): void;
+ applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): HTMLImageElement;
+ events: IEventDispatcher;
+ effects: Map;
+ isLoaded: boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetSelectedEffect.ts b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetSelectedEffect.ts
new file mode 100644
index 0000000..3bb3b2c
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/camera/IRoomCameraWidgetSelectedEffect.ts
@@ -0,0 +1,7 @@
+import { IRoomCameraWidgetEffect } from './IRoomCameraWidgetEffect';
+
+export interface IRoomCameraWidgetSelectedEffect
+{
+ effect: IRoomCameraWidgetEffect;
+ alpha: number;
+}
diff --git a/submodules/renderer/src/api/nitro/camera/index.ts b/submodules/renderer/src/api/nitro/camera/index.ts
new file mode 100644
index 0000000..7c7db03
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/camera/index.ts
@@ -0,0 +1,3 @@
+export * from './IRoomCameraWidgetEffect';
+export * from './IRoomCameraWidgetManager';
+export * from './IRoomCameraWidgetSelectedEffect';
diff --git a/submodules/renderer/src/api/nitro/communication/INitroCommunicationDemo.ts b/submodules/renderer/src/api/nitro/communication/INitroCommunicationDemo.ts
new file mode 100644
index 0000000..cab1521
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/communication/INitroCommunicationDemo.ts
@@ -0,0 +1,3 @@
+import { INitroManager } from '../../common';
+
+export type INitroCommunicationDemo = INitroManager
diff --git a/submodules/renderer/src/api/nitro/communication/INitroCommunicationManager.ts b/submodules/renderer/src/api/nitro/communication/INitroCommunicationManager.ts
new file mode 100644
index 0000000..e00d1ca
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/communication/INitroCommunicationManager.ts
@@ -0,0 +1,11 @@
+import { INitroManager } from '../../common';
+import { IConnection, IMessageEvent } from '../../communication';
+import { INitroCommunicationDemo } from './INitroCommunicationDemo';
+
+export interface INitroCommunicationManager extends INitroManager
+{
+ registerMessageEvent(event: IMessageEvent): IMessageEvent;
+ removeMessageEvent(event: IMessageEvent): void;
+ demo: INitroCommunicationDemo;
+ connection: IConnection;
+}
diff --git a/submodules/renderer/src/api/nitro/communication/index.ts b/submodules/renderer/src/api/nitro/communication/index.ts
new file mode 100644
index 0000000..9e6ef3d
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/communication/index.ts
@@ -0,0 +1,2 @@
+export * from './INitroCommunicationDemo';
+export * from './INitroCommunicationManager';
diff --git a/submodules/renderer/src/api/nitro/enums/RelationshipStatusEnum.ts b/submodules/renderer/src/api/nitro/enums/RelationshipStatusEnum.ts
new file mode 100644
index 0000000..b64873c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/enums/ToolbarIconEnum.ts b/submodules/renderer/src/api/nitro/enums/ToolbarIconEnum.ts
new file mode 100644
index 0000000..d389a95
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/enums/index.ts b/submodules/renderer/src/api/nitro/enums/index.ts
new file mode 100644
index 0000000..98a436c
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/enums/index.ts
@@ -0,0 +1,2 @@
+export * from './RelationshipStatusEnum';
+export * from './ToolbarIconEnum';
diff --git a/submodules/renderer/src/api/nitro/index.ts b/submodules/renderer/src/api/nitro/index.ts
new file mode 100644
index 0000000..fea0a3b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/index.ts
@@ -0,0 +1,20 @@
+export * from './avatar';
+export * from './avatar/actions';
+export * from './avatar/animation';
+export * from './avatar/enum';
+export * from './avatar/figuredata';
+export * from './avatar/pet';
+export * from './avatar/structure';
+export * from './camera';
+export * from './communication';
+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/submodules/renderer/src/api/nitro/localization/INitroLocalizationManager.ts b/submodules/renderer/src/api/nitro/localization/INitroLocalizationManager.ts
new file mode 100644
index 0000000..7cc681a
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/localization/INitroLocalizationManager.ts
@@ -0,0 +1,17 @@
+import { INitroManager } from '../../common';
+
+export interface INitroLocalizationManager extends INitroManager
+{
+ 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/submodules/renderer/src/api/nitro/localization/index.ts b/submodules/renderer/src/api/nitro/localization/index.ts
new file mode 100644
index 0000000..f02abe8
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/localization/index.ts
@@ -0,0 +1 @@
+export * from './INitroLocalizationManager';
diff --git a/submodules/renderer/src/api/nitro/room/IGetImageListener.ts b/submodules/renderer/src/api/nitro/room/IGetImageListener.ts
new file mode 100644
index 0000000..6e400e9
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IGetImageListener.ts
@@ -0,0 +1,7 @@
+import { NitroRenderTexture } from '../../../pixi-proxy';
+
+export interface IGetImageListener
+{
+ imageReady(id: number, texture: NitroRenderTexture, image?: HTMLImageElement): void;
+ imageFailed(id: number): void;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IImageResult.ts b/submodules/renderer/src/api/nitro/room/IImageResult.ts
new file mode 100644
index 0000000..ee286f5
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IImageResult.ts
@@ -0,0 +1,9 @@
+import { RenderTexture } from '@pixi/core';
+
+export interface IImageResult
+{
+ id: number;
+ data: RenderTexture;
+ image: HTMLImageElement;
+ getImage(): HTMLImageElement;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IPetColorResult.ts b/submodules/renderer/src/api/nitro/room/IPetColorResult.ts
new file mode 100644
index 0000000..f66417d
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/IRoomContentListener.ts b/submodules/renderer/src/api/nitro/room/IRoomContentListener.ts
new file mode 100644
index 0000000..375b146
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/IRoomContentLoader.ts b/submodules/renderer/src/api/nitro/room/IRoomContentLoader.ts
new file mode 100644
index 0000000..4fe3b0b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IRoomContentLoader.ts
@@ -0,0 +1,34 @@
+import { Resource, Texture } from '@pixi/core';
+import { IPetColorResult, IRoomContentListener } from '.';
+import { IGraphicAssetCollection, IGraphicAssetGifCollection } from '../../asset';
+import { IEventDispatcher } from '../../common';
+import { IRoomObject } from '../../room';
+import { ISessionDataManager } from '../session';
+
+export interface IRoomContentLoader
+{
+ dispose: () => void;
+ initialize(events: IEventDispatcher): void;
+ setSessionDataManager(sessionData: ISessionDataManager): void;
+ downloadAsset(type: string, events: IEventDispatcher): void;
+ 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;
+ createGifCollection(collectionName: string, textures: Texture[], durations: number[]): IGraphicAssetGifCollection;
+ getGifCollection(name: string): IGraphicAssetGifCollection;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IRoomCreator.ts b/submodules/renderer/src/api/nitro/room/IRoomCreator.ts
new file mode 100644
index 0000000..040bba1
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IRoomCreator.ts
@@ -0,0 +1,53 @@
+import { IRoomInstance, IRoomObjectController, IVector3D } from '../../room';
+import { IRoomSessionManager, ISessionDataManager } from '../session';
+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;
+ sessionDataManager: ISessionDataManager;
+ roomSessionManager: IRoomSessionManager;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IRoomEngine.ts b/submodules/renderer/src/api/nitro/room/IRoomEngine.ts
new file mode 100644
index 0000000..b1f4294
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IRoomEngine.ts
@@ -0,0 +1,103 @@
+import { RenderTexture } from '@pixi/core';
+import { DisplayObject } from '@pixi/display';
+import { Point, Rectangle } from '@pixi/math';
+import { INitroManager } from '../../common';
+import { IRoomGeometry, IRoomManager, IRoomObject, IRoomObjectController, IRoomObjectLogicFactory, IRoomObjectVisualizationFactory, IRoomRendererFactory, IRoomRenderingCanvas, IVector3D } from '../../room';
+import { IPetCustomPart } from '../avatar';
+import { IRoomSessionManager, ISessionDataManager } from '../session';
+import { IGetImageListener } from './IGetImageListener';
+import { IImageResult } from './IImageResult';
+import { IPetColorResult } from './IPetColorResult';
+import { IRoomContentLoader } from './IRoomContentLoader';
+import { IRoomObjectEventManager } from './IRoomObjectEventManager';
+import { IObjectData, IRoomMapData } from './object';
+
+export interface IRoomEngine extends INitroManager
+{
+ setActiveRoomId(roomId: number): void;
+ onRoomEngineInitalized(flag: boolean): void;
+ disableUpdate(flag: boolean): void;
+ runUpdate(): void;
+ createRoomInstance(roomId: number, roomMap: IRoomMapData): void;
+ getRoomInstanceDisplay(roomId: number, id: number, width: number, height: number, scale: number): DisplayObject;
+ 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): RenderTexture;
+ saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail?: boolean): void;
+ saveBase64AsScreenshot(base64: string, saveAsThumbnail?: boolean): void;
+ deleteRoomObject(objectId: number, objectCategory: number): boolean;
+ sessionDataManager: ISessionDataManager;
+ roomSessionManager: IRoomSessionManager;
+ roomManager: IRoomManager;
+ objectEventHandler: IRoomObjectEventManager;
+ roomRendererFactory: IRoomRendererFactory;
+ visualizationFactory: IRoomObjectVisualizationFactory;
+ logicFactory: IRoomObjectLogicFactory;
+ roomContentLoader: IRoomContentLoader;
+ activeRoomId: number;
+ ready: boolean;
+ disposed: boolean;
+ selectedAvatarId: number;
+ isDecorating: boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IRoomEngineServices.ts b/submodules/renderer/src/api/nitro/room/IRoomEngineServices.ts
new file mode 100644
index 0000000..af1444b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/IRoomEngineServices.ts
@@ -0,0 +1,47 @@
+import { IEventDispatcher } from '../../common';
+import { IConnection } from '../../communication';
+import { IRoomInstance, IRoomObjectController, IRoomRenderingCanvas, IVector3D } from '../../room';
+import { IRoomSessionManager, ISessionDataManager } from '../session';
+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;
+ connection: IConnection;
+ sessionDataManager: ISessionDataManager;
+ roomSessionManager: IRoomSessionManager;
+ activeRoomId: number;
+ events: IEventDispatcher;
+ isDecorating: boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/room/IRoomObjectEventManager.ts b/submodules/renderer/src/api/nitro/room/IRoomObjectEventManager.ts
new file mode 100644
index 0000000..4f0cec3
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/ISelectedRoomObjectData.ts b/submodules/renderer/src/api/nitro/room/ISelectedRoomObjectData.ts
new file mode 100644
index 0000000..e189a6b
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/ISelectedRoomObjectData.ts
@@ -0,0 +1,18 @@
+import { IVector3D } from '../../room';
+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/submodules/renderer/src/api/nitro/room/enums/FriendFurniEngravingWidgetType.ts b/submodules/renderer/src/api/nitro/room/enums/FriendFurniEngravingWidgetType.ts
new file mode 100644
index 0000000..47a95f9
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/enums/RoomObjectPlacementSource.ts b/submodules/renderer/src/api/nitro/room/enums/RoomObjectPlacementSource.ts
new file mode 100644
index 0000000..629bec4
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/enums/index.ts b/submodules/renderer/src/api/nitro/room/enums/index.ts
new file mode 100644
index 0000000..0ea238d
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/enums/index.ts
@@ -0,0 +1,2 @@
+export * from './FriendFurniEngravingWidgetType';
+export * from './RoomObjectPlacementSource';
diff --git a/submodules/renderer/src/api/nitro/room/index.ts b/submodules/renderer/src/api/nitro/room/index.ts
new file mode 100644
index 0000000..e10262d
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/IPetFigureData.ts b/submodules/renderer/src/api/nitro/room/object/IPetFigureData.ts
new file mode 100644
index 0000000..4a40d1c
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/object/IPetFigureData.ts
@@ -0,0 +1,10 @@
+export interface IPetFigureData
+{
+ readonly typeId: number;
+ readonly paletteId: number;
+ readonly color: string;
+ readonly breedId: number;
+ readonly figuredata: string;
+ readonly customParts: number[];
+ readonly custompartCount: number;
+}
diff --git a/submodules/renderer/src/api/nitro/room/object/IRoomMapData.ts b/submodules/renderer/src/api/nitro/room/object/IRoomMapData.ts
new file mode 100644
index 0000000..a54a7c3
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/object/IRoomMapData.ts
@@ -0,0 +1,14 @@
+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 };
+ restrictsDragging: boolean;
+ restrictsScaling: boolean;
+ restrictedScale: number;
+}
diff --git a/submodules/renderer/src/api/nitro/room/object/RoomObjectCategory.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectCategory.ts
new file mode 100644
index 0000000..6e93273
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/RoomObjectLogicType.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectLogicType.ts
new file mode 100644
index 0000000..bb16bef
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/RoomObjectOperationType.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectOperationType.ts
new file mode 100644
index 0000000..61b8b83
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/RoomObjectType.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectType.ts
new file mode 100644
index 0000000..dbfc3c7
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/RoomObjectUserType.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectUserType.ts
new file mode 100644
index 0000000..e476a24
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/RoomObjectVariable.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectVariable.ts
new file mode 100644
index 0000000..9ecb4f8
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/object/RoomObjectVariable.ts
@@ -0,0 +1,145 @@
+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_BRANDING_IS_ANIMATED: string = 'furniture_branding_is_animated';
+ 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/submodules/renderer/src/api/nitro/room/object/RoomObjectVisualizationType.ts b/submodules/renderer/src/api/nitro/room/object/RoomObjectVisualizationType.ts
new file mode 100644
index 0000000..0af0485
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/IObjectData.ts b/submodules/renderer/src/api/nitro/room/object/data/IObjectData.ts
new file mode 100644
index 0000000..be56f1c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/ObjectDataBase.ts b/submodules/renderer/src/api/nitro/room/object/data/ObjectDataBase.ts
new file mode 100644
index 0000000..25ddfcc
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/ObjectDataFactory.ts b/submodules/renderer/src/api/nitro/room/object/data/ObjectDataFactory.ts
new file mode 100644
index 0000000..b6f3e5d
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/ObjectDataFlags.ts b/submodules/renderer/src/api/nitro/room/object/data/ObjectDataFlags.ts
new file mode 100644
index 0000000..5d5a119
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/ObjectDataKey.ts b/submodules/renderer/src/api/nitro/room/object/data/ObjectDataKey.ts
new file mode 100644
index 0000000..eff1160
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/index.ts b/submodules/renderer/src/api/nitro/room/object/data/index.ts
new file mode 100644
index 0000000..64993e4
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/CrackableDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/CrackableDataType.ts
new file mode 100644
index 0000000..8fd96fd
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/EmptyDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/EmptyDataType.ts
new file mode 100644
index 0000000..62d9d03
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/HighScoreData.ts b/submodules/renderer/src/api/nitro/room/object/data/type/HighScoreData.ts
new file mode 100644
index 0000000..cb18b33
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/HighScoreDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/HighScoreDataType.ts
new file mode 100644
index 0000000..205c2e8
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/LegacyDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/LegacyDataType.ts
new file mode 100644
index 0000000..29eb592
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/MapDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/MapDataType.ts
new file mode 100644
index 0000000..4d45794
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/NumberDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/NumberDataType.ts
new file mode 100644
index 0000000..2790189
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/StringDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/StringDataType.ts
new file mode 100644
index 0000000..7101854
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/VoteDataType.ts b/submodules/renderer/src/api/nitro/room/object/data/type/VoteDataType.ts
new file mode 100644
index 0000000..5650361
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/data/type/index.ts b/submodules/renderer/src/api/nitro/room/object/data/type/index.ts
new file mode 100644
index 0000000..6f81bc5
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/object/index.ts b/submodules/renderer/src/api/nitro/room/object/index.ts
new file mode 100644
index 0000000..b2bff00
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/utils/IFurnitureStackingHeightMap.ts b/submodules/renderer/src/api/nitro/room/utils/IFurnitureStackingHeightMap.ts
new file mode 100644
index 0000000..5427932
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/utils/ILegacyWallGeometry.ts b/submodules/renderer/src/api/nitro/room/utils/ILegacyWallGeometry.ts
new file mode 100644
index 0000000..1ce25a9
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/utils/ILegacyWallGeometry.ts
@@ -0,0 +1,18 @@
+import { IVector3D } from '../../../room';
+
+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/submodules/renderer/src/api/nitro/room/utils/ITileObjectMap.ts b/submodules/renderer/src/api/nitro/room/utils/ITileObjectMap.ts
new file mode 100644
index 0000000..b7fda05
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/room/utils/ObjectRolling.ts b/submodules/renderer/src/api/nitro/room/utils/ObjectRolling.ts
new file mode 100644
index 0000000..15cbc4f
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/utils/ObjectRolling.ts
@@ -0,0 +1,40 @@
+import { IVector3D } from '../../../room';
+
+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/submodules/renderer/src/api/nitro/room/utils/index.ts b/submodules/renderer/src/api/nitro/room/utils/index.ts
new file mode 100644
index 0000000..e8d1668
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/room/utils/index.ts
@@ -0,0 +1,4 @@
+export * from './IFurnitureStackingHeightMap';
+export * from './ILegacyWallGeometry';
+export * from './ITileObjectMap';
+export * from './ObjectRolling';
diff --git a/submodules/renderer/src/api/nitro/session/FurnitureType.ts b/submodules/renderer/src/api/nitro/session/FurnitureType.ts
new file mode 100644
index 0000000..7f8aff0
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/IFurnitureData.ts b/submodules/renderer/src/api/nitro/session/IFurnitureData.ts
new file mode 100644
index 0000000..0ebc9c7
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/IFurnitureDataListener.ts b/submodules/renderer/src/api/nitro/session/IFurnitureDataListener.ts
new file mode 100644
index 0000000..e94ec16
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IFurnitureDataListener.ts
@@ -0,0 +1,4 @@
+export interface IFurnitureDataListener
+{
+ loadFurnitureData(): void;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/nitro/session/IGroupInformationManager.ts b/submodules/renderer/src/api/nitro/session/IGroupInformationManager.ts
new file mode 100644
index 0000000..999b084
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IGroupInformationManager.ts
@@ -0,0 +1,7 @@
+import { IDisposable } from '../../common';
+
+export interface IGroupInformationManager extends IDisposable
+{
+ init(): void;
+ getGroupBadge(groupId: number): string;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IIgnoredUsersManager.ts b/submodules/renderer/src/api/nitro/session/IIgnoredUsersManager.ts
new file mode 100644
index 0000000..85ee7e5
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IIgnoredUsersManager.ts
@@ -0,0 +1,9 @@
+export interface IIgnoredUsersManager
+{
+ init(): void;
+ requestIgnoredUsers(): void;
+ ignoreUserId(id: number): void;
+ ignoreUser(name: string): void;
+ unignoreUser(name: string): void;
+ isIgnored(name: string): boolean;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IPollChoice.ts b/submodules/renderer/src/api/nitro/session/IPollChoice.ts
new file mode 100644
index 0000000..e645676
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IPollChoice.ts
@@ -0,0 +1,6 @@
+export interface IPollChoice
+{
+ value: string;
+ choiceText: string;
+ choiceType: number;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IPollQuestion.ts b/submodules/renderer/src/api/nitro/session/IPollQuestion.ts
new file mode 100644
index 0000000..d85fd9f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/IProductData.ts b/submodules/renderer/src/api/nitro/session/IProductData.ts
new file mode 100644
index 0000000..95cf4d1
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IProductData.ts
@@ -0,0 +1,6 @@
+export interface IProductData
+{
+ type: string;
+ name: string;
+ description: string;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IProductDataListener.ts b/submodules/renderer/src/api/nitro/session/IProductDataListener.ts
new file mode 100644
index 0000000..463b1e5
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IProductDataListener.ts
@@ -0,0 +1,6 @@
+import { IDisposable } from '../../../api';
+
+export interface IProductDataListener extends IDisposable
+{
+ loadProductData(): void;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IQuestion.ts b/submodules/renderer/src/api/nitro/session/IQuestion.ts
new file mode 100644
index 0000000..fdd1b3f
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/IRoomHandlerListener.ts b/submodules/renderer/src/api/nitro/session/IRoomHandlerListener.ts
new file mode 100644
index 0000000..cf364cb
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IRoomHandlerListener.ts
@@ -0,0 +1,10 @@
+import { IEventDispatcher } from '../../common';
+import { IRoomSession } from './IRoomSession';
+
+export interface IRoomHandlerListener
+{
+ getSession(id: number): IRoomSession;
+ sessionUpdate(id: number, type: string): void;
+ sessionReinitialize(fromRoomId: number, toRoomId: number): void;
+ events: IEventDispatcher;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IRoomModerationSettings.ts b/submodules/renderer/src/api/nitro/session/IRoomModerationSettings.ts
new file mode 100644
index 0000000..bf9428c
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IRoomModerationSettings.ts
@@ -0,0 +1,6 @@
+export interface IRoomModerationSettings
+{
+ readonly allowMute: number;
+ readonly allowKick: number;
+ readonly allowBan: number;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IRoomPetData.ts b/submodules/renderer/src/api/nitro/session/IRoomPetData.ts
new file mode 100644
index 0000000..70dfbbc
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/IRoomSession.ts b/submodules/renderer/src/api/nitro/session/IRoomSession.ts
new file mode 100644
index 0000000..3c9b084
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IRoomSession.ts
@@ -0,0 +1,68 @@
+import { IDisposable } from '../../common';
+import { IConnection } from '../../communication';
+import { IRoomModerationSettings } from './IRoomModerationSettings';
+import { IUserDataManager } from './IUserDataManager';
+
+export interface IRoomSession extends IDisposable
+{
+ openGift(objectId: number): void;
+ setConnection(connection: IConnection): 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;
+ connection: IConnection;
+ 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/submodules/renderer/src/api/nitro/session/IRoomSessionManager.ts b/submodules/renderer/src/api/nitro/session/IRoomSessionManager.ts
new file mode 100644
index 0000000..28f2118
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IRoomSessionManager.ts
@@ -0,0 +1,13 @@
+import { INitroManager } from '../../common';
+import { INitroCommunicationManager } from '../communication';
+import { IRoomSession } from './IRoomSession';
+
+export interface IRoomSessionManager extends INitroManager
+{
+ getSession(id: number): IRoomSession;
+ createSession(roomId: number, password?: string): boolean;
+ startSession(session: IRoomSession): boolean;
+ removeSession(id: number, openLandingView?: boolean): void;
+ communication: INitroCommunicationManager;
+ viewerSession: IRoomSession;
+}
diff --git a/submodules/renderer/src/api/nitro/session/IRoomUserData.ts b/submodules/renderer/src/api/nitro/session/IRoomUserData.ts
new file mode 100644
index 0000000..09eaa57
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/ISessionDataManager.ts b/submodules/renderer/src/api/nitro/session/ISessionDataManager.ts
new file mode 100644
index 0000000..8d26861
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/ISessionDataManager.ts
@@ -0,0 +1,58 @@
+import { Resource, Texture } from '@pixi/core';
+import { INitroManager } from '../../common';
+import { INitroCommunicationManager } from '../communication';
+import { IFurnitureData } from './IFurnitureData';
+import { IFurnitureDataListener } from './IFurnitureDataListener';
+import { IGroupInformationManager } from './IGroupInformationManager';
+import { IIgnoredUsersManager } from './IIgnoredUsersManager';
+import { IProductData } from './IProductData';
+
+export interface ISessionDataManager extends INitroManager
+{
+ getAllFurnitureData(listener: IFurnitureDataListener): IFurnitureData[];
+ removePendingFurniDataListener(listener: IFurnitureDataListener): void;
+ 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: INitroCommunicationManager;
+ 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/submodules/renderer/src/api/nitro/session/IUserDataManager.ts b/submodules/renderer/src/api/nitro/session/IUserDataManager.ts
new file mode 100644
index 0000000..3a10791
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/IUserDataManager.ts
@@ -0,0 +1,26 @@
+import { IConnection } from '../../communication';
+import { IRoomUserData } from './IRoomUserData';
+
+export interface IUserDataManager
+{
+ setConnection(connection: IConnection): void;
+ 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;
+ connection: IConnection;
+}
diff --git a/submodules/renderer/src/api/nitro/session/enum/GenericErrorEnum.ts b/submodules/renderer/src/api/nitro/session/enum/GenericErrorEnum.ts
new file mode 100644
index 0000000..611139b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/enum/NoobnessLevelEnum.ts b/submodules/renderer/src/api/nitro/session/enum/NoobnessLevelEnum.ts
new file mode 100644
index 0000000..c9aecaf
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/enum/RoomControllerLevel.ts b/submodules/renderer/src/api/nitro/session/enum/RoomControllerLevel.ts
new file mode 100644
index 0000000..ecd6309
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/enum/RoomTradingLevelEnum.ts b/submodules/renderer/src/api/nitro/session/enum/RoomTradingLevelEnum.ts
new file mode 100644
index 0000000..be0b1e4
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/enum/SecurityLevel.ts b/submodules/renderer/src/api/nitro/session/enum/SecurityLevel.ts
new file mode 100644
index 0000000..9b3011e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/nitro/session/enum/index.ts b/submodules/renderer/src/api/nitro/session/enum/index.ts
new file mode 100644
index 0000000..1e96fd3
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/enum/index.ts
@@ -0,0 +1,5 @@
+export * from './GenericErrorEnum';
+export * from './NoobnessLevelEnum';
+export * from './RoomControllerLevel';
+export * from './RoomTradingLevelEnum';
+export * from './SecurityLevel';
diff --git a/submodules/renderer/src/api/nitro/session/index.ts b/submodules/renderer/src/api/nitro/session/index.ts
new file mode 100644
index 0000000..0607986
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/session/index.ts
@@ -0,0 +1,19 @@
+export * from './enum';
+export * from './FurnitureType';
+export * from './IFurnitureData';
+export * from './IFurnitureDataListener';
+export * from './IGroupInformationManager';
+export * from './IIgnoredUsersManager';
+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';
diff --git a/submodules/renderer/src/api/nitro/sound/IMusicController.ts b/submodules/renderer/src/api/nitro/sound/IMusicController.ts
new file mode 100644
index 0000000..ec3c109
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/IMusicController.ts
@@ -0,0 +1,25 @@
+import { IAdvancedMap } from '../../utils';
+import { ISongInfo } from './common';
+import { IPlaylistController } from './IPlaylistController';
+
+export interface IMusicController
+{
+ getRoomItemPlaylist(_arg_1?: number): IPlaylistController;
+ getSongDiskInventorySize(): number;
+ getSongDiskInventoryDiskId(_arg_1: number): number;
+ getSongDiskInventorySongId(_arg_1: number): number;
+ getSongInfo(_arg_1: 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/submodules/renderer/src/api/nitro/sound/IPlaylistController.ts b/submodules/renderer/src/api/nitro/sound/IPlaylistController.ts
new file mode 100644
index 0000000..a8feea3
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/IPlaylistController.ts
@@ -0,0 +1,15 @@
+import { ISongInfo } from './common/ISongInfo';
+
+export interface IPlaylistController
+{
+ get priority():number;
+ get length():number;
+ get playPosition():number;
+ get nowPlayingSongId():number;
+ get isPlaying():boolean;
+ get entries(): ISongInfo[];
+ getEntry(_arg_1: number):ISongInfo;
+ requestPlayList():void;
+ init(): void;
+ dispose():void;
+}
diff --git a/submodules/renderer/src/api/nitro/sound/ISoundManager.ts b/submodules/renderer/src/api/nitro/sound/ISoundManager.ts
new file mode 100644
index 0000000..e0bbb0f
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/ISoundManager.ts
@@ -0,0 +1,8 @@
+import { INitroManager } from '../../common';
+import { IMusicController } from './IMusicController';
+
+export interface ISoundManager extends INitroManager
+{
+ get musicController(): IMusicController;
+ get traxVolume(): number;
+}
diff --git a/submodules/renderer/src/api/nitro/sound/common/ISongInfo.ts b/submodules/renderer/src/api/nitro/sound/common/ISongInfo.ts
new file mode 100644
index 0000000..475b75d
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/common/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/submodules/renderer/src/api/nitro/sound/common/index.ts b/submodules/renderer/src/api/nitro/sound/common/index.ts
new file mode 100644
index 0000000..c6c8783
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/common/index.ts
@@ -0,0 +1 @@
+export * from './ISongInfo';
diff --git a/submodules/renderer/src/api/nitro/sound/index.ts b/submodules/renderer/src/api/nitro/sound/index.ts
new file mode 100644
index 0000000..37eb921
--- /dev/null
+++ b/submodules/renderer/src/api/nitro/sound/index.ts
@@ -0,0 +1,4 @@
+export * from './common';
+export * from './IMusicController';
+export * from './IPlaylistController';
+export * from './ISoundManager';
diff --git a/submodules/renderer/src/api/room/IPetBreedingResultData.ts b/submodules/renderer/src/api/room/IPetBreedingResultData.ts
new file mode 100644
index 0000000..b3f8985
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/IRoomGeometry.ts b/submodules/renderer/src/api/room/IRoomGeometry.ts
new file mode 100644
index 0000000..1ee0bc3
--- /dev/null
+++ b/submodules/renderer/src/api/room/IRoomGeometry.ts
@@ -0,0 +1,21 @@
+import { Point } from '@pixi/math';
+import { IVector3D } from './IVector3D';
+
+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/submodules/renderer/src/api/room/IRoomInstance.ts b/submodules/renderer/src/api/room/IRoomInstance.ts
new file mode 100644
index 0000000..838096b
--- /dev/null
+++ b/submodules/renderer/src/api/room/IRoomInstance.ts
@@ -0,0 +1,27 @@
+import { IDisposable } from '../../api';
+import { IRoomInstanceContainer } from './IRoomInstanceContainer';
+import { IRoomObjectManager } from './IRoomObjectManager';
+import { IRoomObject, IRoomObjectModel } from './object';
+import { IRoomRendererBase } from './renderer';
+
+export interface IRoomInstance extends IDisposable
+{
+ 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/submodules/renderer/src/api/room/IRoomInstanceContainer.ts b/submodules/renderer/src/api/room/IRoomInstanceContainer.ts
new file mode 100644
index 0000000..efe5184
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/IRoomManager.ts b/submodules/renderer/src/api/room/IRoomManager.ts
new file mode 100644
index 0000000..44c6b4a
--- /dev/null
+++ b/submodules/renderer/src/api/room/IRoomManager.ts
@@ -0,0 +1,18 @@
+import { IEventDispatcher, INitroManager } from '../common';
+import { IRoomContentLoader } from '../nitro';
+import { IRoomInstance } from './IRoomInstance';
+import { IRoomObject } from './object';
+
+export interface IRoomManager extends INitroManager
+{
+ 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;
+ setContentLoader(loader: IRoomContentLoader): void;
+ update(time: number, update?: boolean): void;
+ rooms: Map;
+ events: IEventDispatcher;
+}
diff --git a/submodules/renderer/src/api/room/IRoomManagerListener.ts b/submodules/renderer/src/api/room/IRoomManagerListener.ts
new file mode 100644
index 0000000..3bf9681
--- /dev/null
+++ b/submodules/renderer/src/api/room/IRoomManagerListener.ts
@@ -0,0 +1,6 @@
+export interface IRoomManagerListener
+{
+ onRoomEngineInitalized(flag: boolean): void;
+ objectInitialized(roomId: string, objectId: number, category: number): void;
+ initalizeTemporaryObjectsByType(type: string, _arg_2: boolean): void;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/room/IRoomObjectManager.ts b/submodules/renderer/src/api/room/IRoomObjectManager.ts
new file mode 100644
index 0000000..9e0ea3b
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/IRoomObjectUpdateMessage.ts b/submodules/renderer/src/api/room/IRoomObjectUpdateMessage.ts
new file mode 100644
index 0000000..5b04a52
--- /dev/null
+++ b/submodules/renderer/src/api/room/IRoomObjectUpdateMessage.ts
@@ -0,0 +1,7 @@
+import { IVector3D } from './IVector3D';
+
+export interface IRoomObjectUpdateMessage
+{
+ readonly location: IVector3D;
+ readonly direction: IVector3D;
+}
diff --git a/submodules/renderer/src/api/room/IRoomSpriteMouseEvent.ts b/submodules/renderer/src/api/room/IRoomSpriteMouseEvent.ts
new file mode 100644
index 0000000..c942d6c
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/IVector3D.ts b/submodules/renderer/src/api/room/IVector3D.ts
new file mode 100644
index 0000000..9214be4
--- /dev/null
+++ b/submodules/renderer/src/api/room/IVector3D.ts
@@ -0,0 +1,10 @@
+export interface IVector3D
+{
+ assign(vector: IVector3D): void;
+ add(vector: IVector3D): void;
+ subtract(vector: IVector3D): void;
+ x: number;
+ y: number;
+ z: number;
+ length: number;
+}
diff --git a/submodules/renderer/src/api/room/RoomObjectSpriteData.ts b/submodules/renderer/src/api/room/RoomObjectSpriteData.ts
new file mode 100644
index 0000000..768cae2
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/Vector3d.ts b/submodules/renderer/src/api/room/Vector3d.ts
new file mode 100644
index 0000000..0ee362a
--- /dev/null
+++ b/submodules/renderer/src/api/room/Vector3d.ts
@@ -0,0 +1,189 @@
+import { IVector3D } from './IVector3D';
+
+export class Vector3d implements IVector3D
+{
+ private _x: number;
+ private _y: number;
+ private _z: number;
+ private _length: number;
+
+ constructor(x: number = 0, y: number = 0, z: number = 0)
+ {
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._length = NaN;
+ }
+
+ public static sum(vector1: IVector3D, vector2: IVector3D): Vector3d
+ {
+ if(!vector1 || !vector2) return null;
+
+ return new Vector3d((vector1.x + vector2.x), (vector1.y + vector2.y), (vector1.z + vector2.z));
+ }
+
+ public static dif(vector1: IVector3D, vector2: IVector3D): Vector3d
+ {
+ if(!vector1 || !vector2) return null;
+
+ return new Vector3d((vector1.x - vector2.x), (vector1.y - vector2.y), (vector1.z - vector2.z));
+ }
+
+ public static product(vector: IVector3D, value: number): Vector3d
+ {
+ if(!vector) return null;
+
+ return new Vector3d((vector.x * value), (vector.y * value), (vector.z * value));
+ }
+
+ public static dotProduct(vector1: IVector3D, vector2: IVector3D): number
+ {
+ if(!vector1 || !vector2) return 0;
+
+ return (vector1.x * vector2.x) + (vector1.y * vector2.y) + (vector1.z * vector2.z);
+ }
+
+ public static crossProduct(vector1: IVector3D, vector2: IVector3D): Vector3d
+ {
+ if(!vector1 || !vector2) return null;
+
+ return new Vector3d(((vector1.y * vector2.z) - (vector1.z * vector2.y)), ((vector1.z * vector2.x) - (vector1.x * vector2.z)), ((vector1.x * vector2.y) - (vector1.y * vector2.x)));
+ }
+
+ public static scalarProjection(vector1: IVector3D, vector2: IVector3D): number
+ {
+ if(!vector1 || !vector2) return -1;
+
+ const length = vector2.length;
+
+ if(length > 0)
+ {
+ return ((vector1.x * vector2.x) + (vector1.y * vector2.y) + (vector1.z * vector2.z)) / length;
+ }
+
+ return -1;
+ }
+
+ public static cosAngle(vector1: IVector3D, vector2: IVector3D): number
+ {
+ if(!vector1 || !vector2) return 0;
+
+ const totalLength = (vector1.length * vector2.length);
+
+ if(!totalLength) return 0;
+
+ return (Vector3d.dotProduct(vector1, vector2) / totalLength);
+ }
+
+ public static isEqual(vector1: IVector3D, vector2: IVector3D): boolean
+ {
+ if(!vector1 || !vector2) return false;
+
+ if((vector1.x !== vector2.x) || (vector1.y !== vector2.y) || (vector1.z !== vector2.z)) return false;
+
+ return true;
+ }
+
+ public negate(): void
+ {
+ this._x = -(this._x);
+ this._y = -(this._y);
+ this._z = -(this._z);
+ }
+
+ public add(vector: IVector3D): void
+ {
+ if(!vector) return;
+
+ this._x += vector.x;
+ this._y += vector.y;
+ this._z += vector.z;
+ this._length = NaN;
+ }
+
+ public subtract(vector: IVector3D): void
+ {
+ if(!vector) return;
+
+ this._x -= vector.x;
+ this._y -= vector.y;
+ this._z -= vector.z;
+ this._length = NaN;
+ }
+
+ public multiply(amount: number): void
+ {
+ this._x *= amount;
+ this._y *= amount;
+ this._z *= amount;
+ this._length = NaN;
+ }
+
+ public divide(amount: number): void
+ {
+ if(!amount) return;
+
+ this._x /= amount;
+ this._y /= amount;
+ this._z /= amount;
+ this._length = NaN;
+ }
+
+ public assign(vector: IVector3D): void
+ {
+ if(!vector) return;
+
+ this._x = vector.x;
+ this._y = vector.y;
+ this._z = vector.z;
+ this._length = NaN;
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public set x(k: number)
+ {
+ this._x = k;
+ this._length = NaN;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+
+ public set y(k: number)
+ {
+ this._y = k;
+ this._length = NaN;
+ }
+
+ public get z(): number
+ {
+ return this._z;
+ }
+
+ public set z(k: number)
+ {
+ this._z = k;
+ this._length = NaN;
+ }
+
+ public get length(): number
+ {
+ if(isNaN(this._length))
+ {
+ this._length = Math.sqrt(((this._x * this._x) + (this._y * this._y)) + (this._z * this._z));
+ }
+
+ return this._length;
+ }
+
+ public toString(): string
+ {
+ return `[Vector3d: ${this._x}, ${this._y}, ${this._z}]`;
+ }
+}
diff --git a/submodules/renderer/src/api/room/index.ts b/submodules/renderer/src/api/room/index.ts
new file mode 100644
index 0000000..2f37439
--- /dev/null
+++ b/submodules/renderer/src/api/room/index.ts
@@ -0,0 +1,17 @@
+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 './IVector3D';
+export * from './object';
+export * from './object/enum';
+export * from './object/logic';
+export * from './object/visualization';
+export * from './renderer';
+export * from './RoomObjectSpriteData';
+export * from './Vector3d';
diff --git a/submodules/renderer/src/api/room/object/IRoomObject.ts b/submodules/renderer/src/api/room/object/IRoomObject.ts
new file mode 100644
index 0000000..0dca252
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/IRoomObject.ts
@@ -0,0 +1,22 @@
+import { IDisposable } from '../../common';
+import { IVector3D } from '../IVector3D';
+import { IRoomObjectModel } from './IRoomObjectModel';
+import { IRoomObjectMouseHandler } from './logic';
+import { IRoomObjectVisualization } from './visualization';
+
+export interface IRoomObject extends IDisposable
+{
+ 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/submodules/renderer/src/api/room/object/IRoomObjectController.ts b/submodules/renderer/src/api/room/object/IRoomObjectController.ts
new file mode 100644
index 0000000..9a66d4f
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/IRoomObjectController.ts
@@ -0,0 +1,18 @@
+import { IRoomObjectUpdateMessage } from '../IRoomObjectUpdateMessage';
+import { IVector3D } from '../IVector3D';
+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/submodules/renderer/src/api/room/object/IRoomObjectModel.ts b/submodules/renderer/src/api/room/object/IRoomObjectModel.ts
new file mode 100644
index 0000000..64291ed
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/IRoomObjectModelController.ts b/submodules/renderer/src/api/room/object/IRoomObjectModelController.ts
new file mode 100644
index 0000000..2dc6fbc
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/enum/AlphaTolerance.ts b/submodules/renderer/src/api/room/object/enum/AlphaTolerance.ts
new file mode 100644
index 0000000..94b695e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/enum/RoomObjectSpriteType.ts b/submodules/renderer/src/api/room/object/enum/RoomObjectSpriteType.ts
new file mode 100644
index 0000000..ec4f953
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/enum/index.ts b/submodules/renderer/src/api/room/object/enum/index.ts
new file mode 100644
index 0000000..b648257
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/enum/index.ts
@@ -0,0 +1,2 @@
+export * from './AlphaTolerance';
+export * from './RoomObjectSpriteType';
diff --git a/submodules/renderer/src/api/room/object/index.ts b/submodules/renderer/src/api/room/object/index.ts
new file mode 100644
index 0000000..7d028eb
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/logic/IRoomObjectEventHandler.ts b/submodules/renderer/src/api/room/object/logic/IRoomObjectEventHandler.ts
new file mode 100644
index 0000000..26e17ed
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/logic/IRoomObjectEventHandler.ts
@@ -0,0 +1,19 @@
+import { IDisposable, IEventDispatcher } from '../../../common';
+import { IRoomObjectUpdateMessage } from '../../IRoomObjectUpdateMessage';
+import { IRoomObjectController } from '../IRoomObjectController';
+import { IRoomObjectMouseHandler } from './IRoomObjectMouseHandler';
+
+export interface IRoomObjectEventHandler extends IRoomObjectMouseHandler, IDisposable
+{
+ initialize(data: unknown): 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/submodules/renderer/src/api/room/object/logic/IRoomObjectLogicFactory.ts b/submodules/renderer/src/api/room/object/logic/IRoomObjectLogicFactory.ts
new file mode 100644
index 0000000..142b519
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/logic/IRoomObjectLogicFactory.ts
@@ -0,0 +1,10 @@
+import { IEventDispatcher } from '../../../common';
+import { IRoomObjectEventHandler } from './IRoomObjectEventHandler';
+
+export interface IRoomObjectLogicFactory
+{
+ getLogic(type: string): IRoomObjectEventHandler;
+ registerEventFunction(func: Function): void;
+ removeEventFunction(func: Function): void;
+ events: IEventDispatcher;
+}
diff --git a/submodules/renderer/src/api/room/object/logic/IRoomObjectMouseHandler.ts b/submodules/renderer/src/api/room/object/logic/IRoomObjectMouseHandler.ts
new file mode 100644
index 0000000..4240c56
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/logic/index.ts b/submodules/renderer/src/api/room/object/logic/index.ts
new file mode 100644
index 0000000..5892efe
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/logic/index.ts
@@ -0,0 +1,3 @@
+export * from './IRoomObjectEventHandler';
+export * from './IRoomObjectLogicFactory';
+export * from './IRoomObjectMouseHandler';
diff --git a/submodules/renderer/src/api/room/object/visualization/IPlaneDrawingData.ts b/submodules/renderer/src/api/room/object/visualization/IPlaneDrawingData.ts
new file mode 100644
index 0000000..0aae6af
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/visualization/IPlaneDrawingData.ts
@@ -0,0 +1,14 @@
+import { Point } from '@pixi/math';
+
+export interface IPlaneDrawingData
+{
+ isBottomAligned(): boolean;
+ z: number;
+ cornerPoints: Point[];
+ color: number;
+ maskAssetNames: string[];
+ maskAssetLocations: Point[];
+ maskAssetFlipHs: boolean[];
+ maskAssetFlipVs: boolean[];
+ assetNameColumns: string[][];
+}
diff --git a/submodules/renderer/src/api/room/object/visualization/IPlaneVisualization.ts b/submodules/renderer/src/api/room/object/visualization/IPlaneVisualization.ts
new file mode 100644
index 0000000..65b5de2
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/visualization/IPlaneVisualization.ts
@@ -0,0 +1,6 @@
+import { IRoomPlane } from './IRoomPlane';
+
+export interface IPlaneVisualization
+{
+ planes: IRoomPlane[];
+}
diff --git a/submodules/renderer/src/api/room/object/visualization/IRoomObjectGraphicVisualization.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectGraphicVisualization.ts
new file mode 100644
index 0000000..8fb20d2
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/visualization/IRoomObjectSprite.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectSprite.ts
new file mode 100644
index 0000000..c6914ad
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/visualization/IRoomObjectSprite.ts
@@ -0,0 +1,33 @@
+import { Filter, Resource, Texture } from '@pixi/core';
+import { Container } from '@pixi/display';
+
+export interface IRoomObjectSprite
+{
+ id: number;
+ name: string;
+ type: string;
+ spriteType: number;
+ texture: Texture;
+ container: Container;
+ width: number;
+ height: number;
+ offsetX: number;
+ offsetY: number;
+ flipH: boolean;
+ flipV: boolean;
+ direction: number;
+ alpha: number;
+ blendMode: number;
+ color: number;
+ relativeDepth: number;
+ varyingDepth: boolean;
+ libraryAssetName: string;
+ clickHandling: boolean;
+ visible: boolean;
+ tag: string;
+ posture: string;
+ alphaTolerance: number;
+ filters: Filter[];
+ updateCounter: number;
+ updateContainer: boolean;
+}
diff --git a/submodules/renderer/src/api/room/object/visualization/IRoomObjectSpriteVisualization.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectSpriteVisualization.ts
new file mode 100644
index 0000000..e3dd4cd
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualization.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualization.ts
new file mode 100644
index 0000000..445fb90
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualization.ts
@@ -0,0 +1,18 @@
+import { RenderTexture } from '@pixi/core';
+import { Rectangle } from '@pixi/math';
+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(bgColor: number, originalId: number): RenderTexture;
+ instanceId: number;
+ object: IRoomObject;
+ image: RenderTexture;
+ updateSpriteCounter: number;
+}
diff --git a/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualizationData.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualizationData.ts
new file mode 100644
index 0000000..4337029
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualizationFactory.ts b/submodules/renderer/src/api/room/object/visualization/IRoomObjectVisualizationFactory.ts
new file mode 100644
index 0000000..a28adae
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/visualization/IRoomPlane.ts b/submodules/renderer/src/api/room/object/visualization/IRoomPlane.ts
new file mode 100644
index 0000000..8c00839
--- /dev/null
+++ b/submodules/renderer/src/api/room/object/visualization/IRoomPlane.ts
@@ -0,0 +1,13 @@
+import { IRoomGeometry } from '../../IRoomGeometry';
+import { IVector3D } from '../../IVector3D';
+import { IPlaneDrawingData } from './IPlaneDrawingData';
+
+export interface IRoomPlane
+{
+ uniqueId: number;
+ location: IVector3D;
+ leftSide: IVector3D;
+ rightSide: IVector3D;
+ color: number;
+ getDrawingDatas(_arg_1: IRoomGeometry): IPlaneDrawingData[];
+}
diff --git a/submodules/renderer/src/api/room/object/visualization/ISortableSprite.ts b/submodules/renderer/src/api/room/object/visualization/ISortableSprite.ts
new file mode 100644
index 0000000..b4c0e75
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/object/visualization/index.ts b/submodules/renderer/src/api/room/object/visualization/index.ts
new file mode 100644
index 0000000..681f37e
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/renderer/IRoomCanvasMouseListener.ts b/submodules/renderer/src/api/room/renderer/IRoomCanvasMouseListener.ts
new file mode 100644
index 0000000..bcd97ff
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/renderer/IRoomRenderer.ts b/submodules/renderer/src/api/room/renderer/IRoomRenderer.ts
new file mode 100644
index 0000000..4477917
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/renderer/IRoomRendererBase.ts b/submodules/renderer/src/api/room/renderer/IRoomRendererBase.ts
new file mode 100644
index 0000000..2c00706
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/renderer/IRoomRendererFactory.ts b/submodules/renderer/src/api/room/renderer/IRoomRendererFactory.ts
new file mode 100644
index 0000000..1456669
--- /dev/null
+++ b/submodules/renderer/src/api/room/renderer/IRoomRendererFactory.ts
@@ -0,0 +1,6 @@
+import { IRoomRenderer } from './IRoomRenderer';
+
+export interface IRoomRendererFactory
+{
+ createRenderer(): IRoomRenderer;
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/api/room/renderer/IRoomRenderingCanvas.ts b/submodules/renderer/src/api/room/renderer/IRoomRenderingCanvas.ts
new file mode 100644
index 0000000..98888ce
--- /dev/null
+++ b/submodules/renderer/src/api/room/renderer/IRoomRenderingCanvas.ts
@@ -0,0 +1,39 @@
+import { RenderTexture } from '@pixi/core';
+import { DisplayObject } from '@pixi/display';
+import { Point } from '@pixi/math';
+import { IRoomGeometry } from '../IRoomGeometry';
+import { ISortableSprite } from '../object';
+import { RoomObjectSpriteData } from '../RoomObjectSpriteData';
+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(): RenderTexture;
+ moveLeft(): void;
+ moveRight(): void;
+ moveUp(): void;
+ moveDown(): void;
+ id: number;
+ geometry: IRoomGeometry;
+ master: DisplayObject;
+ display: DisplayObject;
+ screenOffsetX: number;
+ screenOffsetY: number;
+ scale: number;
+ width: number;
+ height: number;
+ restrictsScaling: boolean;
+ canvasUpdated: boolean;
+}
diff --git a/submodules/renderer/src/api/room/renderer/IRoomSpriteCanvasContainer.ts b/submodules/renderer/src/api/room/renderer/IRoomSpriteCanvasContainer.ts
new file mode 100644
index 0000000..be65859
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/room/renderer/index.ts b/submodules/renderer/src/api/room/renderer/index.ts
new file mode 100644
index 0000000..8a236c0
--- /dev/null
+++ b/submodules/renderer/src/api/room/renderer/index.ts
@@ -0,0 +1,6 @@
+export * from './IRoomCanvasMouseListener';
+export * from './IRoomRenderer';
+export * from './IRoomRendererBase';
+export * from './IRoomRendererFactory';
+export * from './IRoomRenderingCanvas';
+export * from './IRoomSpriteCanvasContainer';
diff --git a/submodules/renderer/src/api/ui/MouseEventType.ts b/submodules/renderer/src/api/ui/MouseEventType.ts
new file mode 100644
index 0000000..b5c5f84
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/ui/TouchEventType.ts b/submodules/renderer/src/api/ui/TouchEventType.ts
new file mode 100644
index 0000000..3f6eec9
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/ui/index.ts b/submodules/renderer/src/api/ui/index.ts
new file mode 100644
index 0000000..acab5a8
--- /dev/null
+++ b/submodules/renderer/src/api/ui/index.ts
@@ -0,0 +1,4 @@
+export * from './MouseEventType';
+export * from './TouchEventType';
+export * from './widget';
+export * from './widget/enums';
diff --git a/submodules/renderer/src/api/ui/widget/enums/AvatarExpressionEnum.ts b/submodules/renderer/src/api/ui/widget/enums/AvatarExpressionEnum.ts
new file mode 100644
index 0000000..389f8d4
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/ContextMenuEnum.ts b/submodules/renderer/src/api/ui/widget/enums/ContextMenuEnum.ts
new file mode 100644
index 0000000..7c53378
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/FriendWidgetEngravingWidgetTypeEnum.ts b/submodules/renderer/src/api/ui/widget/enums/FriendWidgetEngravingWidgetTypeEnum.ts
new file mode 100644
index 0000000..4417687
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/RoomWidgetEnum.ts b/submodules/renderer/src/api/ui/widget/enums/RoomWidgetEnum.ts
new file mode 100644
index 0000000..4b746b5
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/RoomWidgetEnumItemExtradataParameter.ts b/submodules/renderer/src/api/ui/widget/enums/RoomWidgetEnumItemExtradataParameter.ts
new file mode 100644
index 0000000..d252e69
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts b/submodules/renderer/src/api/ui/widget/enums/RoomWidgetFurniInfoUsagePolicyEnum.ts
new file mode 100644
index 0000000..523205c
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/SystemChatStyleEnum.ts b/submodules/renderer/src/api/ui/widget/enums/SystemChatStyleEnum.ts
new file mode 100644
index 0000000..15e3428
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/enums/index.ts b/submodules/renderer/src/api/ui/widget/enums/index.ts
new file mode 100644
index 0000000..48f242d
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/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/submodules/renderer/src/api/ui/widget/index.ts b/submodules/renderer/src/api/ui/widget/index.ts
new file mode 100644
index 0000000..1479085
--- /dev/null
+++ b/submodules/renderer/src/api/ui/widget/index.ts
@@ -0,0 +1 @@
+export * from './enums';
diff --git a/submodules/renderer/src/api/utils/AdvancedMap.ts b/submodules/renderer/src/api/utils/AdvancedMap.ts
new file mode 100644
index 0000000..1bea641
--- /dev/null
+++ b/submodules/renderer/src/api/utils/AdvancedMap.ts
@@ -0,0 +1,159 @@
+import { IAdvancedMap } from './IAdvancedMap';
+
+export class AdvancedMap implements IAdvancedMap
+{
+ private _length: number;
+ private _dictionary: Map;
+ private _array: U[];
+ private _keys: T[];
+
+ constructor(map: Map = null)
+ {
+ this._length = 0;
+ this._dictionary = new Map();
+ this._array = [];
+ this._keys = [];
+
+ if(map) for(const [key, value] of map.entries()) this.add(key, value);
+ }
+
+ public get length(): number
+ {
+ return this._length;
+ }
+
+ public get disposed(): boolean
+ {
+ return (!this._dictionary);
+ }
+
+ public dispose(): void
+ {
+ if(!this._dictionary)
+ {
+ for(const key of this._dictionary.keys()) this._dictionary.delete(key);
+
+ this._dictionary = null;
+ }
+
+ this._length = 0;
+ this._array = null;
+ this._keys = null;
+ }
+
+ public reset(): void
+ {
+ for(const key of this._dictionary.keys()) this._dictionary.delete(key);
+
+ this._length = 0;
+ this._array = [];
+ this._keys = [];
+ }
+
+ public unshift(key: T, value: U): boolean
+ {
+ if(this._dictionary.get(key) !== null) return false;
+
+ this._dictionary.set(key, value);
+
+ this._array.unshift(value);
+ this._keys.unshift(key);
+
+ this._length++;
+
+ return true;
+ }
+
+ public add(key: T, value: U): boolean
+ {
+ if(this._dictionary.get(key) !== undefined) return false;
+
+ this._dictionary.set(key, value);
+
+ this._array[this._length] = value;
+ this._keys[this._length] = key;
+
+ this._length++;
+
+ return true;
+ }
+
+ public remove(key: T): U
+ {
+ const value = this._dictionary.get(key);
+
+ if(!value) return null;
+
+ const index = this._array.indexOf(value);
+
+ if(index >= 0)
+ {
+ this._array.splice(index, 1);
+ this._keys.splice(index, 1);
+
+ this._length--;
+ }
+
+ this._dictionary.delete(key);
+
+ return value;
+ }
+
+ public getWithIndex(index: number): U
+ {
+ if((index < 0) || (index >= this._length)) return null;
+
+ return this._array[index];
+ }
+
+ public getKey(index: number): T
+ {
+ if((index < 0) || (index >= this._length)) return null;
+
+ return this._keys[index];
+ }
+
+ public getKeys(): T[]
+ {
+ return this._keys.slice();
+ }
+
+ public hasKey(key: T): boolean
+ {
+ return (this._keys.indexOf(key) > -1);
+ }
+
+ public getValue(key: T): U
+ {
+ return this._dictionary.get(key);
+ }
+
+ public getValues(): U[]
+ {
+ return this._array.slice();
+ }
+
+ public hasValue(value: U): boolean
+ {
+ return (this._array.indexOf(value) > -1);
+ }
+
+ public indexOf(value: U): number
+ {
+ return this._array.indexOf(value);
+ }
+
+ public concatenate(newValues: IAdvancedMap): void
+ {
+ for(const k of (newValues as AdvancedMap)._keys) this.add(k, newValues.getValue(k));
+ }
+
+ public clone(): IAdvancedMap
+ {
+ const map = new AdvancedMap();
+
+ map.concatenate(this);
+
+ return map;
+ }
+}
diff --git a/submodules/renderer/src/api/utils/ArrayBufferToBase64.ts b/submodules/renderer/src/api/utils/ArrayBufferToBase64.ts
new file mode 100644
index 0000000..aa8eb74
--- /dev/null
+++ b/submodules/renderer/src/api/utils/ArrayBufferToBase64.ts
@@ -0,0 +1,11 @@
+export const ArrayBufferToBase64 = (buffer: ArrayBuffer) =>
+{
+ let binary = '';
+
+ const bytes = new Uint8Array(buffer);
+ const len = bytes.byteLength;
+
+ for(let i = 0; i < len; i++) (binary += String.fromCharCode(bytes[i]));
+
+ return window.btoa(binary);
+};
diff --git a/submodules/renderer/src/api/utils/BinaryReader.ts b/submodules/renderer/src/api/utils/BinaryReader.ts
new file mode 100644
index 0000000..e25ddb1
--- /dev/null
+++ b/submodules/renderer/src/api/utils/BinaryReader.ts
@@ -0,0 +1,82 @@
+import { IBinaryReader } from './IBinaryReader';
+
+export class BinaryReader implements IBinaryReader
+{
+ private _position: number;
+ private _dataView: DataView;
+
+ constructor(buffer: ArrayBuffer)
+ {
+ this._position = 0;
+ this._dataView = new DataView(buffer);
+ }
+
+ public readBytes(length: number): IBinaryReader
+ {
+ const buffer = new BinaryReader(this._dataView.buffer.slice(this._position, this._position + length));
+
+ this._position += length;
+
+ return buffer;
+ }
+
+ public readByte(): number
+ {
+ const byte = this._dataView.getInt8(this._position);
+
+ this._position++;
+
+ return byte;
+ }
+
+ public readShort(): number
+ {
+ const short = this._dataView.getInt16(this._position);
+
+ this._position += 2;
+
+ return short;
+ }
+
+ public readInt(): number
+ {
+ const int = this._dataView.getInt32(this._position);
+
+ this._position += 4;
+
+ return int;
+ }
+
+ public readFloat(): number
+ {
+ const float = this._dataView.getFloat32(this._position);
+
+ this._position += 4;
+
+ return float;
+ }
+
+ public readDouble(): number
+ {
+ const double = this._dataView.getFloat64(this._position);
+
+ this._position += 8;
+
+ return double;
+ }
+
+ public remaining(): number
+ {
+ return this._dataView.byteLength - this._position;
+ }
+
+ public toString(encoding?: string): string
+ {
+ return new TextDecoder().decode(this._dataView.buffer);
+ }
+
+ public toArrayBuffer(): ArrayBuffer
+ {
+ return this._dataView.buffer;
+ }
+}
diff --git a/submodules/renderer/src/api/utils/BinaryWriter.ts b/submodules/renderer/src/api/utils/BinaryWriter.ts
new file mode 100644
index 0000000..1bcae19
--- /dev/null
+++ b/submodules/renderer/src/api/utils/BinaryWriter.ts
@@ -0,0 +1,109 @@
+import { IBinaryWriter } from './IBinaryWriter';
+
+export class BinaryWriter implements IBinaryWriter
+{
+ private _buffer: Uint8Array;
+ private _position: number;
+
+ constructor()
+ {
+ this._buffer = new Uint8Array();
+ this._position = 0;
+ }
+
+ public writeByte(byte: number): IBinaryWriter
+ {
+ const array = new Uint8Array(1);
+
+ array[0] = byte;
+
+ this.appendArray(array);
+
+ return this;
+ }
+
+ public writeBytes(bytes: ArrayBuffer | number[]): IBinaryWriter
+ {
+ const array = new Uint8Array(bytes);
+
+ this.appendArray(array);
+
+ return this;
+ }
+
+ public writeShort(short: number): IBinaryWriter
+ {
+ const array = new Uint8Array(2);
+
+ array[0] = short >> 8;
+ array[1] = short & 0xFF;
+
+ this.appendArray(array);
+
+ return this;
+ }
+
+ public writeInt(integer: number): IBinaryWriter
+ {
+ const array = new Uint8Array(4);
+
+ array[0] = integer >> 24;
+ array[1] = integer >> 16;
+ array[2] = integer >> 8;
+ array[3] = integer & 0xFF;
+
+ this.appendArray(array);
+
+ return this;
+ }
+
+ public writeString(string: string, includeLength: boolean = true): IBinaryWriter
+ {
+ const array = new TextEncoder().encode(string);
+
+ if(includeLength)
+ {
+ this.writeShort(array.length);
+ this.appendArray(array);
+ }
+ else
+ {
+ this.appendArray(array);
+ }
+
+ return this;
+ }
+
+ private appendArray(array: Uint8Array): void
+ {
+ if(!array) return;
+
+ const mergedArray = new Uint8Array(((this.position + array.length) > this._buffer.length) ? (this.position + array.length) : this._buffer.length);
+
+ mergedArray.set(this._buffer);
+ mergedArray.set(array, this.position);
+
+ this._buffer = mergedArray;
+ this.position += array.length;
+ }
+
+ public getBuffer(): ArrayBuffer
+ {
+ return this._buffer.buffer;
+ }
+
+ public get position(): number
+ {
+ return this._position;
+ }
+
+ public set position(pos: number)
+ {
+ this._position = pos;
+ }
+
+ public toString(encoding?: string): string
+ {
+ return new TextDecoder(encoding).decode(this._buffer);
+ }
+}
diff --git a/submodules/renderer/src/api/utils/Dict.ts b/submodules/renderer/src/api/utils/Dict.ts
new file mode 100644
index 0000000..241c64a
--- /dev/null
+++ b/submodules/renderer/src/api/utils/Dict.ts
@@ -0,0 +1,3 @@
+export type Dict = {
+ [key: string]: T;
+};
diff --git a/submodules/renderer/src/api/utils/IAdvancedMap.ts b/submodules/renderer/src/api/utils/IAdvancedMap.ts
new file mode 100644
index 0000000..f10c570
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/utils/IBinaryReader.ts b/submodules/renderer/src/api/utils/IBinaryReader.ts
new file mode 100644
index 0000000..6ad2657
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/utils/IBinaryWriter.ts b/submodules/renderer/src/api/utils/IBinaryWriter.ts
new file mode 100644
index 0000000..f3135c0
--- /dev/null
+++ b/submodules/renderer/src/api/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/submodules/renderer/src/api/utils/NitroBundle.ts b/submodules/renderer/src/api/utils/NitroBundle.ts
new file mode 100644
index 0000000..37e4992
--- /dev/null
+++ b/submodules/renderer/src/api/utils/NitroBundle.ts
@@ -0,0 +1,60 @@
+import { BaseTexture } from '@pixi/core';
+import { Data, inflate } from 'pako';
+import { ArrayBufferToBase64 } from './ArrayBufferToBase64';
+import { BinaryReader } from './BinaryReader';
+
+export class NitroBundle
+{
+ private static TEXT_DECODER: TextDecoder = new TextDecoder('utf-8');
+
+ private _jsonFile: Object = null;
+ private _image: string = null;
+ private _imageData: Uint8Array = null;
+ private _baseTexture: BaseTexture = null;
+
+ constructor(arrayBuffer: ArrayBuffer)
+ {
+ this.parse(arrayBuffer);
+ }
+
+ public parse(arrayBuffer: ArrayBuffer): void
+ {
+ const binaryReader = new BinaryReader(arrayBuffer);
+
+ let fileCount = binaryReader.readShort();
+
+ while(fileCount > 0)
+ {
+ const fileNameLength = binaryReader.readShort();
+ const fileName = binaryReader.readBytes(fileNameLength).toString();
+ const fileLength = binaryReader.readInt();
+ const buffer = binaryReader.readBytes(fileLength);
+
+ if(fileName.endsWith('.json'))
+ {
+ const decompressed = inflate((buffer.toArrayBuffer() as Data));
+
+ this._jsonFile = JSON.parse(NitroBundle.TEXT_DECODER.decode(decompressed));
+ }
+ else
+ {
+ const decompressed = inflate((buffer.toArrayBuffer() as Data));
+ const base64 = ArrayBufferToBase64(decompressed);
+
+ this._baseTexture = new BaseTexture('data:image/png;base64,' + base64);
+ }
+
+ fileCount--;
+ }
+ }
+
+ get jsonFile(): Object
+ {
+ return this._jsonFile;
+ }
+
+ public get baseTexture(): BaseTexture
+ {
+ return this._baseTexture;
+ }
+}
diff --git a/submodules/renderer/src/api/utils/index.ts b/submodules/renderer/src/api/utils/index.ts
new file mode 100644
index 0000000..51632ff
--- /dev/null
+++ b/submodules/renderer/src/api/utils/index.ts
@@ -0,0 +1,9 @@
+export * from './AdvancedMap';
+export * from './ArrayBufferToBase64';
+export * from './BinaryReader';
+export * from './BinaryWriter';
+export * from './Dict';
+export * from './IAdvancedMap';
+export * from './IBinaryReader';
+export * from './IBinaryWriter';
+export * from './NitroBundle';
diff --git a/submodules/renderer/src/core/NitroCore.ts b/submodules/renderer/src/core/NitroCore.ts
new file mode 100644
index 0000000..6f4e4fb
--- /dev/null
+++ b/submodules/renderer/src/core/NitroCore.ts
@@ -0,0 +1,41 @@
+import { ICommunicationManager, IConfigurationManager, INitroCore } from '../api';
+import { Disposable } from './common';
+import { CommunicationManager } from './communication';
+import { ConfigurationManager } from './configuration';
+import { NitroVersion } from './NitroVersion';
+
+export class NitroCore extends Disposable implements INitroCore
+{
+ private _configuration: IConfigurationManager;
+ private _communication: ICommunicationManager;
+
+ constructor()
+ {
+ super();
+
+ NitroVersion.sayHello();
+
+ this._configuration = new ConfigurationManager();
+ this._communication = new CommunicationManager();
+ }
+
+ protected onDispose(): void
+ {
+ if(this._communication)
+ {
+ this._communication.dispose();
+
+ this._communication = null;
+ }
+ }
+
+ public get configuration(): IConfigurationManager
+ {
+ return this._configuration;
+ }
+
+ public get communication(): ICommunicationManager
+ {
+ return this._communication;
+ }
+}
diff --git a/submodules/renderer/src/core/NitroVersion.ts b/submodules/renderer/src/core/NitroVersion.ts
new file mode 100644
index 0000000..72c3105
--- /dev/null
+++ b/submodules/renderer/src/core/NitroVersion.ts
@@ -0,0 +1,30 @@
+export class NitroVersion
+{
+ public static RENDERER_VERSION: string = '1.6.6';
+ public static UI_VERSION: string = '';
+
+ public static sayHello(): void
+ {
+ if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1)
+ {
+ const args = [
+ `\n %c %c %c Nitro ${NitroVersion.UI_VERSION} - Renderer ${NitroVersion.RENDERER_VERSION} %c %c %c https://discord.nitrodev.co %c %c \n\n`,
+ 'background: #ffffff; padding:5px 0;',
+ 'background: #ffffff; padding:5px 0;',
+ 'color: #ffffff; background: #000000; padding:5px 0;',
+ 'background: #ffffff; padding:5px 0;',
+ 'background: #ffffff; padding:5px 0;',
+ 'background: #000000; padding:5px 0;',
+ 'background: #ffffff; padding:5px 0;',
+ 'background: #ffffff; padding:5px 0;'
+ ];
+
+ self.console.log(...args);
+ }
+
+ else if(self.console)
+ {
+ self.console.log(`Nitro ${NitroVersion.UI_VERSION} - Renderer ${NitroVersion.RENDERER_VERSION} `);
+ }
+ }
+}
diff --git a/submodules/renderer/src/core/common/Disposable.ts b/submodules/renderer/src/core/common/Disposable.ts
new file mode 100644
index 0000000..bb65b2d
--- /dev/null
+++ b/submodules/renderer/src/core/common/Disposable.ts
@@ -0,0 +1,40 @@
+import { IDisposable } from '../../api';
+
+export class Disposable implements IDisposable
+{
+ protected _isDisposed: boolean;
+ protected _isDisposing: boolean;
+
+ constructor()
+ {
+ this._isDisposed = false;
+ this._isDisposing = false;
+ }
+
+ public dispose(): void
+ {
+ if(this._isDisposed || this._isDisposing) return;
+
+ this._isDisposing = true;
+
+ this.onDispose();
+
+ this._isDisposed = true;
+ this._isDisposing = false;
+ }
+
+ protected onDispose(): void
+ {
+ return;
+ }
+
+ public get disposed(): boolean
+ {
+ return this._isDisposed;
+ }
+
+ public get isDisposing(): boolean
+ {
+ return this._isDisposing;
+ }
+}
diff --git a/submodules/renderer/src/core/common/EventDispatcher.ts b/submodules/renderer/src/core/common/EventDispatcher.ts
new file mode 100644
index 0000000..f6280de
--- /dev/null
+++ b/submodules/renderer/src/core/common/EventDispatcher.ts
@@ -0,0 +1,106 @@
+import { IDisposable, IEventDispatcher, INitroEvent, NitroLogger } from '../../api';
+import { Disposable } from './Disposable';
+
+export class EventDispatcher extends Disposable implements IEventDispatcher, IDisposable
+{
+ private _listeners: Map;
+
+ constructor()
+ {
+ super();
+
+ this._listeners = new Map();
+ }
+
+ protected onDispose(): void
+ {
+ this.removeAllListeners();
+
+ super.onDispose();
+ }
+
+ public addEventListener(type: string, callback: Function): void
+ {
+ if(!type || !callback) return;
+
+ const existing = this._listeners.get(type);
+
+ if(!existing)
+ {
+ this._listeners.set(type, [callback]);
+
+ return;
+ }
+
+ existing.push(callback);
+ }
+
+ public removeEventListener(type: string, callback: any): void
+ {
+ if(!type || !callback) return;
+
+ const existing = this._listeners.get(type);
+
+ if(!existing || !existing.length) return;
+
+ for(const [i, cb] of existing.entries())
+ {
+ if(!cb || (cb !== callback)) continue;
+
+ existing.splice(i, 1);
+
+ if(!existing.length) this._listeners.delete(type);
+
+ return;
+ }
+ }
+
+ public dispatchEvent(event: INitroEvent): boolean
+ {
+ if(!event) return false;
+
+ NitroLogger.events('Dispatched Event', event.type);
+
+ this.processEvent(event);
+
+ return true;
+ }
+
+ private processEvent(event: INitroEvent): void
+ {
+ const existing = this._listeners.get(event.type);
+
+ if(!existing || !existing.length) return;
+
+ const callbacks = [];
+
+ for(const callback of existing)
+ {
+ if(!callback) continue;
+
+ callbacks.push(callback);
+ }
+
+ while(callbacks.length)
+ {
+ const callback = callbacks.shift();
+
+ try
+ {
+ callback(event);
+ }
+
+ catch (err)
+ {
+ NitroLogger.error(err.stack);
+
+ return;
+ }
+ }
+ }
+
+ public removeAllListeners(): void
+ {
+ this._listeners.clear();
+ }
+}
diff --git a/submodules/renderer/src/core/common/NitroManager.ts b/submodules/renderer/src/core/common/NitroManager.ts
new file mode 100644
index 0000000..802ec66
--- /dev/null
+++ b/submodules/renderer/src/core/common/NitroManager.ts
@@ -0,0 +1,66 @@
+import { IEventDispatcher, INitroManager } from '../../api';
+import { Disposable } from './Disposable';
+import { EventDispatcher } from './EventDispatcher';
+
+export class NitroManager extends Disposable implements INitroManager
+{
+ private _events: IEventDispatcher;
+
+ private _isLoaded: boolean;
+ private _isLoading: boolean;
+
+ constructor()
+ {
+ super();
+
+ this._events = new EventDispatcher();
+
+ this._isLoaded = false;
+ this._isLoading = false;
+ }
+
+ public init(): void
+ {
+ if(this._isLoaded || this._isLoading || this.isDisposing) return;
+
+ this._isLoading = true;
+
+ this.onInit();
+
+ this._isLoaded = true;
+ this._isLoading = false;
+ }
+
+ protected onInit(): void
+ {
+ return;
+ }
+
+ protected onDispose(): void
+ {
+ if(this._events) this._events.dispose();
+
+ super.onDispose();
+ }
+
+ public reload(): void
+ {
+ this.dispose();
+ this.init();
+ }
+
+ public get events(): IEventDispatcher
+ {
+ return this._events;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return this._isLoaded;
+ }
+
+ public get isLoading(): boolean
+ {
+ return this._isLoading;
+ }
+}
diff --git a/submodules/renderer/src/core/common/index.ts b/submodules/renderer/src/core/common/index.ts
new file mode 100644
index 0000000..9e5ab33
--- /dev/null
+++ b/submodules/renderer/src/core/common/index.ts
@@ -0,0 +1,3 @@
+export * from './Disposable';
+export * from './EventDispatcher';
+export * from './NitroManager';
diff --git a/submodules/renderer/src/core/communication/CommunicationManager.ts b/submodules/renderer/src/core/communication/CommunicationManager.ts
new file mode 100644
index 0000000..8e0c0d8
--- /dev/null
+++ b/submodules/renderer/src/core/communication/CommunicationManager.ts
@@ -0,0 +1,50 @@
+import { ICommunicationManager, IConnection, IConnectionStateListener, IUpdateReceiver } from '../../api';
+import { Disposable } from '../common';
+import { SocketConnection } from './SocketConnection';
+
+export class CommunicationManager extends Disposable implements ICommunicationManager, IUpdateReceiver
+{
+ private _connections: IConnection[];
+
+ constructor()
+ {
+ super();
+
+ this._connections = [];
+ }
+
+ protected onDispose(): void
+ {
+ if(!this._connections || !this._connections.length) return;
+
+ for(const connection of this._connections.values()) connection && connection.dispose();
+ }
+
+ public createConnection(stateListener: IConnectionStateListener = null): IConnection
+ {
+ const connection = new SocketConnection(this, stateListener);
+
+ if(!connection) return;
+
+ this._connections.push(connection);
+
+ return connection;
+ }
+
+ public update(time: number): void
+ {
+ let index = 0;
+
+ while(index < this._connections.length)
+ {
+ const connection = this._connections[index];
+
+ connection.processReceivedData();
+
+ if(this.disposed) return;
+
+ if(connection.disposed) this._connections.splice(index, 1);
+ else index++;
+ }
+ }
+}
diff --git a/submodules/renderer/src/core/communication/SocketConnection.ts b/submodules/renderer/src/core/communication/SocketConnection.ts
new file mode 100644
index 0000000..4d493f7
--- /dev/null
+++ b/submodules/renderer/src/core/communication/SocketConnection.ts
@@ -0,0 +1,355 @@
+import { ICodec, ICommunicationManager, IConnection, IConnectionStateListener, IMessageComposer, IMessageConfiguration, IMessageDataWrapper, IMessageEvent, NitroLogger, WebSocketEventEnum } from '../../api';
+import { SocketConnectionEvent } from '../../events';
+import { EventDispatcher } from '../common';
+import { EvaWireFormat } from './codec';
+import { MessageClassManager } from './messages';
+
+export class SocketConnection extends EventDispatcher implements IConnection
+{
+ private _communicationManager: ICommunicationManager;
+ private _stateListener: IConnectionStateListener;
+ private _socket: WebSocket;
+ private _messages: MessageClassManager;
+ private _codec: ICodec;
+ private _dataBuffer: ArrayBuffer;
+ private _isReady: boolean;
+
+ private _pendingClientMessages: IMessageComposer[];
+ private _pendingServerMessages: IMessageDataWrapper[];
+
+ private _isAuthenticated: boolean;
+
+ constructor(communicationManager: ICommunicationManager, stateListener: IConnectionStateListener)
+ {
+ super();
+
+ this._communicationManager = communicationManager;
+ this._stateListener = stateListener;
+ this._socket = null;
+ this._messages = new MessageClassManager();
+ this._codec = new EvaWireFormat();
+ this._dataBuffer = null;
+ this._isReady = false;
+
+ this._pendingClientMessages = [];
+ this._pendingServerMessages = [];
+
+ this._isAuthenticated = false;
+
+ this.onOpen = this.onOpen.bind(this);
+ this.onClose = this.onClose.bind(this);
+ this.onError = this.onError.bind(this);
+ this.onMessage = this.onMessage.bind(this);
+ }
+
+ public init(socketUrl: string): void
+ {
+ if(this._stateListener)
+ {
+ this._stateListener.connectionInit(socketUrl);
+ }
+
+ this.createSocket(socketUrl);
+ }
+
+ protected onDispose(): void
+ {
+ super.onDispose();
+
+ this.destroySocket();
+
+ this._communicationManager = null;
+ this._stateListener = null;
+ this._messages = null;
+ this._codec = null;
+ this._dataBuffer = null;
+ }
+
+ public onReady(): 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 = [];
+ }
+
+ private createSocket(socketUrl: string): void
+ {
+ if(!socketUrl) return;
+
+ this.destroySocket();
+
+ this._dataBuffer = new ArrayBuffer(0);
+ this._socket = new WebSocket(socketUrl);
+
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_OPENED, this.onOpen);
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_CLOSED, this.onClose);
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_ERROR, this.onError);
+ this._socket.addEventListener(WebSocketEventEnum.CONNECTION_MESSAGE, this.onMessage);
+ }
+
+ private destroySocket(): void
+ {
+ if(!this._socket) return;
+
+ this._socket.removeEventListener(WebSocketEventEnum.CONNECTION_OPENED, this.onOpen);
+ this._socket.removeEventListener(WebSocketEventEnum.CONNECTION_CLOSED, this.onClose);
+ this._socket.removeEventListener(WebSocketEventEnum.CONNECTION_ERROR, this.onError);
+ this._socket.removeEventListener(WebSocketEventEnum.CONNECTION_MESSAGE, this.onMessage);
+
+ if(this._socket.readyState === WebSocket.OPEN) this._socket.close();
+
+ this._socket = null;
+ }
+
+ private onOpen(event: Event): void
+ {
+ this.dispatchConnectionEvent(SocketConnectionEvent.CONNECTION_OPENED, event);
+ }
+
+ private onClose(event: CloseEvent): void
+ {
+ this.dispatchConnectionEvent(SocketConnectionEvent.CONNECTION_CLOSED, event);
+ }
+
+ private onError(event: Event): void
+ {
+ this.dispatchConnectionEvent(SocketConnectionEvent.CONNECTION_ERROR, event);
+ }
+
+ private onMessage(event: MessageEvent): void
+ {
+ if(!event) return;
+
+ //this.dispatchConnectionEvent(SocketConnectionEvent.CONNECTION_MESSAGE, event);
+
+ const reader = new FileReader();
+
+ reader.readAsArrayBuffer(event.data);
+
+ reader.onloadend = () =>
+ {
+ this._dataBuffer = this.concatArrayBuffers(this._dataBuffer, (reader.result as ArrayBuffer));
+
+ this.processReceivedData();
+ };
+ }
+
+ private dispatchConnectionEvent(type: string, event: Event): void
+ {
+ this.dispatchEvent(new SocketConnectionEvent(type, this, event));
+ }
+
+ public authenticated(): void
+ {
+ this._isAuthenticated = true;
+ }
+
+ public send(...composers: IMessageComposer[]): boolean
+ {
+ if(this.disposed || !composers) return false;
+
+ composers = [...composers];
+
+ if(this._isAuthenticated && !this._isReady)
+ {
+ if(!this._pendingClientMessages) this._pendingClientMessages = [];
+
+ 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;
+ }
+
+ 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/submodules/renderer/src/core/communication/codec/Byte.ts b/submodules/renderer/src/core/communication/codec/Byte.ts
new file mode 100644
index 0000000..dbcb29c
--- /dev/null
+++ b/submodules/renderer/src/core/communication/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/submodules/renderer/src/core/communication/codec/Short.ts b/submodules/renderer/src/core/communication/codec/Short.ts
new file mode 100644
index 0000000..f23125e
--- /dev/null
+++ b/submodules/renderer/src/core/communication/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/submodules/renderer/src/core/communication/codec/evawire/EvaWireDataWrapper.ts b/submodules/renderer/src/core/communication/codec/evawire/EvaWireDataWrapper.ts
new file mode 100644
index 0000000..60eca85
--- /dev/null
+++ b/submodules/renderer/src/core/communication/codec/evawire/EvaWireDataWrapper.ts
@@ -0,0 +1,78 @@
+import { IBinaryReader, IMessageDataWrapper } from '../../../../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/submodules/renderer/src/core/communication/codec/evawire/EvaWireFormat.ts b/submodules/renderer/src/core/communication/codec/evawire/EvaWireFormat.ts
new file mode 100644
index 0000000..0acbff8
--- /dev/null
+++ b/submodules/renderer/src/core/communication/codec/evawire/EvaWireFormat.ts
@@ -0,0 +1,88 @@
+import { BinaryReader, BinaryWriter, IBinaryWriter, ICodec, IConnection, IMessageDataWrapper } from '../../../../api';
+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/submodules/renderer/src/core/communication/codec/evawire/index.ts b/submodules/renderer/src/core/communication/codec/evawire/index.ts
new file mode 100644
index 0000000..6b63cda
--- /dev/null
+++ b/submodules/renderer/src/core/communication/codec/evawire/index.ts
@@ -0,0 +1,2 @@
+export * from './EvaWireDataWrapper';
+export * from './EvaWireFormat';
diff --git a/submodules/renderer/src/core/communication/codec/index.ts b/submodules/renderer/src/core/communication/codec/index.ts
new file mode 100644
index 0000000..cb49e18
--- /dev/null
+++ b/submodules/renderer/src/core/communication/codec/index.ts
@@ -0,0 +1,3 @@
+export * from './Byte';
+export * from './evawire';
+export * from './Short';
diff --git a/submodules/renderer/src/core/communication/index.ts b/submodules/renderer/src/core/communication/index.ts
new file mode 100644
index 0000000..d9e31cd
--- /dev/null
+++ b/submodules/renderer/src/core/communication/index.ts
@@ -0,0 +1,5 @@
+export * from './codec';
+export * from './codec/evawire';
+export * from './CommunicationManager';
+export * from './messages';
+export * from './SocketConnection';
diff --git a/submodules/renderer/src/core/communication/messages/MessageClassManager.ts b/submodules/renderer/src/core/communication/messages/MessageClassManager.ts
new file mode 100644
index 0000000..f4f7e00
--- /dev/null
+++ b/submodules/renderer/src/core/communication/messages/MessageClassManager.ts
@@ -0,0 +1,128 @@
+import { IMessageComposer, IMessageConfiguration, IMessageEvent } from '../../../api';
+import { MessageEvent } from '../../../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/submodules/renderer/src/core/communication/messages/index.ts b/submodules/renderer/src/core/communication/messages/index.ts
new file mode 100644
index 0000000..deb18a3
--- /dev/null
+++ b/submodules/renderer/src/core/communication/messages/index.ts
@@ -0,0 +1 @@
+export * from './MessageClassManager';
diff --git a/submodules/renderer/src/core/configuration/ConfigurationEvent.ts b/submodules/renderer/src/core/configuration/ConfigurationEvent.ts
new file mode 100644
index 0000000..6f4c5be
--- /dev/null
+++ b/submodules/renderer/src/core/configuration/ConfigurationEvent.ts
@@ -0,0 +1,12 @@
+import { NitroEvent } from '../../events';
+
+export class ConfigurationEvent extends NitroEvent
+{
+ public static LOADED: string = 'NCE_LOADED';
+ public static FAILED: string = 'NCE_FAILED';
+
+ constructor(type: string)
+ {
+ super(type);
+ }
+}
diff --git a/submodules/renderer/src/core/configuration/ConfigurationManager.ts b/submodules/renderer/src/core/configuration/ConfigurationManager.ts
new file mode 100644
index 0000000..bedf4b1
--- /dev/null
+++ b/submodules/renderer/src/core/configuration/ConfigurationManager.ts
@@ -0,0 +1,93 @@
+import { IConfigurationManager, NitroConfiguration } from '../../api';
+import { NitroManager } from '../common';
+import { ConfigurationEvent } from './ConfigurationEvent';
+
+export class ConfigurationManager extends NitroManager implements IConfigurationManager
+{
+ private _definitions: Map;
+ private _config: any;
+ private _pendingUrls: string[];
+ private _missingKeys: string[];
+
+ constructor()
+ {
+ super();
+
+ this._definitions = new Map();
+ this._config = [];
+ this._pendingUrls = [];
+ this._missingKeys = [];
+
+ this.onConfigurationLoaded = this.onConfigurationLoaded.bind(this);
+ }
+
+ protected onInit(): void
+ {
+ NitroConfiguration.parseConfiguration(this.getDefaultConfig(), true);
+
+ this._pendingUrls = NitroConfiguration.getValue('config.urls').slice();
+
+ this.loadNextConfiguration();
+ }
+
+ private loadNextConfiguration(): void
+ {
+ if(!this._pendingUrls.length)
+ {
+ this.dispatchConfigurationEvent(ConfigurationEvent.LOADED);
+
+ return;
+ }
+
+ this.loadConfigurationFromUrl(this._pendingUrls[0]);
+ }
+
+ public loadConfigurationFromUrl(url: string): void
+ {
+ if(!url || (url === ''))
+ {
+ this.dispatchConfigurationEvent(ConfigurationEvent.FAILED);
+
+ return;
+ }
+
+ fetch(url)
+ .then(response => response.json())
+ .then(data => this.onConfigurationLoaded(data, url))
+ .catch(err => this.onConfigurationFailed(err));
+ }
+
+ private onConfigurationLoaded(data: { [index: string]: any }, url: string): void
+ {
+ if(!data) return;
+
+ if(NitroConfiguration.parseConfiguration(data))
+ {
+ const index = this._pendingUrls.indexOf(url);
+
+ if(index >= 0) this._pendingUrls.splice(index, 1);
+
+ this.loadNextConfiguration();
+
+ return;
+ }
+
+ this.dispatchConfigurationEvent(ConfigurationEvent.FAILED);
+ }
+
+ private onConfigurationFailed(error: Error): void
+ {
+ this.dispatchConfigurationEvent(ConfigurationEvent.FAILED);
+ }
+
+ private dispatchConfigurationEvent(type: string): void
+ {
+ this.events && this.events.dispatchEvent(new ConfigurationEvent(type));
+ }
+
+ public getDefaultConfig(): { [index: string]: any }
+ {
+ //@ts-ignore
+ return NitroConfig as { [index: string]: any };
+ }
+}
diff --git a/submodules/renderer/src/core/configuration/index.ts b/submodules/renderer/src/core/configuration/index.ts
new file mode 100644
index 0000000..1b3e284
--- /dev/null
+++ b/submodules/renderer/src/core/configuration/index.ts
@@ -0,0 +1,2 @@
+export * from './ConfigurationEvent';
+export * from './ConfigurationManager';
diff --git a/submodules/renderer/src/core/index.ts b/submodules/renderer/src/core/index.ts
new file mode 100644
index 0000000..67ca055
--- /dev/null
+++ b/submodules/renderer/src/core/index.ts
@@ -0,0 +1,8 @@
+export * from './common';
+export * from './communication';
+export * from './communication/codec';
+export * from './communication/codec/evawire';
+export * from './communication/messages';
+export * from './configuration';
+export * from './NitroCore';
+export * from './NitroVersion';
diff --git a/submodules/renderer/src/events/NitroSettingsEvent.ts b/submodules/renderer/src/events/NitroSettingsEvent.ts
new file mode 100644
index 0000000..62635a0
--- /dev/null
+++ b/submodules/renderer/src/events/NitroSettingsEvent.ts
@@ -0,0 +1,116 @@
+import { NitroEvent } from './core';
+
+export class NitroSettingsEvent extends NitroEvent
+{
+ public static SETTINGS_UPDATED: string = 'NSE_SETTINGS_UPDATED';
+
+ private _volumeSystem: number;
+ private _volumeFurni: number;
+ private _volumeTrax: number;
+ private _oldChat: boolean;
+ private _roomInvites: boolean;
+ private _cameraFollow: boolean;
+ private _flags: number;
+ private _chatType: number;
+
+ constructor()
+ {
+ super(NitroSettingsEvent.SETTINGS_UPDATED);
+ }
+
+ public clone(): NitroSettingsEvent
+ {
+ const clone = new NitroSettingsEvent();
+
+ clone._volumeSystem = this._volumeSystem;
+ clone._volumeFurni = this._volumeFurni;
+ clone._volumeTrax = this._volumeTrax;
+ clone._oldChat = this._oldChat;
+ clone._roomInvites = this._roomInvites;
+ clone._cameraFollow = this._cameraFollow;
+ clone._flags = this._flags;
+ clone._chatType = this._chatType;
+
+ return clone;
+ }
+
+ public get volumeSystem(): number
+ {
+ return this._volumeSystem;
+ }
+
+ public set volumeSystem(volume: number)
+ {
+ this._volumeSystem = volume;
+ }
+
+ public get volumeFurni(): number
+ {
+ return this._volumeFurni;
+ }
+
+ public set volumeFurni(volume: number)
+ {
+ this._volumeFurni = volume;
+ }
+
+ public get volumeTrax(): number
+ {
+ return this._volumeTrax;
+ }
+
+ public set volumeTrax(volume: number)
+ {
+ this._volumeTrax = volume;
+ }
+
+ public get oldChat(): boolean
+ {
+ return this._oldChat;
+ }
+
+ public set oldChat(value: boolean)
+ {
+ this._oldChat = value;
+ }
+
+ public get roomInvites(): boolean
+ {
+ return this._roomInvites;
+ }
+
+ public set roomInvites(value: boolean)
+ {
+ this._roomInvites = value;
+ }
+
+ public get cameraFollow(): boolean
+ {
+ return this._cameraFollow;
+ }
+
+ public set cameraFollow(value: boolean)
+ {
+ this._cameraFollow = value;
+ }
+
+ public get flags(): number
+ {
+ return this._flags;
+ }
+
+ public set flags(flags: number)
+ {
+ this._flags = flags;
+ }
+
+ public get chatType(): number
+ {
+ return this._chatType;
+ }
+
+ public set chatType(type: number)
+ {
+ this._chatType = type;
+ }
+}
diff --git a/submodules/renderer/src/events/NitroSoundEvent.ts b/submodules/renderer/src/events/NitroSoundEvent.ts
new file mode 100644
index 0000000..5e70223
--- /dev/null
+++ b/submodules/renderer/src/events/NitroSoundEvent.ts
@@ -0,0 +1,19 @@
+import { NitroEvent } from './core';
+
+export class NitroSoundEvent extends NitroEvent
+{
+ public static PLAY_SOUND: string = 'NSOE_PLAY_SOUND';
+
+ private _sampleCode: string;
+
+ constructor(type: string, sampleCode: string)
+ {
+ super(type);
+ this._sampleCode = sampleCode;
+ }
+
+ public get sampleCode(): string
+ {
+ return this._sampleCode;
+ }
+}
diff --git a/submodules/renderer/src/events/NitroToolbarAnimateIconEvent.ts b/submodules/renderer/src/events/NitroToolbarAnimateIconEvent.ts
new file mode 100644
index 0000000..5aa3f7f
--- /dev/null
+++ b/submodules/renderer/src/events/NitroToolbarAnimateIconEvent.ts
@@ -0,0 +1,34 @@
+import { NitroToolbarEvent } from './NitroToolbarEvent';
+
+export class NitroToolbarAnimateIconEvent extends NitroToolbarEvent
+{
+ public static ANIMATE_ICON: string = 'NTAIE_ANIMATE_ICON';
+
+ private _image: HTMLImageElement;
+ private _x: number;
+ private _y: number;
+
+ constructor(image: HTMLImageElement, x: number, y: number)
+ {
+ super(NitroToolbarAnimateIconEvent.ANIMATE_ICON);
+
+ this._image = image;
+ this._x = x;
+ this._y = y;
+ }
+
+ public get image(): HTMLImageElement
+ {
+ return this._image;
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/events/NitroToolbarEvent.ts b/submodules/renderer/src/events/NitroToolbarEvent.ts
new file mode 100644
index 0000000..d9cbc63
--- /dev/null
+++ b/submodules/renderer/src/events/NitroToolbarEvent.ts
@@ -0,0 +1,35 @@
+import { NitroEvent } from './core';
+
+export class NitroToolbarEvent extends NitroEvent
+{
+ public static TOOLBAR_CLICK: string = 'NTE_TOOLBAR_CLICK';
+ public static SELECT_OWN_AVATAR: string = 'NTE_SELECT_OWN_AVATAR';
+
+ private _iconId: string;
+ private _iconName: string;
+
+ constructor(type: string)
+ {
+ super(type);
+ }
+
+ public get iconId(): string
+ {
+ return this._iconId;
+ }
+
+ public set iconId(id: string)
+ {
+ this._iconId = id;
+ }
+
+ public get iconName(): string
+ {
+ return this._iconName;
+ }
+
+ public set iconName(name: string)
+ {
+ this._iconName = name;
+ }
+}
diff --git a/submodules/renderer/src/events/avatar/AvatarRenderEffectLibraryEvent.ts b/submodules/renderer/src/events/avatar/AvatarRenderEffectLibraryEvent.ts
new file mode 100644
index 0000000..de48624
--- /dev/null
+++ b/submodules/renderer/src/events/avatar/AvatarRenderEffectLibraryEvent.ts
@@ -0,0 +1,21 @@
+import { IEffectAssetDownloadLibrary } from '../../api';
+import { NitroEvent } from '../core';
+
+export class AvatarRenderEffectLibraryEvent extends NitroEvent
+{
+ public static DOWNLOAD_COMPLETE: string = 'ARELE_DOWNLOAD_COMPLETE';
+
+ private _library: IEffectAssetDownloadLibrary;
+
+ constructor(type: string, library: IEffectAssetDownloadLibrary)
+ {
+ super(type);
+
+ this._library = library;
+ }
+
+ public get library(): IEffectAssetDownloadLibrary
+ {
+ return this._library;
+ }
+}
diff --git a/submodules/renderer/src/events/avatar/AvatarRenderEvent.ts b/submodules/renderer/src/events/avatar/AvatarRenderEvent.ts
new file mode 100644
index 0000000..d3292e6
--- /dev/null
+++ b/submodules/renderer/src/events/avatar/AvatarRenderEvent.ts
@@ -0,0 +1,4 @@
+export class AvatarRenderEvent
+{
+ public static AVATAR_RENDER_READY: string = 'AVATAR_RENDER_READY';
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/events/avatar/AvatarRenderLibraryEvent.ts b/submodules/renderer/src/events/avatar/AvatarRenderLibraryEvent.ts
new file mode 100644
index 0000000..9f2dec8
--- /dev/null
+++ b/submodules/renderer/src/events/avatar/AvatarRenderLibraryEvent.ts
@@ -0,0 +1,21 @@
+import { IAvatarAssetDownloadLibrary } from '../../api';
+import { NitroEvent } from '../core';
+
+export class AvatarRenderLibraryEvent extends NitroEvent
+{
+ public static DOWNLOAD_COMPLETE: string = 'ARLE_DOWNLOAD_COMPLETE';
+
+ private _library: IAvatarAssetDownloadLibrary;
+
+ constructor(type: string, library: IAvatarAssetDownloadLibrary)
+ {
+ super(type);
+
+ this._library = library;
+ }
+
+ public get library(): IAvatarAssetDownloadLibrary
+ {
+ return this._library;
+ }
+}
diff --git a/submodules/renderer/src/events/avatar/index.ts b/submodules/renderer/src/events/avatar/index.ts
new file mode 100644
index 0000000..3fb9605
--- /dev/null
+++ b/submodules/renderer/src/events/avatar/index.ts
@@ -0,0 +1,3 @@
+export * from './AvatarRenderEffectLibraryEvent';
+export * from './AvatarRenderEvent';
+export * from './AvatarRenderLibraryEvent';
diff --git a/submodules/renderer/src/events/camera/RoomCameraWidgetManagerEvent.ts b/submodules/renderer/src/events/camera/RoomCameraWidgetManagerEvent.ts
new file mode 100644
index 0000000..5989627
--- /dev/null
+++ b/submodules/renderer/src/events/camera/RoomCameraWidgetManagerEvent.ts
@@ -0,0 +1,11 @@
+import { NitroEvent } from '../core';
+
+export class RoomCameraWidgetManagerEvent extends NitroEvent
+{
+ public static INITIALIZED: string = 'RCWM_INITIALIZED';
+
+ constructor(type: string)
+ {
+ super(type);
+ }
+}
diff --git a/submodules/renderer/src/events/camera/index.ts b/submodules/renderer/src/events/camera/index.ts
new file mode 100644
index 0000000..b6e32e2
--- /dev/null
+++ b/submodules/renderer/src/events/camera/index.ts
@@ -0,0 +1 @@
+export * from './RoomCameraWidgetManagerEvent';
diff --git a/submodules/renderer/src/events/communication/NitroCommunicationDemoEvent.ts b/submodules/renderer/src/events/communication/NitroCommunicationDemoEvent.ts
new file mode 100644
index 0000000..e326f42
--- /dev/null
+++ b/submodules/renderer/src/events/communication/NitroCommunicationDemoEvent.ts
@@ -0,0 +1,27 @@
+import { IConnection } from '../../api';
+import { NitroEvent } from '../core';
+
+export class NitroCommunicationDemoEvent extends NitroEvent
+{
+ public static CONNECTION_ESTABLISHED = 'NCE_ESTABLISHED';
+ public static CONNECTION_CLOSED = 'NCE_CLOSED';
+ public static CONNECTION_ERROR = 'NCE_ERROR';
+ public static CONNECTION_HANDSHAKING = 'NCE_HANDSHAKING';
+ public static CONNECTION_HANDSHAKED = 'NCE_HANDSHAKED';
+ public static CONNECTION_HANDSHAKE_FAILED = 'NCE_HANDSHAKE_FAILED';
+ public static CONNECTION_AUTHENTICATED = 'NCE_AUTHENTICATED';
+
+ private _connection: IConnection;
+
+ constructor(type: string, connection: IConnection)
+ {
+ super(type);
+
+ this._connection = connection;
+ }
+
+ public get connection(): IConnection
+ {
+ return this._connection;
+ }
+}
diff --git a/submodules/renderer/src/events/communication/index.ts b/submodules/renderer/src/events/communication/index.ts
new file mode 100644
index 0000000..d795b92
--- /dev/null
+++ b/submodules/renderer/src/events/communication/index.ts
@@ -0,0 +1 @@
+export * from './NitroCommunicationDemoEvent';
diff --git a/submodules/renderer/src/events/core/MessageEvent.ts b/submodules/renderer/src/events/core/MessageEvent.ts
new file mode 100644
index 0000000..012c8c2
--- /dev/null
+++ b/submodules/renderer/src/events/core/MessageEvent.ts
@@ -0,0 +1,55 @@
+import { IConnection, IMessageEvent, IMessageParser } from '../../api';
+
+export class MessageEvent implements IMessageEvent
+{
+ private _callBack: Function;
+ private _parserClass: Function;
+ private _parser: IMessageParser;
+ private _connection: IConnection;
+
+ constructor(callBack: Function, parser: { new(): IMessageParser })
+ {
+ this._callBack = callBack;
+ this._parserClass = parser;
+ this._parser = null;
+ this._connection = null;
+ }
+
+ public dispose(): void
+ {
+ this._callBack = null;
+ this._parserClass = null;
+ this._parser = null;
+ this._connection = null;
+ }
+
+ public get callBack(): Function
+ {
+ return this._callBack;
+ }
+
+ public get parserClass(): Function
+ {
+ return this._parserClass;
+ }
+
+ public get parser(): IMessageParser
+ {
+ return this._parser;
+ }
+
+ public set parser(parser: IMessageParser)
+ {
+ this._parser = parser;
+ }
+
+ public get connection(): IConnection
+ {
+ return this._connection;
+ }
+
+ public set connection(connection: IConnection)
+ {
+ this._connection = connection;
+ }
+}
diff --git a/submodules/renderer/src/events/core/NitroEvent.ts b/submodules/renderer/src/events/core/NitroEvent.ts
new file mode 100644
index 0000000..204f113
--- /dev/null
+++ b/submodules/renderer/src/events/core/NitroEvent.ts
@@ -0,0 +1,16 @@
+import { INitroEvent } from '../../api';
+
+export class NitroEvent implements INitroEvent
+{
+ private _type: string;
+
+ constructor(type: string)
+ {
+ this._type = type;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+}
diff --git a/submodules/renderer/src/events/core/SocketConnectionEvent.ts b/submodules/renderer/src/events/core/SocketConnectionEvent.ts
new file mode 100644
index 0000000..5df9c5a
--- /dev/null
+++ b/submodules/renderer/src/events/core/SocketConnectionEvent.ts
@@ -0,0 +1,31 @@
+import { IConnection } from '../../api';
+import { NitroEvent } from './NitroEvent';
+
+export class SocketConnectionEvent extends NitroEvent
+{
+ public static CONNECTION_OPENED = 'SCE_OPEN';
+ public static CONNECTION_CLOSED = 'SCE_CLOSED';
+ public static CONNECTION_ERROR = 'SCE_ERROR';
+ public static CONNECTION_MESSAGE = 'SCE_MESSAGE';
+
+ private _connection: IConnection;
+ private _originalEvent: Event;
+
+ constructor(type: string, connection: IConnection, originalEvent: Event)
+ {
+ super(type);
+
+ this._connection = connection;
+ this._originalEvent = event;
+ }
+
+ public get connection(): IConnection
+ {
+ return this._connection;
+ }
+
+ public get originalEvent(): Event
+ {
+ return this._originalEvent;
+ }
+}
diff --git a/submodules/renderer/src/events/core/index.ts b/submodules/renderer/src/events/core/index.ts
new file mode 100644
index 0000000..4657952
--- /dev/null
+++ b/submodules/renderer/src/events/core/index.ts
@@ -0,0 +1,3 @@
+export * from './MessageEvent';
+export * from './NitroEvent';
+export * from './SocketConnectionEvent';
diff --git a/submodules/renderer/src/events/index.ts b/submodules/renderer/src/events/index.ts
new file mode 100644
index 0000000..17b2121
--- /dev/null
+++ b/submodules/renderer/src/events/index.ts
@@ -0,0 +1,11 @@
+export * from './avatar';
+export * from './camera';
+export * from './communication';
+export * from './core';
+export * from './localization';
+export * from './NitroSettingsEvent';
+export * from './NitroSoundEvent';
+export * from './NitroToolbarAnimateIconEvent';
+export * from './NitroToolbarEvent';
+export * from './room';
+export * from './session';
diff --git a/submodules/renderer/src/events/localization/NitroLocalizationEvent.ts b/submodules/renderer/src/events/localization/NitroLocalizationEvent.ts
new file mode 100644
index 0000000..a011d39
--- /dev/null
+++ b/submodules/renderer/src/events/localization/NitroLocalizationEvent.ts
@@ -0,0 +1,12 @@
+import { NitroEvent } from '../core';
+
+export class NitroLocalizationEvent extends NitroEvent
+{
+ public static LOADED: string = 'NLE_LOADED';
+ public static FAILED: string = 'NLE_FAILED';
+
+ constructor(type: string)
+ {
+ super(type);
+ }
+}
diff --git a/submodules/renderer/src/events/localization/index.ts b/submodules/renderer/src/events/localization/index.ts
new file mode 100644
index 0000000..30cf817
--- /dev/null
+++ b/submodules/renderer/src/events/localization/index.ts
@@ -0,0 +1 @@
+export * from './NitroLocalizationEvent';
diff --git a/submodules/renderer/src/events/room/RoomBackgroundColorEvent.ts b/submodules/renderer/src/events/room/RoomBackgroundColorEvent.ts
new file mode 100644
index 0000000..03152df
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomBackgroundColorEvent.ts
@@ -0,0 +1,34 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomBackgroundColorEvent extends RoomEngineEvent
+{
+ public static ROOM_COLOR: string = 'REE_ROOM_COLOR';
+
+ private _color: number;
+ private _brightness: number;
+ private _bgOnly: boolean;
+
+ constructor(roomId: number, color: number, _arg_3: number, _arg_4: boolean)
+ {
+ super(RoomBackgroundColorEvent.ROOM_COLOR, roomId);
+
+ this._color = color;
+ this._brightness = _arg_3;
+ this._bgOnly = _arg_4;
+ }
+
+ public get color(): number
+ {
+ return this._color;
+ }
+
+ public get brightness(): number
+ {
+ return this._brightness;
+ }
+
+ public get bgOnly(): boolean
+ {
+ return this._bgOnly;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomContentLoadedEvent.ts b/submodules/renderer/src/events/room/RoomContentLoadedEvent.ts
new file mode 100644
index 0000000..1cdc9fb
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomContentLoadedEvent.ts
@@ -0,0 +1,22 @@
+import { NitroEvent } from '../core';
+
+export class RoomContentLoadedEvent extends NitroEvent
+{
+ public static RCLE_SUCCESS: string = 'RCLE_SUCCESS';
+ public static RCLE_FAILURE: string = 'RCLE_FAILURE';
+ public static RCLE_CANCEL: string = 'RCLE_CANCEL';
+
+ private _contentType: string;
+
+ constructor(type: string, contentType: string)
+ {
+ super(type);
+
+ this._contentType = contentType;
+ }
+
+ public get contentType(): string
+ {
+ return this._contentType;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomDragEvent.ts b/submodules/renderer/src/events/room/RoomDragEvent.ts
new file mode 100644
index 0000000..e41931b
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomDragEvent.ts
@@ -0,0 +1,27 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomDragEvent extends RoomEngineEvent
+{
+ public static ROOM_DRAG: string = 'RDE_ROOM_DRAG';
+
+ private _offsetX: number;
+ private _offsetY: number;
+
+ constructor(roomId: number, offsetX: number, offsetY: number)
+ {
+ super(RoomDragEvent.ROOM_DRAG, roomId);
+
+ this._offsetX = offsetX;
+ this._offsetY = offsetY;
+ }
+
+ public get offsetX(): number
+ {
+ return this._offsetX;
+ }
+
+ public get offsetY(): number
+ {
+ return this._offsetY;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineDimmerStateEvent.ts b/submodules/renderer/src/events/room/RoomEngineDimmerStateEvent.ts
new file mode 100644
index 0000000..85ca480
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineDimmerStateEvent.ts
@@ -0,0 +1,48 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomEngineDimmerStateEvent extends RoomEngineEvent
+{
+ public static ROOM_COLOR: string = 'REDSE_ROOM_COLOR';
+
+ private _state: number;
+ private _presetId: number;
+ private _effectId: number;
+ private _color: number;
+ private _brightness: number;
+
+ constructor(k: number, state: number, presetId: number, effectId: number, color: number, brightness: number)
+ {
+ super(RoomEngineDimmerStateEvent.ROOM_COLOR, k);
+
+ this._state = state;
+ this._presetId = presetId;
+ this._effectId = effectId;
+ this._color = color;
+ this._brightness = brightness;
+ }
+
+ public get state(): number
+ {
+ return this._state;
+ }
+
+ public get presetId(): number
+ {
+ return this._presetId;
+ }
+
+ public get effectId(): number
+ {
+ return this._effectId;
+ }
+
+ public get color(): number
+ {
+ return this._color;
+ }
+
+ public get brightness(): number
+ {
+ return this._brightness;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineEvent.ts b/submodules/renderer/src/events/room/RoomEngineEvent.ts
new file mode 100644
index 0000000..4d90867
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineEvent.ts
@@ -0,0 +1,26 @@
+import { NitroEvent } from '../core';
+
+export class RoomEngineEvent extends NitroEvent
+{
+ public static INITIALIZED: string = 'REE_INITIALIZED';
+ public static ENGINE_INITIALIZED: string = 'REE_ENGINE_INITIALIZED';
+ public static OBJECTS_INITIALIZED: string = 'REE_OBJECTS_INITIALIZED';
+ public static NORMAL_MODE: string = 'REE_NORMAL_MODE';
+ public static GAME_MODE: string = 'REE_GAME_MODE';
+ public static ROOM_ZOOMED: string = 'REE_ROOM_ZOOMED';
+ public static DISPOSED: string = 'REE_DISPOSED';
+
+ private _roomId: number;
+
+ constructor(type: string, roomId: number)
+ {
+ super(type);
+
+ this._roomId = roomId;
+ }
+
+ public get roomId(): number
+ {
+ return this._roomId;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineObjectEvent.ts b/submodules/renderer/src/events/room/RoomEngineObjectEvent.ts
new file mode 100644
index 0000000..75ff09b
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineObjectEvent.ts
@@ -0,0 +1,39 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomEngineObjectEvent extends RoomEngineEvent
+{
+ public static SELECTED: string = 'REOE_SELECTED';
+ public static DESELECTED: string = 'REOE_DESELECTED';
+ public static ADDED: string = 'REOE_ADDED';
+ public static REMOVED: string = 'REOE_REMOVED';
+ public static PLACED: string = 'REOE_PLACED';
+ public static PLACED_ON_USER: string = 'REOE_PLACED_ON_USER';
+ public static CONTENT_UPDATED: string = 'REOE_CONTENT_UPDATED';
+ public static REQUEST_MOVE: string = 'REOE_REQUEST_MOVE';
+ public static REQUEST_ROTATE: string = 'REOE_REQUEST_ROTATE';
+ public static REQUEST_MANIPULATION: string = 'REOE_REQUEST_MANIPULATION';
+ public static MOUSE_ENTER: string = 'REOE_MOUSE_ENTER';
+ public static MOUSE_LEAVE: string = 'REOE_MOUSE_LEAVE';
+ public static DOUBLE_CLICK: string = 'REOE_DOUBLE_CLICK';
+
+ private _objectId: number;
+ private _category: number;
+
+ constructor(type: string, roomId: number, objectId: number, category: number)
+ {
+ super(type, roomId);
+
+ this._objectId = objectId;
+ this._category = category;
+ }
+
+ public get objectId(): number
+ {
+ return this._objectId;
+ }
+
+ public get category(): number
+ {
+ return this._category;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineObjectPlacedEvent.ts b/submodules/renderer/src/events/room/RoomEngineObjectPlacedEvent.ts
new file mode 100644
index 0000000..cd008df
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineObjectPlacedEvent.ts
@@ -0,0 +1,74 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineObjectPlacedEvent extends RoomEngineObjectEvent
+{
+ private _wallLocation: string = '';
+ private _x: number = 0;
+ private _y: number = 0;
+ private _z: number = 0;
+ private _direction: number = 0;
+ private _placedInRoom: boolean = false;
+ private _placedOnFloor: boolean = false;
+ private _placedOnWall: boolean = false;
+ private _instanceData: string = null;
+
+ constructor(type: string, roomId: number, objectId: number, category: number, wallLocation: string, x: number, y: number, z: number, direction: number, placedInRoom: boolean, placedOnFloor: boolean, placedOnWall: boolean, instanceData: string)
+ {
+ super(type, roomId, objectId, category);
+
+ this._wallLocation = wallLocation;
+ this._x = x;
+ this._y = y;
+ this._z = z;
+ this._direction = direction;
+ this._placedInRoom = placedInRoom;
+ this._placedOnFloor = placedOnFloor;
+ this._placedOnWall = placedOnWall;
+ this._instanceData = instanceData;
+ }
+
+ public get wallLocation(): string
+ {
+ return this._wallLocation;
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+
+ public get z(): number
+ {
+ return this._z;
+ }
+
+ public get direction(): number
+ {
+ return this._direction;
+ }
+
+ public get placedInRoom(): boolean
+ {
+ return this._placedInRoom;
+ }
+
+ public get placedOnFloor(): boolean
+ {
+ return this._placedOnFloor;
+ }
+
+ public get placedOnWall(): boolean
+ {
+ return this._placedOnWall;
+ }
+
+ public get instanceData(): string
+ {
+ return this._instanceData;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineObjectPlacedOnUserEvent.ts b/submodules/renderer/src/events/room/RoomEngineObjectPlacedOnUserEvent.ts
new file mode 100644
index 0000000..0ccb087
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineObjectPlacedOnUserEvent.ts
@@ -0,0 +1,25 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineObjectPlacedOnUserEvent extends RoomEngineObjectEvent
+{
+ private _droppedObjectId: number;
+ private _droppedObjectCategory: number;
+
+ constructor(k: string, roomId: number, objectId: number, category: number, droppedObjectId: number, droppedObjectCategory: number)
+ {
+ super(k, roomId, objectId, category);
+
+ this._droppedObjectId = droppedObjectId;
+ this._droppedObjectCategory = droppedObjectCategory;
+ }
+
+ public get droppedObjectId(): number
+ {
+ return this._droppedObjectId;
+ }
+
+ public get droppedObjectCategory(): number
+ {
+ return this._droppedObjectCategory;
+ }
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/events/room/RoomEngineObjectPlaySoundEvent.ts b/submodules/renderer/src/events/room/RoomEngineObjectPlaySoundEvent.ts
new file mode 100644
index 0000000..c5e39fd
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineObjectPlaySoundEvent.ts
@@ -0,0 +1,28 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineObjectPlaySoundEvent extends RoomEngineObjectEvent
+{
+ public static PLAY_SOUND: string = 'REOPSE_PLAY_SOUND';
+ public static PLAY_SOUND_AT_PITCH: string = 'REOPSE_PLAY_SOUND_AT_PITCH';
+
+ private _soundId: string;
+ private _pitch: number;
+
+ constructor(type: string, roomId: number, objectId: number, objectCategory: number, soundId: string, pitch: number = 1)
+ {
+ super(type, roomId, objectId, objectCategory);
+
+ this._soundId = soundId;
+ this._pitch = pitch;
+ }
+
+ public get soundId(): string
+ {
+ return this._soundId;
+ }
+
+ public get pitch(): number
+ {
+ return this._pitch;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineRoomAdEvent.ts b/submodules/renderer/src/events/room/RoomEngineRoomAdEvent.ts
new file mode 100644
index 0000000..3325373
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineRoomAdEvent.ts
@@ -0,0 +1,9 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineRoomAdEvent extends RoomEngineObjectEvent
+{
+ public static FURNI_CLICK: string = 'RERAE_FURNI_CLICK';
+ public static FURNI_DOUBLE_CLICK: string = 'RERAE_FURNI_DOUBLE_CLICK';
+ public static TOOLTIP_SHOW: string = 'RERAE_TOOLTIP_SHOW';
+ public static TOOLTIP_HIDE: string = 'RERAE_TOOLTIP_HIDE';
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineSamplePlaybackEvent.ts b/submodules/renderer/src/events/room/RoomEngineSamplePlaybackEvent.ts
new file mode 100644
index 0000000..ba4e04e
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineSamplePlaybackEvent.ts
@@ -0,0 +1,30 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineSamplePlaybackEvent extends RoomEngineObjectEvent
+{
+ public static ROOM_OBJECT_INITIALIZED: string = 'ROPSPE_ROOM_OBJECT_INITIALIZED';
+ public static ROOM_OBJECT_DISPOSED: string = 'ROPSPE_ROOM_OBJECT_DISPOSED';
+ public static PLAY_SAMPLE: string = 'ROPSPE_PLAY_SAMPLE';
+ public static CHANGE_PITCH: string = 'ROPSPE_CHANGE_PITCH';
+
+ private _sampleId: number;
+ private _pitch: number;
+
+ constructor(k: string, roomId: number, objectId: number, objectCategory: number, sampleId: number, pitch: number = 1)
+ {
+ super(k, roomId, objectId, objectCategory);
+
+ this._sampleId = sampleId;
+ this._pitch = pitch;
+ }
+
+ public get sampleId(): number
+ {
+ return this._sampleId;
+ }
+
+ public get pitch(): number
+ {
+ return this._pitch;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineTriggerWidgetEvent.ts b/submodules/renderer/src/events/room/RoomEngineTriggerWidgetEvent.ts
new file mode 100644
index 0000000..ba1c8cb
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineTriggerWidgetEvent.ts
@@ -0,0 +1,58 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineTriggerWidgetEvent extends RoomEngineObjectEvent
+{
+ public static OPEN_WIDGET: string = 'RETWE_OPEN_WIDGET';
+ public static CLOSE_WIDGET: string = 'RETWE_CLOSE_WIDGET';
+ public static OPEN_FURNI_CONTEXT_MENU: string = 'RETWE_OPEN_FURNI_CONTEXT_MENU';
+ public static CLOSE_FURNI_CONTEXT_MENU: string = 'RETWE_CLOSE_FURNI_CONTEXT_MENU';
+ public static REQUEST_PLACEHOLDER: string = 'RETWE_REQUEST_PLACEHOLDER';
+ public static REQUEST_CREDITFURNI: string = 'RETWE_REQUEST_CREDITFURNI';
+ public static REQUEST_STACK_HEIGHT: string = 'RETWE_REQUEST_STACK_HEIGHT';
+ public static REQUEST_EXTERNAL_IMAGE: string = 'RETWE_REQUEST_EXTERNAL_IMAGE';
+ public static REQUEST_STICKIE: string = 'RETWE_REQUEST_STICKIE';
+ public static REQUEST_PRESENT: string = 'RETWE_REQUEST_PRESENT';
+ public static REQUEST_TROPHY: string = 'RETWE_REQUEST_TROPHY';
+ public static REQUEST_TEASER: string = 'RETWE_REQUEST_TEASER';
+ public static REQUEST_ECOTRONBOX: string = 'RETWE_REQUEST_ECOTRONBOX';
+ public static REQUEST_DIMMER: string = 'RETWE_REQUEST_DIMMER';
+ public static REMOVE_DIMMER: string = 'RETWE_REMOVE_DIMMER';
+ public static REQUEST_CLOTHING_CHANGE: string = 'RETWE_REQUEST_CLOTHING_CHANGE';
+ public static REQUEST_PLAYLIST_EDITOR: string = 'RETWE_REQUEST_PLAYLIST_EDITOR';
+ public static REQUEST_MANNEQUIN: string = 'RETWE_REQUEST_MANNEQUIN';
+ public static REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: string = 'ROWRE_REQUEST_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG';
+ public static REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: string = 'ROWRE_REQUEST_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG';
+ public static REQUEST_BACKGROUND_COLOR: string = 'RETWE_REQUEST_BACKGROUND_COLOR';
+ public static REQUEST_MYSTERYBOX_OPEN_DIALOG: string = 'RETWE_REQUEST_MYSTERYBOX_OPEN_DIALOG';
+ public static REQUEST_EFFECTBOX_OPEN_DIALOG: string = 'RETWE_REQUEST_EFFECTBOX_OPEN_DIALOG';
+ public static REQUEST_MYSTERYTROPHY_OPEN_DIALOG: string = 'RETWE_REQUEST_MYSTERYTROPHY_OPEN_DIALOG';
+ public static REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'RETWE_REQUEST_ACHIEVEMENT_RESOLUTION_ENGRAVING';
+ public static REQUEST_ACHIEVEMENT_RESOLUTION_FAILED: string = 'RETWE_REQUEST_ACHIEVEMENT_RESOLUTION_FAILED';
+ public static REQUEST_FRIEND_FURNITURE_CONFIRM: string = 'RETWE_REQUEST_FRIEND_FURNITURE_CONFIRM';
+ public static REQUEST_FRIEND_FURNITURE_ENGRAVING: string = 'RETWE_REQUEST_FRIEND_FURNITURE_ENGRAVING';
+ public static REQUEST_BADGE_DISPLAY_ENGRAVING: string = 'RETWE_REQUEST_BADGE_DISPLAY_ENGRAVING';
+ public static REQUEST_HIGH_SCORE_DISPLAY: string = 'RETWE_REQUEST_HIGH_SCORE_DISPLAY';
+ public static REQUEST_HIDE_HIGH_SCORE_DISPLAY: string = 'RETWE_REQUEST_HIDE_HIGH_SCORE_DISPLAY';
+ public static REQUEST_INTERNAL_LINK: string = 'RETWE_REQUEST_INTERNAL_LINK';
+ public static REQUEST_ROOM_LINK: string = 'RETWE_REQUEST_ROOM_LINK';
+ public static REQUEST_YOUTUBE: string = 'RETWE_REQUEST_YOUTUBE';
+
+ private _widget: string;
+
+ constructor(type: string, roomId: number, objectId: number, category: number, widget: string = null)
+ {
+ super(type, roomId, objectId, category);
+
+ this._widget = widget;
+ }
+
+ public get widget(): string
+ {
+ return this._widget;
+ }
+
+ public get contextMenu(): string
+ {
+ return this._widget;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomEngineUseProductEvent.ts b/submodules/renderer/src/events/room/RoomEngineUseProductEvent.ts
new file mode 100644
index 0000000..c8e78aa
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomEngineUseProductEvent.ts
@@ -0,0 +1,28 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomEngineUseProductEvent extends RoomEngineObjectEvent
+{
+ public static USE_PRODUCT_FROM_ROOM: string = 'REUPE_USE_PRODUCT_FROM_ROOM';
+ public static USE_PRODUCT_FROM_INVENTORY: string = 'REUPE_USE_PRODUCT_FROM_INVENTORY';
+
+ private _inventoryStripId: number;
+ private _furnitureTypeId: number;
+
+ constructor(type: string, roomId: number, objectId: number, category: number, inventoryStripId = -1, furnitureTypeId = -1)
+ {
+ super(type, roomId, objectId, category);
+
+ this._inventoryStripId = inventoryStripId;
+ this._furnitureTypeId = furnitureTypeId;
+ }
+
+ public get inventoryStripId(): number
+ {
+ return this._inventoryStripId;
+ }
+
+ public get furnitureTypeId(): number
+ {
+ return this._furnitureTypeId;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectBadgeAssetEvent.ts b/submodules/renderer/src/events/room/RoomObjectBadgeAssetEvent.ts
new file mode 100644
index 0000000..f3c72c7
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectBadgeAssetEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectBadgeAssetEvent extends RoomObjectEvent
+{
+ public static LOAD_BADGE: string = 'ROBAE_LOAD_BADGE';
+
+ private _badgeId: string;
+ private _groupBadge: boolean;
+
+ constructor(k: string, _arg_2: IRoomObject, badgeId: string, groupBadge: boolean = true)
+ {
+ super(k, _arg_2);
+
+ this._badgeId = badgeId;
+ this._groupBadge = groupBadge;
+ }
+
+ public get badgeId(): string
+ {
+ return this._badgeId;
+ }
+
+ public get groupBadge(): boolean
+ {
+ return this._groupBadge;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectDataRequestEvent.ts b/submodules/renderer/src/events/room/RoomObjectDataRequestEvent.ts
new file mode 100644
index 0000000..96ace98
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectDataRequestEvent.ts
@@ -0,0 +1,13 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectDataRequestEvent extends RoomObjectEvent
+{
+ public static RODRE_CURRENT_USER_ID: string = 'RODRE_CURRENT_USER_ID';
+ public static RODRE_URL_PREFIX: string = 'RODRE_URL_PREFIX';
+
+ constructor(type: string, object: IRoomObject)
+ {
+ super(type, object);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectDimmerStateUpdateEvent.ts b/submodules/renderer/src/events/room/RoomObjectDimmerStateUpdateEvent.ts
new file mode 100644
index 0000000..2ef3d49
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectDimmerStateUpdateEvent.ts
@@ -0,0 +1,49 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectDimmerStateUpdateEvent extends RoomObjectEvent
+{
+ public static DIMMER_STATE: string = 'RODSUE_DIMMER_STATE';
+
+ private _state: number;
+ private _presetId: number;
+ private _effectId: number;
+ private _color: number;
+ private _brightness: number;
+
+ constructor(object: IRoomObject, state: number, presetId: number, effectId: number, color: number, brightness: number)
+ {
+ super(RoomObjectDimmerStateUpdateEvent.DIMMER_STATE, object);
+
+ this._state = state;
+ this._presetId = presetId;
+ this._effectId = effectId;
+ this._color = color;
+ this._brightness = brightness;
+ }
+
+ public get state(): number
+ {
+ return this._state;
+ }
+
+ public get presetId(): number
+ {
+ return this._presetId;
+ }
+
+ public get effectId(): number
+ {
+ return this._effectId;
+ }
+
+ public get color(): number
+ {
+ return this._color;
+ }
+
+ public get brightness(): number
+ {
+ return this._brightness;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectEvent.ts b/submodules/renderer/src/events/room/RoomObjectEvent.ts
new file mode 100644
index 0000000..954f0a9
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectEvent.ts
@@ -0,0 +1,33 @@
+import { IRoomObject } from '../../api';
+import { NitroEvent } from '../../events';
+
+export class RoomObjectEvent extends NitroEvent
+{
+ private _object: IRoomObject;
+
+ constructor(type: string, object: IRoomObject)
+ {
+ super(type);
+
+ this._object = object;
+ }
+
+ public get object(): IRoomObject
+ {
+ return this._object;
+ }
+
+ public get objectId(): number
+ {
+ if(!this._object) return -1;
+
+ return this._object.id;
+ }
+
+ public get objectType(): string
+ {
+ if(!this._object) return null;
+
+ return this._object.type;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectFloorHoleEvent.ts b/submodules/renderer/src/events/room/RoomObjectFloorHoleEvent.ts
new file mode 100644
index 0000000..965077f
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectFloorHoleEvent.ts
@@ -0,0 +1,13 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectFloorHoleEvent extends RoomObjectEvent
+{
+ public static ADD_HOLE: string = 'ROFHO_ADD_HOLE';
+ public static REMOVE_HOLE: string = 'ROFHO_REMOVE_HOLE';
+
+ constructor(k: string, _arg_2: IRoomObject)
+ {
+ super(k, _arg_2);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectFurnitureActionEvent.ts b/submodules/renderer/src/events/room/RoomObjectFurnitureActionEvent.ts
new file mode 100644
index 0000000..f338e8a
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectFurnitureActionEvent.ts
@@ -0,0 +1,20 @@
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectFurnitureActionEvent extends RoomObjectEvent
+{
+ public static DICE_OFF: string = 'ROFCAE_DICE_OFF';
+ public static DICE_ACTIVATE: string = 'ROFCAE_DICE_ACTIVATE';
+ public static USE_HABBOWHEEL: string = 'ROFCAE_USE_HABBOWHEEL';
+ public static STICKIE: string = 'ROFCAE_STICKIE';
+ public static ENTER_ONEWAYDOOR: string = 'ROFCAE_ENTER_ONEWAYDOOR';
+ public static SOUND_MACHINE_INIT: string = 'ROFCAE_SOUND_MACHINE_INIT';
+ public static SOUND_MACHINE_START: string = 'ROFCAE_SOUND_MACHINE_START';
+ public static SOUND_MACHINE_STOP: string = 'ROFCAE_SOUND_MACHINE_STOP';
+ public static SOUND_MACHINE_DISPOSE: string = 'ROFCAE_SOUND_MACHINE_DISPOSE';
+ public static JUKEBOX_INIT: string = 'ROFCAE_JUKEBOX_INIT';
+ public static JUKEBOX_START: string = 'ROFCAE_JUKEBOX_START';
+ public static JUKEBOX_MACHINE_STOP: string = 'ROFCAE_JUKEBOX_MACHINE_STOP';
+ public static JUKEBOX_DISPOSE: string = 'ROFCAE_JUKEBOX_DISPOSE';
+ public static MOUSE_BUTTON: string = 'ROFCAE_MOUSE_BUTTON';
+ public static MOUSE_ARROW: string = 'ROFCAE_MOUSE_ARROW';
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectHSLColorEnableEvent.ts b/submodules/renderer/src/events/room/RoomObjectHSLColorEnableEvent.ts
new file mode 100644
index 0000000..d28d550
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectHSLColorEnableEvent.ts
@@ -0,0 +1,42 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectHSLColorEnableEvent extends RoomObjectEvent
+{
+ public static ROOM_BACKGROUND_COLOR: string = 'ROHSLCEE_ROOM_BACKGROUND_COLOR';
+
+ private _enable: boolean;
+ private _hue: number;
+ private _saturation: number;
+ private _lightness: number;
+
+ constructor(k: string, _arg_2: IRoomObject, _arg_3: boolean, _arg_4: number, _arg_5: number, _arg_6: number)
+ {
+ super(k, _arg_2);
+
+ this._enable = _arg_3;
+ this._hue = _arg_4;
+ this._saturation = _arg_5;
+ this._lightness = _arg_6;
+ }
+
+ public get enable(): boolean
+ {
+ return this._enable;
+ }
+
+ public get hue(): number
+ {
+ return this._hue;
+ }
+
+ public get saturation(): number
+ {
+ return this._saturation;
+ }
+
+ public get lightness(): number
+ {
+ return this._lightness;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectHSLColorEnabledEvent.ts b/submodules/renderer/src/events/room/RoomObjectHSLColorEnabledEvent.ts
new file mode 100644
index 0000000..b4a3f9e
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectHSLColorEnabledEvent.ts
@@ -0,0 +1,41 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomObjectHSLColorEnabledEvent extends RoomEngineEvent
+{
+ public static ROOM_BACKGROUND_COLOR: string = 'ROHSLCEE_ROOM_BACKGROUND_COLOR';
+
+ private _enable: boolean;
+ private _hue: number;
+ private _saturation: number;
+ private _lightness: number;
+
+ constructor(k: string, _arg_2: number, _arg_3: boolean, _arg_4: number, _arg_5: number, _arg_6: number)
+ {
+ super(k, _arg_2);
+
+ this._enable = _arg_3;
+ this._hue = _arg_4;
+ this._saturation = _arg_5;
+ this._lightness = _arg_6;
+ }
+
+ public get enable(): boolean
+ {
+ return this._enable;
+ }
+
+ public get hue(): number
+ {
+ return this._hue;
+ }
+
+ public get saturation(): number
+ {
+ return this._saturation;
+ }
+
+ public get lightness(): number
+ {
+ return this._lightness;
+ }
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/events/room/RoomObjectMouseEvent.ts b/submodules/renderer/src/events/room/RoomObjectMouseEvent.ts
new file mode 100644
index 0000000..21ceef8
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectMouseEvent.ts
@@ -0,0 +1,100 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectMouseEvent extends RoomObjectEvent
+{
+ public static CLICK: string = 'ROE_MOUSE_CLICK';
+ public static DOUBLE_CLICK: string = 'ROE_MOUSE_DOUBLE_CLICK';
+ public static MOUSE_MOVE: string = 'ROE_MOUSE_MOVE';
+ public static MOUSE_DOWN: string = 'ROE_MOUSE_DOWN';
+ public static MOUSE_DOWN_LONG: string = 'ROE_MOUSE_DOWN_LONG';
+ public static MOUSE_UP: string = 'ROE_MOUSE_UP';
+ public static MOUSE_ENTER: string = 'ROE_MOUSE_ENTER';
+ public static MOUSE_LEAVE: string = 'ROE_MOUSE_LEAVE';
+
+ private _eventId: string = '';
+ private _altKey: boolean;
+ private _ctrlKey: boolean;
+ private _shiftKey: boolean;
+ private _buttonDown: boolean;
+ private _localX: number;
+ private _localY: number;
+ private _spriteOffsetX: number;
+ private _spriteOffsetY: number;
+
+ constructor(type: string, object: IRoomObject, eventId: string, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false, buttonDown: boolean = false)
+ {
+ super(type, object);
+
+ this._eventId = eventId;
+ this._altKey = altKey;
+ this._ctrlKey = ctrlKey;
+ this._shiftKey = shiftKey;
+ this._buttonDown = buttonDown;
+ }
+
+ public get eventId(): string
+ {
+ return this._eventId;
+ }
+
+ public get altKey(): boolean
+ {
+ return this._altKey;
+ }
+
+ public get ctrlKey(): boolean
+ {
+ return this._ctrlKey;
+ }
+
+ public get shiftKey(): boolean
+ {
+ return this._shiftKey;
+ }
+
+ public get buttonDown(): boolean
+ {
+ return this._buttonDown;
+ }
+
+ public get localX(): number
+ {
+ return this._localX;
+ }
+
+ public set localX(k: number)
+ {
+ this._localX = k;
+ }
+
+ public get localY(): number
+ {
+ return this._localY;
+ }
+
+ public set localY(k: number)
+ {
+ this._localY = k;
+ }
+
+ public get spriteOffsetX(): number
+ {
+ return this._spriteOffsetX;
+ }
+
+ public set spriteOffsetX(k: number)
+ {
+ this._spriteOffsetX = k;
+ }
+
+ public get spriteOffsetY(): number
+ {
+ return this._spriteOffsetY;
+ }
+
+ public set spriteOffsetY(k: number)
+ {
+ this._spriteOffsetY = k;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectMoveEvent.ts b/submodules/renderer/src/events/room/RoomObjectMoveEvent.ts
new file mode 100644
index 0000000..9c994fe
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectMoveEvent.ts
@@ -0,0 +1,13 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectMoveEvent extends RoomObjectEvent
+{
+ public static POSITION_CHANGED: string = 'ROME_POSITION_CHANGED';
+ public static OBJECT_REMOVED: string = 'ROME_OBJECT_REMOVED';
+
+ constructor(k: string, _arg_2: IRoomObject)
+ {
+ super(k, _arg_2);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectPlaySoundIdEvent.ts b/submodules/renderer/src/events/room/RoomObjectPlaySoundIdEvent.ts
new file mode 100644
index 0000000..315b983
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectPlaySoundIdEvent.ts
@@ -0,0 +1,29 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectFurnitureActionEvent } from './RoomObjectFurnitureActionEvent';
+
+export class RoomObjectPlaySoundIdEvent extends RoomObjectFurnitureActionEvent
+{
+ public static PLAY_SOUND: string = 'ROPSIE_PLAY_SOUND';
+ public static PLAY_SOUND_AT_PITCH: string = 'ROPSIE_PLAY_SOUND_AT_PITCH';
+
+ private _soundId: string;
+ private _pitch: number;
+
+ constructor(type: string, object: IRoomObject, soundId: string, pitch: number = 1)
+ {
+ super(type, object);
+
+ this._soundId = soundId;
+ this._pitch = pitch;
+ }
+
+ public get soundId(): string
+ {
+ return this._soundId;
+ }
+
+ public get pitch(): number
+ {
+ return this._pitch;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectRoomAdEvent.ts b/submodules/renderer/src/events/room/RoomObjectRoomAdEvent.ts
new file mode 100644
index 0000000..259e5e3
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectRoomAdEvent.ts
@@ -0,0 +1,32 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectRoomAdEvent extends RoomObjectEvent
+{
+ public static ROOM_AD_LOAD_IMAGE: string = 'RORAE_ROOM_AD_LOAD_IMAGE';
+ public static ROOM_AD_FURNI_CLICK: string = 'RORAE_ROOM_AD_FURNI_CLICK';
+ public static ROOM_AD_FURNI_DOUBLE_CLICK: string = 'RORAE_ROOM_AD_FURNI_DOUBLE_CLICK';
+ public static ROOM_AD_TOOLTIP_SHOW: string = 'RORAE_ROOM_AD_TOOLTIP_SHOW';
+ public static ROOM_AD_TOOLTIP_HIDE: string = 'RORAE_ROOM_AD_TOOLTIP_HIDE';
+
+ private _imageUrl: string = '';
+ private _clickUrl: string = '';
+
+ constructor(type: string, object: IRoomObject, imageUrl: string = '', clickUrl: string = '')
+ {
+ super(type, object);
+
+ this._imageUrl = imageUrl;
+ this._clickUrl = clickUrl;
+ }
+
+ public get imageUrl(): string
+ {
+ return this._imageUrl;
+ }
+
+ public get clickUrl(): string
+ {
+ return this._clickUrl;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectSamplePlaybackEvent.ts b/submodules/renderer/src/events/room/RoomObjectSamplePlaybackEvent.ts
new file mode 100644
index 0000000..43bf3b6
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectSamplePlaybackEvent.ts
@@ -0,0 +1,31 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectSamplePlaybackEvent extends RoomObjectEvent
+{
+ public static ROOM_OBJECT_INITIALIZED: string = 'ROPSPE_ROOM_OBJECT_INITIALIZED';
+ public static ROOM_OBJECT_DISPOSED: string = 'ROPSPE_ROOM_OBJECT_DISPOSED';
+ public static PLAY_SAMPLE: string = 'ROPSPE_PLAY_SAMPLE';
+ public static CHANGE_PITCH: string = 'ROPSPE_CHANGE_PITCH';
+
+ private _sampleId: number;
+ private _pitch: number;
+
+ constructor(k: string, object: IRoomObject, sampleId: number, pitch: number = 1)
+ {
+ super(k, object);
+
+ this._sampleId = sampleId;
+ this._pitch = pitch;
+ }
+
+ public get sampleId(): number
+ {
+ return this._sampleId;
+ }
+
+ public get pitch(): number
+ {
+ return this._pitch;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectSoundMachineEvent.ts b/submodules/renderer/src/events/room/RoomObjectSoundMachineEvent.ts
new file mode 100644
index 0000000..9576f1e
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectSoundMachineEvent.ts
@@ -0,0 +1,13 @@
+import { RoomEngineObjectEvent } from './RoomEngineObjectEvent';
+
+export class RoomObjectSoundMachineEvent extends RoomEngineObjectEvent
+{
+ public static SOUND_MACHINE_INIT: string = 'ROSM_SOUND_MACHINE_INIT';
+ public static SOUND_MACHINE_SWITCHED_ON: string = 'ROSM_SOUND_MACHINE_SWITCHED_ON';
+ public static SOUND_MACHINE_SWITCHED_OFF: string = 'ROSM_SOUND_MACHINE_SWITCHED_OFF';
+ public static SOUND_MACHINE_DISPOSE: string = 'ROSM_SOUND_MACHINE_DISPOSE';
+ public static JUKEBOX_INIT: string = 'ROSM_JUKEBOX_INIT';
+ public static JUKEBOX_SWITCHED_ON: string = 'ROSM_JUKEBOX_SWITCHED_ON';
+ public static JUKEBOX_SWITCHED_OFF: string = 'ROSM_JUKEBOX_SWITCHED_OFF';
+ public static JUKEBOX_DISPOSE: string = 'ROSM_JUKEBOX_DISPOSE';
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectStateChangedEvent.ts b/submodules/renderer/src/events/room/RoomObjectStateChangedEvent.ts
new file mode 100644
index 0000000..f9e7d36
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectStateChangedEvent.ts
@@ -0,0 +1,22 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectStateChangedEvent extends RoomObjectEvent
+{
+ public static STATE_CHANGE: string = 'ROSCE_STATE_CHANGE';
+ public static STATE_RANDOM: string = 'ROSCE_STATE_RANDOM';
+
+ private _state: number;
+
+ constructor(type: string, object: IRoomObject, state: number = 0)
+ {
+ super(type, object);
+
+ this._state = state;
+ }
+
+ public get state(): number
+ {
+ return this._state;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectTileMouseEvent.ts b/submodules/renderer/src/events/room/RoomObjectTileMouseEvent.ts
new file mode 100644
index 0000000..f9641fc
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectTileMouseEvent.ts
@@ -0,0 +1,48 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectMouseEvent } from './RoomObjectMouseEvent';
+
+export class RoomObjectTileMouseEvent extends RoomObjectMouseEvent
+{
+ private _tileX: number;
+ private _tileY: number;
+ private _tileZ: number;
+
+ constructor(type: string, object: IRoomObject, eventId: string, tileX: number, tileY: number, tileZ: number, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false, buttonDown: boolean = false)
+ {
+ super(type, object, eventId, altKey, ctrlKey, shiftKey, buttonDown);
+
+ this._tileX = tileX;
+ this._tileY = tileY;
+ this._tileZ = tileZ;
+ }
+
+ public get tileX(): number
+ {
+ return this._tileX;
+ }
+
+ public get tileY(): number
+ {
+ return this._tileY;
+ }
+
+ public get tileZ(): number
+ {
+ return this._tileZ;
+ }
+
+ public get tileXAsInt(): number
+ {
+ return Math.trunc(this._tileX + 0.499);
+ }
+
+ public get tileYAsInt(): number
+ {
+ return Math.trunc(this._tileY + 0.499);
+ }
+
+ public get tileZAsInt(): number
+ {
+ return Math.trunc(this._tileZ + 0.499);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectWallMouseEvent.ts b/submodules/renderer/src/events/room/RoomObjectWallMouseEvent.ts
new file mode 100644
index 0000000..e139e1a
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectWallMouseEvent.ts
@@ -0,0 +1,59 @@
+import { IRoomObject, IVector3D, Vector3d } from '../../api';
+import { RoomObjectMouseEvent } from './RoomObjectMouseEvent';
+
+export class RoomObjectWallMouseEvent extends RoomObjectMouseEvent
+{
+ private _wallLocation: IVector3D;
+ private _wallWd: IVector3D;
+ private _wallHt: IVector3D;
+ private _x: number;
+ private _y: number;
+ private _direction: number;
+
+ constructor(type: string, object: IRoomObject, eventId: string, wallLocation: IVector3D, wallWidth: IVector3D, wallHeight: IVector3D, x: number, y: number, direction: number, altKey: boolean = false, ctrlKey: boolean = false, shiftKey: boolean = false, buttonDown: boolean = false)
+ {
+ super(type, object, eventId, altKey, ctrlKey, shiftKey, buttonDown);
+
+ this._wallLocation = new Vector3d();
+ this._wallWd = new Vector3d();
+ this._wallHt = new Vector3d();
+
+ this._wallLocation.assign(wallLocation);
+ this._wallWd.assign(wallWidth);
+ this._wallHt.assign(wallHeight);
+
+ this._x = x;
+ this._y = y;
+ this._direction = direction;
+ }
+
+ public get wallLocation(): IVector3D
+ {
+ return this._wallLocation;
+ }
+
+ public get wallWidth(): IVector3D
+ {
+ return this._wallWd;
+ }
+
+ public get wallHeight(): IVector3D
+ {
+ return this._wallHt;
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+
+ public get direction(): number
+ {
+ return this._direction;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomObjectWidgetRequestEvent.ts b/submodules/renderer/src/events/room/RoomObjectWidgetRequestEvent.ts
new file mode 100644
index 0000000..d058e0c
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomObjectWidgetRequestEvent.ts
@@ -0,0 +1,48 @@
+import { IRoomObject } from '../../api';
+import { RoomObjectEvent } from './RoomObjectEvent';
+
+export class RoomObjectWidgetRequestEvent extends RoomObjectEvent
+{
+ public static OPEN_WIDGET: string = 'ROWRE_OPEN_WIDGET';
+ public static CLOSE_WIDGET: string = 'ROWRE_CLOSE_WIDGET';
+ public static OPEN_FURNI_CONTEXT_MENU: string = 'ROWRE_OPEN_FURNI_CONTEXT_MENU';
+ public static CLOSE_FURNI_CONTEXT_MENU: string = 'ROWRE_CLOSE_FURNI_CONTEXT_MENU';
+ public static PLACEHOLDER: string = 'ROWRE_PLACEHOLDER';
+ public static CREDITFURNI: string = 'ROWRE_CREDITFURNI';
+ public static STACK_HEIGHT: string = 'ROWRE_STACK_HEIGHT';
+ public static EXTERNAL_IMAGE: string = 'ROWRE_EXTERNAL_IMAGE';
+ public static STICKIE: string = 'ROWRE_STICKIE';
+ public static PRESENT: string = 'ROWRE_PRESENT';
+ public static TROPHY: string = 'ROWRE_TROPHY';
+ public static TEASER: string = 'ROWRE_TEASER';
+ public static ECOTRONBOX: string = 'ROWRE_ECOTRONBOX';
+ public static DIMMER: string = 'ROWRE_DIMMER';
+ public static WIDGET_REMOVE_DIMMER: string = 'ROWRE_WIDGET_REMOVE_DIMMER';
+ public static CLOTHING_CHANGE: string = 'ROWRE_CLOTHING_CHANGE';
+ public static JUKEBOX_PLAYLIST_EDITOR: string = 'ROWRE_JUKEBOX_PLAYLIST_EDITOR';
+ public static MANNEQUIN: string = 'ROWRE_MANNEQUIN';
+ public static PET_PRODUCT_MENU: string = 'ROWRE_PET_PRODUCT_MENU';
+ public static GUILD_FURNI_CONTEXT_MENU: string = 'ROWRE_GUILD_FURNI_CONTEXT_MENU';
+ public static MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG: string = 'ROWRE_MONSTERPLANT_SEED_PLANT_CONFIRMATION_DIALOG';
+ public static PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG: string = 'ROWRE_PURCHASABLE_CLOTHING_CONFIRMATION_DIALOG';
+ public static BACKGROUND_COLOR: string = 'ROWRE_BACKGROUND_COLOR';
+ public static MYSTERYBOX_OPEN_DIALOG: string = 'ROWRE_MYSTERYBOX_OPEN_DIALOG';
+ public static EFFECTBOX_OPEN_DIALOG: string = 'ROWRE_EFFECTBOX_OPEN_DIALOG';
+ public static MYSTERYTROPHY_OPEN_DIALOG: string = 'ROWRE_MYSTERYTROPHY_OPEN_DIALOG';
+ public static ACHIEVEMENT_RESOLUTION_OPEN: string = 'ROWRE_ACHIEVEMENT_RESOLUTION_OPEN';
+ public static ACHIEVEMENT_RESOLUTION_ENGRAVING: string = 'ROWRE_ACHIEVEMENT_RESOLUTION_ENGRAVING';
+ public static ACHIEVEMENT_RESOLUTION_FAILED: string = 'ROWRE_ACHIEVEMENT_RESOLUTION_FAILED';
+ public static FRIEND_FURNITURE_CONFIRM: string = 'ROWRE_FRIEND_FURNITURE_CONFIRM';
+ public static FRIEND_FURNITURE_ENGRAVING: string = 'ROWRE_FRIEND_FURNITURE_ENGRAVING';
+ public static BADGE_DISPLAY_ENGRAVING: string = 'ROWRE_BADGE_DISPLAY_ENGRAVING';
+ public static HIGH_SCORE_DISPLAY: string = 'ROWRE_HIGH_SCORE_DISPLAY';
+ public static HIDE_HIGH_SCORE_DISPLAY: string = 'ROWRE_HIDE_HIGH_SCORE_DISPLAY';
+ public static INERNAL_LINK: string = 'ROWRE_INTERNAL_LINK';
+ public static ROOM_LINK: string = 'ROWRE_ROOM_LINK';
+ public static YOUTUBE: string = 'ROWRE_YOUTUBE';
+
+ constructor(type: string, roomObject: IRoomObject)
+ {
+ super(type, roomObject);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomSpriteMouseEvent.ts b/submodules/renderer/src/events/room/RoomSpriteMouseEvent.ts
new file mode 100644
index 0000000..2edd522
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomSpriteMouseEvent.ts
@@ -0,0 +1,117 @@
+import { IRoomSpriteMouseEvent } from '../../api';
+
+export class RoomSpriteMouseEvent implements IRoomSpriteMouseEvent
+{
+ private _type: string;
+ private _eventId: string;
+ private _canvasId: string;
+ private _spriteTag: string;
+ private _screenX: number;
+ private _screenY: number;
+ private _localX: number;
+ private _localY: number;
+ private _ctrlKey: boolean;
+ private _altKey: boolean;
+ private _shiftKey: boolean;
+ private _buttonDown: boolean;
+ private _spriteOffsetX: number;
+ private _spriteOffsetY: number;
+
+ constructor(type: string, eventId: string, canvasId: string, spriteTag: string, screenX: number, screenY: number, localX: number = 0, localY: number = 0, ctrlKey: boolean = false, altKey: boolean = false, shiftKey: boolean = false, buttonDown: boolean = false)
+ {
+ this._type = type;
+ this._eventId = eventId;
+ this._canvasId = canvasId;
+ this._spriteTag = spriteTag;
+ this._screenX = screenX;
+ this._screenY = screenY;
+ this._localX = localX;
+ this._localY = localY;
+ this._ctrlKey = ctrlKey;
+ this._altKey = altKey;
+ this._shiftKey = shiftKey;
+ this._buttonDown = buttonDown;
+ this._spriteOffsetX = 0;
+ this._spriteOffsetY = 0;
+ }
+
+ public get type(): string
+ {
+ return this._type;
+ }
+
+ public get eventId(): string
+ {
+ return this._eventId;
+ }
+
+ public get canvasId(): string
+ {
+ return this._canvasId;
+ }
+
+ public get spriteTag(): string
+ {
+ return this._spriteTag;
+ }
+
+ public get screenX(): number
+ {
+ return this._screenX;
+ }
+
+ public get screenY(): number
+ {
+ return this._screenY;
+ }
+
+ public get localX(): number
+ {
+ return this._localX;
+ }
+
+ public get localY(): number
+ {
+ return this._localY;
+ }
+
+ public get ctrlKey(): boolean
+ {
+ return this._ctrlKey;
+ }
+
+ public get altKey(): boolean
+ {
+ return this._altKey;
+ }
+
+ public get shiftKey(): boolean
+ {
+ return this._shiftKey;
+ }
+
+ public get buttonDown(): boolean
+ {
+ return this._buttonDown;
+ }
+
+ public get spriteOffsetX(): number
+ {
+ return this._spriteOffsetX;
+ }
+
+ public set spriteOffsetX(k: number)
+ {
+ this._spriteOffsetX = k;
+ }
+
+ public get spriteOffsetY(): number
+ {
+ return this._spriteOffsetY;
+ }
+
+ public set spriteOffsetY(k: number)
+ {
+ this._spriteOffsetY = k;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomToObjectEvent.ts b/submodules/renderer/src/events/room/RoomToObjectEvent.ts
new file mode 100644
index 0000000..fbd5c53
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomToObjectEvent.ts
@@ -0,0 +1,9 @@
+import { NitroEvent } from '../core';
+
+export class RoomToObjectEvent extends NitroEvent
+{
+ public constructor(type: string)
+ {
+ super(type);
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomToObjectOwnAvatarMoveEvent.ts b/submodules/renderer/src/events/room/RoomToObjectOwnAvatarMoveEvent.ts
new file mode 100644
index 0000000..878ef2c
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomToObjectOwnAvatarMoveEvent.ts
@@ -0,0 +1,21 @@
+import { IVector3D } from '../../api';
+import { RoomToObjectEvent } from './RoomToObjectEvent';
+
+export class RoomToObjectOwnAvatarMoveEvent extends RoomToObjectEvent
+{
+ public static ROAME_MOVE_TO: string = 'ROAME_MOVE_TO';
+
+ private _targetLocation: IVector3D;
+
+ constructor(type: string, targetLocation: IVector3D)
+ {
+ super(type);
+
+ this._targetLocation = targetLocation;
+ }
+
+ public get targetLocation(): IVector3D
+ {
+ return this._targetLocation;
+ }
+}
diff --git a/submodules/renderer/src/events/room/RoomZoomEvent.ts b/submodules/renderer/src/events/room/RoomZoomEvent.ts
new file mode 100644
index 0000000..1119774
--- /dev/null
+++ b/submodules/renderer/src/events/room/RoomZoomEvent.ts
@@ -0,0 +1,34 @@
+import { RoomEngineEvent } from './RoomEngineEvent';
+
+export class RoomZoomEvent extends RoomEngineEvent
+{
+ public static ROOM_ZOOM: string = 'REE_ROOM_ZOOM';
+
+ private _level: number;
+ private _forceFlip: boolean;
+ private _asDelta: boolean;
+
+ constructor(roomId: number, level: number, forceFlip: boolean = false, asDelta: boolean = false)
+ {
+ super(RoomZoomEvent.ROOM_ZOOM, roomId);
+
+ this._level = level;
+ this._forceFlip = forceFlip;
+ this._asDelta = asDelta;
+ }
+
+ public get level(): number
+ {
+ return this._level;
+ }
+
+ public get forceFlip(): boolean
+ {
+ return this._forceFlip;
+ }
+
+ public get asDelta(): boolean
+ {
+ return this._asDelta;
+ }
+}
\ No newline at end of file
diff --git a/submodules/renderer/src/events/room/index.ts b/submodules/renderer/src/events/room/index.ts
new file mode 100644
index 0000000..51b6bed
--- /dev/null
+++ b/submodules/renderer/src/events/room/index.ts
@@ -0,0 +1,35 @@
+export * from './RoomBackgroundColorEvent';
+export * from './RoomContentLoadedEvent';
+export * from './RoomDragEvent';
+export * from './RoomEngineDimmerStateEvent';
+export * from './RoomEngineEvent';
+export * from './RoomEngineObjectEvent';
+export * from './RoomEngineObjectPlacedEvent';
+export * from './RoomEngineObjectPlacedOnUserEvent';
+export * from './RoomEngineObjectPlaySoundEvent';
+export * from './RoomEngineRoomAdEvent';
+export * from './RoomEngineSamplePlaybackEvent';
+export * from './RoomEngineTriggerWidgetEvent';
+export * from './RoomEngineUseProductEvent';
+export * from './RoomObjectBadgeAssetEvent';
+export * from './RoomObjectDataRequestEvent';
+export * from './RoomObjectDimmerStateUpdateEvent';
+export * from './RoomObjectEvent';
+export * from './RoomObjectFloorHoleEvent';
+export * from './RoomObjectFurnitureActionEvent';
+export * from './RoomObjectHSLColorEnabledEvent';
+export * from './RoomObjectHSLColorEnableEvent';
+export * from './RoomObjectMouseEvent';
+export * from './RoomObjectMoveEvent';
+export * from './RoomObjectPlaySoundIdEvent';
+export * from './RoomObjectRoomAdEvent';
+export * from './RoomObjectSamplePlaybackEvent';
+export * from './RoomObjectSoundMachineEvent';
+export * from './RoomObjectStateChangedEvent';
+export * from './RoomObjectTileMouseEvent';
+export * from './RoomObjectWallMouseEvent';
+export * from './RoomObjectWidgetRequestEvent';
+export * from './RoomSpriteMouseEvent';
+export * from './RoomToObjectEvent';
+export * from './RoomToObjectOwnAvatarMoveEvent';
+export * from './RoomZoomEvent';
diff --git a/submodules/renderer/src/events/session/BadgeImageReadyEvent.ts b/submodules/renderer/src/events/session/BadgeImageReadyEvent.ts
new file mode 100644
index 0000000..22b6390
--- /dev/null
+++ b/submodules/renderer/src/events/session/BadgeImageReadyEvent.ts
@@ -0,0 +1,28 @@
+import { Resource, Texture } from '@pixi/core';
+import { NitroEvent } from '../core';
+
+export class BadgeImageReadyEvent extends NitroEvent
+{
+ public static IMAGE_READY: string = 'BIME_BADGE_IMAGE_READY';
+
+ private _badgeId: string;
+ private _image: Texture;
+
+ constructor(badgeId: string, image: Texture)
+ {
+ super(BadgeImageReadyEvent.IMAGE_READY);
+
+ this._badgeId = badgeId;
+ this._image = image;
+ }
+
+ public get badgeId(): string
+ {
+ return this._badgeId;
+ }
+
+ public get image(): Texture
+ {
+ return this._image;
+ }
+}
diff --git a/submodules/renderer/src/events/session/MysteryBoxKeysUpdateEvent.ts b/submodules/renderer/src/events/session/MysteryBoxKeysUpdateEvent.ts
new file mode 100644
index 0000000..7f6a073
--- /dev/null
+++ b/submodules/renderer/src/events/session/MysteryBoxKeysUpdateEvent.ts
@@ -0,0 +1,27 @@
+import { NitroEvent } from '../core';
+
+export class MysteryBoxKeysUpdateEvent extends NitroEvent
+{
+ public static MYSTERY_BOX_KEYS_UPDATE: string = 'mbke_update';
+
+ private _boxColor: string;
+ private _keyColor: string;
+
+ constructor(boxColor: string, keyColor: string)
+ {
+ super(MysteryBoxKeysUpdateEvent.MYSTERY_BOX_KEYS_UPDATE);
+
+ this._boxColor = boxColor;
+ this._keyColor = keyColor;
+ }
+
+ public get boxColor(): string
+ {
+ return this._boxColor;
+ }
+
+ public get keyColor(): string
+ {
+ return this._keyColor;
+ }
+}
diff --git a/submodules/renderer/src/events/session/PerksUpdatedEvent.ts b/submodules/renderer/src/events/session/PerksUpdatedEvent.ts
new file mode 100644
index 0000000..e7b9679
--- /dev/null
+++ b/submodules/renderer/src/events/session/PerksUpdatedEvent.ts
@@ -0,0 +1,11 @@
+import { NitroEvent } from '../core';
+
+export class PerksUpdatedEvent extends NitroEvent
+{
+ public static PERKS_UPDATED: string = 'PUE_perks_updated';
+
+ constructor()
+ {
+ super(PerksUpdatedEvent.PERKS_UPDATED);
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionChatEvent.ts b/submodules/renderer/src/events/session/RoomSessionChatEvent.ts
new file mode 100644
index 0000000..10ec0b7
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionChatEvent.ts
@@ -0,0 +1,69 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionChatEvent extends RoomSessionEvent
+{
+ public static CHAT_EVENT: string = 'RSCE_CHAT_EVENT';
+ public static FLOOD_EVENT: string = 'RSCE_FLOOD_EVENT';
+
+ public static CHAT_TYPE_SPEAK: number = 0;
+ public static CHAT_TYPE_WHISPER: number = 1;
+ public static CHAT_TYPE_SHOUT: number = 2;
+ public static CHAT_TYPE_RESPECT: number = 3;
+ public static CHAT_TYPE_PETRESPECT: number = 4;
+ public static CHAT_TYPE_HAND_ITEM_RECEIVED: number = 5;
+ public static CHAT_TYPE_PETTREAT: number = 6;
+ public static CHAT_TYPE_PETREVIVE: number = 7;
+ public static CHAT_TYPE_PET_REBREED_FERTILIZE: number = 8;
+ public static CHAT_TYPE_PET_SPEED_FERTILIZE: number = 9;
+ public static CHAT_TYPE_MUTE_REMAINING: number = 10;
+
+ private _objectId: number;
+ private _message: string;
+ private _chatType: number;
+ private _links: string[];
+ private _extraParam: number;
+ private _style: number;
+
+ constructor(type: string, session: IRoomSession, objectId: number, message: string, chatType: number, style: number = 0, links: string[] = null, extraParam: number = -1)
+ {
+ super(type, session);
+
+ this._objectId = objectId;
+ this._message = message;
+ this._chatType = chatType;
+ this._links = links;
+ this._extraParam = extraParam;
+ this._style = style;
+ }
+
+ public get objectId(): number
+ {
+ return this._objectId;
+ }
+
+ public get message(): string
+ {
+ return this._message;
+ }
+
+ public get chatType(): number
+ {
+ return this._chatType;
+ }
+
+ public get links(): string[]
+ {
+ return this._links;
+ }
+
+ public get extraParam(): number
+ {
+ return this._extraParam;
+ }
+
+ public get style(): number
+ {
+ return this._style;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingEvent.ts b/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingEvent.ts
new file mode 100644
index 0000000..79b502c
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingEvent.ts
@@ -0,0 +1,50 @@
+import { IRoomSession } from '../../api';
+import { BreedingPetInfo, RarityCategoryData } from '../../nitro';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionConfirmPetBreedingEvent extends RoomSessionEvent
+{
+ public static CONFIRM_PET_BREEDING: string = 'RSPFUE_CONFIRM_PET_BREEDING';
+
+ private _nestId: number;
+ private _pet1: BreedingPetInfo;
+ private _pet2: BreedingPetInfo;
+ private _rarityCategories: RarityCategoryData[];
+ private _resultPetTypeId: number;
+
+ constructor(session: IRoomSession, nestId: number, pet1: BreedingPetInfo, pet2: BreedingPetInfo, rarityCategories: RarityCategoryData[], resultPetTypeId: number)
+ {
+ super(RoomSessionConfirmPetBreedingEvent.CONFIRM_PET_BREEDING, session);
+
+ this._nestId = nestId;
+ this._pet1 = pet1;
+ this._pet2 = pet2;
+ this._rarityCategories = rarityCategories;
+ this._resultPetTypeId = resultPetTypeId;
+ }
+
+ public get nestId(): number
+ {
+ return this._nestId;
+ }
+
+ public get pet1(): BreedingPetInfo
+ {
+ return this._pet1;
+ }
+
+ public get pet2(): BreedingPetInfo
+ {
+ return this._pet2;
+ }
+
+ public get rarityCategories(): RarityCategoryData[]
+ {
+ return this._rarityCategories;
+ }
+
+ public get resultPetTypeId(): number
+ {
+ return this._resultPetTypeId;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingResultEvent.ts b/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingResultEvent.ts
new file mode 100644
index 0000000..8b25710
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionConfirmPetBreedingResultEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionConfirmPetBreedingResultEvent extends RoomSessionEvent
+{
+ public static RSPFUE_CONFIRM_PET_BREEDING_RESULT: string = 'RSPFUE_CONFIRM_PET_BREEDING_RESULT';
+
+ private _breedingNestStuffId: number;
+ private _result: number;
+
+ constructor(session: IRoomSession, breedingNestStuffId: number, result: number)
+ {
+ super(RoomSessionConfirmPetBreedingResultEvent.RSPFUE_CONFIRM_PET_BREEDING_RESULT, session);
+
+ this._breedingNestStuffId = breedingNestStuffId;
+ this._result = result;
+ }
+
+ public get breedingNestStuffId(): number
+ {
+ return this._breedingNestStuffId;
+ }
+
+ public get result(): number
+ {
+ return this._result;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionDanceEvent.ts b/submodules/renderer/src/events/session/RoomSessionDanceEvent.ts
new file mode 100644
index 0000000..22cab6b
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionDanceEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionDanceEvent extends RoomSessionEvent
+{
+ public static RSDE_DANCE: string = 'RSDE_DANCE';
+
+ private _roomIndex: number;
+ private _danceId: number;
+
+ constructor(session: IRoomSession, roomIndex: number, danceId: number)
+ {
+ super(RoomSessionDanceEvent.RSDE_DANCE, session);
+
+ this._roomIndex = roomIndex;
+ this._danceId = danceId;
+ }
+
+ public get roomIndex(): number
+ {
+ return this._roomIndex;
+ }
+
+ public get danceId(): number
+ {
+ return this._danceId;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEvent.ts b/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEvent.ts
new file mode 100644
index 0000000..6ae9d5c
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEvent.ts
@@ -0,0 +1,45 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionDimmerPresetsEventPresetItem } from './RoomSessionDimmerPresetsEventPresetItem';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionDimmerPresetsEvent extends RoomSessionEvent
+{
+ public static ROOM_DIMMER_PRESETS: string = 'RSDPE_PRESETS';
+
+ private _selectedPresetId: number = 0;
+ private _presets: RoomSessionDimmerPresetsEventPresetItem[];
+
+ constructor(type: string, session: IRoomSession)
+ {
+ super(type, session);
+
+ this._presets = [];
+ }
+
+ public storePreset(id: number, type: number, color: number, brightness: number): void
+ {
+ this._presets[(id - 1)] = new RoomSessionDimmerPresetsEventPresetItem(id, type, color, brightness);
+ }
+
+ public getPreset(id: number): RoomSessionDimmerPresetsEventPresetItem
+ {
+ if((id < 0) || (id >= this._presets.length)) return null;
+
+ return this._presets[id];
+ }
+
+ public get presetCount(): number
+ {
+ return this._presets.length;
+ }
+
+ public get selectedPresetId(): number
+ {
+ return this._selectedPresetId;
+ }
+
+ public set selectedPresetId(id: number)
+ {
+ this._selectedPresetId = id;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEventPresetItem.ts b/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEventPresetItem.ts
new file mode 100644
index 0000000..9a05be0
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionDimmerPresetsEventPresetItem.ts
@@ -0,0 +1,35 @@
+export class RoomSessionDimmerPresetsEventPresetItem
+{
+ private _id: number;
+ private _type: number;
+ private _color: number;
+ private _brightness: number;
+
+ constructor(id: number, type: number, color: number, brightness: number)
+ {
+ this._id = id;
+ this._type = type;
+ this._color = color;
+ this._brightness = brightness;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get type(): number
+ {
+ return this._type;
+ }
+
+ public get color(): number
+ {
+ return this._color;
+ }
+
+ public get brightness(): number
+ {
+ return this._brightness;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionDoorbellEvent.ts b/submodules/renderer/src/events/session/RoomSessionDoorbellEvent.ts
new file mode 100644
index 0000000..e393454
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionDoorbellEvent.ts
@@ -0,0 +1,23 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionDoorbellEvent extends RoomSessionEvent
+{
+ public static DOORBELL: string = 'RSDE_DOORBELL';
+ public static RSDE_REJECTED: string = 'RSDE_REJECTED';
+ public static RSDE_ACCEPTED: string = 'RSDE_ACCEPTED';
+
+ private _userName: string = '';
+
+ constructor(type: string, session: IRoomSession, userName: string)
+ {
+ super(type, session);
+
+ this._userName = userName;
+ }
+
+ public get userName(): string
+ {
+ return this._userName;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionErrorMessageEvent.ts b/submodules/renderer/src/events/session/RoomSessionErrorMessageEvent.ts
new file mode 100644
index 0000000..807ba3b
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionErrorMessageEvent.ts
@@ -0,0 +1,32 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionErrorMessageEvent extends RoomSessionEvent
+{
+ public static RSEME_KICKED: string = 'RSEME_KICKED';
+ public static RSEME_PETS_FORBIDDEN_IN_HOTEL: string = 'RSEME_PETS_FORBIDDEN_IN_HOTEL';
+ public static RSEME_PETS_FORBIDDEN_IN_FLAT: string = 'RSEME_PETS_FORBIDDEN_IN_FLAT';
+ public static RSEME_MAX_PETS: string = 'RSEME_MAX_PETS';
+ public static RSEME_MAX_NUMBER_OF_OWN_PETS: string = 'RSEME_MAX_NUMBER_OF_OWN_PETS';
+ public static RSEME_NO_FREE_TILES_FOR_PET: string = 'RSEME_NO_FREE_TILES_FOR_PET';
+ public static RSEME_SELECTED_TILE_NOT_FREE_FOR_PET: string = 'RSEME_SELECTED_TILE_NOT_FREE_FOR_PET';
+ public static RSEME_BOTS_FORBIDDEN_IN_HOTEL: string = 'RSEME_BOTS_FORBIDDEN_IN_HOTEL';
+ public static RSEME_BOTS_FORBIDDEN_IN_FLAT: string = 'RSEME_BOTS_FORBIDDEN_IN_FLAT';
+ public static RSEME_BOT_LIMIT_REACHED: string = 'RSEME_BOT_LIMIT_REACHED';
+ public static RSEME_SELECTED_TILE_NOT_FREE_FOR_BOT: string = 'RSEME_SELECTED_TILE_NOT_FREE_FOR_BOT';
+ public static RSEME_BOT_NAME_NOT_ACCEPTED: string = 'RSEME_BOT_NAME_NOT_ACCEPTED';
+
+ private _message: string;
+
+ constructor(k: string, _arg_2: IRoomSession, _arg_3: string = null)
+ {
+ super(k, _arg_2);
+
+ this._message = _arg_3;
+ }
+
+ public get message(): string
+ {
+ return this._message;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionEvent.ts b/submodules/renderer/src/events/session/RoomSessionEvent.ts
new file mode 100644
index 0000000..dfa6786
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionEvent.ts
@@ -0,0 +1,31 @@
+import { IRoomSession } from '../../api';
+import { NitroEvent } from '../core';
+
+export class RoomSessionEvent extends NitroEvent
+{
+ public static CREATED: string = 'RSE_CREATED';
+ public static STARTED: string = 'RSE_STARTED';
+ public static ENDED: string = 'RSE_ENDED';
+ public static ROOM_DATA: string = 'RSE_ROOM_DATA';
+
+ private _session: IRoomSession;
+ private _openLandingView: boolean;
+
+ constructor(type: string, session: IRoomSession, openLandingView: boolean = true)
+ {
+ super(type);
+
+ this._session = session;
+ this._openLandingView = openLandingView;
+ }
+
+ public get session(): IRoomSession
+ {
+ return this._session;
+ }
+
+ public get openLandingView(): boolean
+ {
+ return this._openLandingView;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionFavoriteGroupUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionFavoriteGroupUpdateEvent.ts
new file mode 100644
index 0000000..0e2d05b
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionFavoriteGroupUpdateEvent.ts
@@ -0,0 +1,42 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionFavoriteGroupUpdateEvent extends RoomSessionEvent
+{
+ public static FAVOURITE_GROUP_UPDATE: string = 'RSFGUE_FAVOURITE_GROUP_UPDATE';
+
+ private _roomIndex: number;
+ private _habboGroupId: number;
+ private _habboGroupName: string;
+ private _status: number;
+
+ constructor(session: IRoomSession, roomIndex: number, groupId: number, status: number, groupName: string)
+ {
+ super(RoomSessionFavoriteGroupUpdateEvent.FAVOURITE_GROUP_UPDATE, session);
+
+ this._roomIndex = roomIndex;
+ this._habboGroupId = groupId;
+ this._habboGroupName = groupName;
+ this._status = status;
+ }
+
+ public get roomIndex(): number
+ {
+ return this._roomIndex;
+ }
+
+ public get habboGroupId(): number
+ {
+ return this._habboGroupId;
+ }
+
+ public get habboGroupName(): string
+ {
+ return this._habboGroupName;
+ }
+
+ public get status(): number
+ {
+ return this._status;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionFriendRequestEvent.ts b/submodules/renderer/src/events/session/RoomSessionFriendRequestEvent.ts
new file mode 100644
index 0000000..37f63dc
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionFriendRequestEvent.ts
@@ -0,0 +1,35 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionFriendRequestEvent extends RoomSessionEvent
+{
+ public static RSFRE_FRIEND_REQUEST: string = 'RSFRE_FRIEND_REQUEST';
+
+ private _requestId: number = 0;
+ private _userId: number = 0;
+ private _userName: string;
+
+ constructor(session: IRoomSession, requestId: number, userId: number, userName: string)
+ {
+ super(RoomSessionFriendRequestEvent.RSFRE_FRIEND_REQUEST, session);
+
+ this._requestId = requestId;
+ this._userId = userId;
+ this._userName = userName;
+ }
+
+ public get requestId(): number
+ {
+ return this._requestId;
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public get userName(): string
+ {
+ return this._userName;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionNestBreedingSuccessEvent.ts b/submodules/renderer/src/events/session/RoomSessionNestBreedingSuccessEvent.ts
new file mode 100644
index 0000000..3ca7638
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionNestBreedingSuccessEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionNestBreedingSuccessEvent extends RoomSessionEvent
+{
+ public static NEST_BREEDING_SUCCESS: string = 'RSPFUE_NEST_BREEDING_SUCCESS';
+
+ private _rarityCategory: number;
+ private _petId: number;
+
+ constructor(session: IRoomSession, petId: number, rarityCategory: number)
+ {
+ super(RoomSessionNestBreedingSuccessEvent.NEST_BREEDING_SUCCESS, session);
+
+ this._petId = petId;
+ this._rarityCategory = rarityCategory;
+ }
+
+ public get rarityCategory(): number
+ {
+ return this._rarityCategory;
+ }
+
+ public get petId(): number
+ {
+ return this._petId;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetBreedingEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetBreedingEvent.ts
new file mode 100644
index 0000000..0d5db4a
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetBreedingEvent.ts
@@ -0,0 +1,35 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetBreedingEvent extends RoomSessionEvent
+{
+ public static PET_BREEDING: string = 'RSPFUE_PET_BREEDING';
+
+ private _state: number;
+ private _ownPetId: number;
+ private _otherPetId: number;
+
+ constructor(session: IRoomSession, state: number, ownPetId: number, otherPetId: number)
+ {
+ super(RoomSessionPetBreedingEvent.PET_BREEDING, session);
+
+ this._state = state;
+ this._ownPetId = ownPetId;
+ this._otherPetId = otherPetId;
+ }
+
+ public get state(): number
+ {
+ return this._state;
+ }
+
+ public get ownPetId(): number
+ {
+ return this._ownPetId;
+ }
+
+ public get otherPetId(): number
+ {
+ return this._otherPetId;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetBreedingResultEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetBreedingResultEvent.ts
new file mode 100644
index 0000000..d189cae
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetBreedingResultEvent.ts
@@ -0,0 +1,28 @@
+import { IPetBreedingResultData, IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetBreedingResultEvent extends RoomSessionEvent
+{
+ public static PET_BREEDING_RESULT: string = 'RSPFUE_PET_BREEDING_RESULT';
+
+ private _resultData: IPetBreedingResultData;
+ private _otherResultData: IPetBreedingResultData;
+
+ constructor(session: IRoomSession, resultData: IPetBreedingResultData, otherResultData: IPetBreedingResultData)
+ {
+ super(RoomSessionPetBreedingResultEvent.PET_BREEDING_RESULT, session);
+
+ this._resultData = resultData;
+ this._otherResultData = otherResultData;
+ }
+
+ public get resultData(): IPetBreedingResultData
+ {
+ return this._resultData;
+ }
+
+ public get otherResultData(): IPetBreedingResultData
+ {
+ return this._otherResultData;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetCommandsUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetCommandsUpdateEvent.ts
new file mode 100644
index 0000000..89ec845
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetCommandsUpdateEvent.ts
@@ -0,0 +1,35 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetCommandsUpdateEvent extends RoomSessionEvent
+{
+ public static PET_COMMANDS: string = 'RSPIUE_ENABLED_PET_COMMANDS';
+
+ private _petId: number;
+ private _allCommandIds: number[];
+ private _enabledCommandIds: number[];
+
+ constructor(k: IRoomSession, id: number, commands: number[], enabledCommands: number[])
+ {
+ super(RoomSessionPetCommandsUpdateEvent.PET_COMMANDS, k);
+
+ this._petId = id;
+ this._allCommandIds = commands;
+ this._enabledCommandIds = enabledCommands;
+ }
+
+ public get id(): number
+ {
+ return this._petId;
+ }
+
+ public get commands(): number[]
+ {
+ return this._allCommandIds;
+ }
+
+ public get enabledCommands(): number[]
+ {
+ return this._enabledCommandIds;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetFigureUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetFigureUpdateEvent.ts
new file mode 100644
index 0000000..5f317cb
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetFigureUpdateEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetFigureUpdateEvent extends RoomSessionEvent
+{
+ public static PET_FIGURE_UPDATE: string = 'RSPFUE_PET_FIGURE_UPDATE';
+
+ private _petId: number;
+ private _figure: string;
+
+ constructor(roomSession: IRoomSession, id: number, figure: string)
+ {
+ super(RoomSessionPetFigureUpdateEvent.PET_FIGURE_UPDATE, roomSession);
+
+ this._petId = id;
+ this._figure = figure;
+ }
+
+ public get id(): number
+ {
+ return this._petId;
+ }
+
+ public get figure(): string
+ {
+ return this._figure;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetInfoUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetInfoUpdateEvent.ts
new file mode 100644
index 0000000..23c238c
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetInfoUpdateEvent.ts
@@ -0,0 +1,21 @@
+import { IRoomPetData, IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetInfoUpdateEvent extends RoomSessionEvent
+{
+ public static PET_INFO: string = 'RSPIUE_PET_INFO';
+
+ private _petInfo: IRoomPetData;
+
+ constructor(k: IRoomSession, _arg_2: IRoomPetData)
+ {
+ super(RoomSessionPetInfoUpdateEvent.PET_INFO, k);
+
+ this._petInfo = _arg_2;
+ }
+
+ public get petInfo(): IRoomPetData
+ {
+ return this._petInfo;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetLevelUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetLevelUpdateEvent.ts
new file mode 100644
index 0000000..4122816
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetLevelUpdateEvent.ts
@@ -0,0 +1,28 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetLevelUpdateEvent extends RoomSessionEvent
+{
+ public static PET_LEVEL_UPDATE: string = 'RSPLUE_PET_LEVEL_UPDATE';
+
+ private _petId: number;
+ private _level: number;
+
+ constructor(session: IRoomSession, petId: number, level: number)
+ {
+ super(RoomSessionPetLevelUpdateEvent.PET_LEVEL_UPDATE, session);
+
+ this._petId = petId;
+ this._level = level;
+ }
+
+ public get petId(): number
+ {
+ return this._petId;
+ }
+
+ public get level(): number
+ {
+ return this._level;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetPackageEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetPackageEvent.ts
new file mode 100644
index 0000000..87dac71
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetPackageEvent.ts
@@ -0,0 +1,43 @@
+import { IRoomSession } from '../../api';
+import { PetFigureData } from '../../nitro';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetPackageEvent extends RoomSessionEvent
+{
+ public static RSOPPE_OPEN_PET_PACKAGE_REQUESTED: string = 'RSOPPE_OPEN_PET_PACKAGE_REQUESTED';
+ public static RSOPPE_OPEN_PET_PACKAGE_RESULT: string = 'RSOPPE_OPEN_PET_PACKAGE_RESULT';
+
+ private _objectId: number = -1;
+ private _figureData: PetFigureData;
+ private _nameValidationStatus: number = 0;
+ private _nameValidationInfo: string = null;
+
+ constructor(petPackageName: string, session: IRoomSession, objectId: number, figureData: PetFigureData, nameValidationStatus: number, nameValidationInfo: string)
+ {
+ super(petPackageName, session);
+ this._objectId = objectId;
+ this._figureData = figureData;
+ this._nameValidationStatus = nameValidationStatus;
+ this._nameValidationInfo = nameValidationInfo;
+ }
+
+ public get objectId(): number
+ {
+ return this._objectId;
+ }
+
+ public get figureData(): PetFigureData
+ {
+ return this._figureData;
+ }
+
+ public get nameValidationStatus(): number
+ {
+ return this._nameValidationStatus;
+ }
+
+ public get nameValidationInfo(): string
+ {
+ return this._nameValidationInfo;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPetStatusUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPetStatusUpdateEvent.ts
new file mode 100644
index 0000000..d62f018
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPetStatusUpdateEvent.ts
@@ -0,0 +1,49 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPetStatusUpdateEvent extends RoomSessionEvent
+{
+ public static PET_STATUS_UPDATE: string = 'RSPFUE_PET_STATUS_UPDATE';
+
+ private _petId: number;
+ private _canBreed: boolean;
+ private _canHarvest: boolean;
+ private _canRevive: boolean;
+ private _hasBreedingPermission: boolean;
+
+ constructor(roomSession: IRoomSession, petId: number, canBreed: boolean, canHarvest: boolean, canRevive: boolean, hasBreedingPermission: boolean)
+ {
+ super(RoomSessionPetStatusUpdateEvent.PET_STATUS_UPDATE, roomSession);
+
+ this._petId = petId;
+ this._canBreed = canBreed;
+ this._canHarvest = canHarvest;
+ this._canRevive = canRevive;
+ this._hasBreedingPermission = hasBreedingPermission;
+ }
+
+ public get petId(): number
+ {
+ return this._petId;
+ }
+
+ public get canBreed(): boolean
+ {
+ return this._canBreed;
+ }
+
+ public get canHarvest(): boolean
+ {
+ return this._canHarvest;
+ }
+
+ public get canRevive(): boolean
+ {
+ return this._canRevive;
+ }
+
+ public get hasBreedingPermission(): boolean
+ {
+ return this._hasBreedingPermission;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPollEvent.ts b/submodules/renderer/src/events/session/RoomSessionPollEvent.ts
new file mode 100644
index 0000000..551ead7
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPollEvent.ts
@@ -0,0 +1,100 @@
+import { IPollQuestion, IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPollEvent extends RoomSessionEvent
+{
+ public static OFFER: string = 'RSPE_POLL_OFFER';
+ public static ERROR: string = 'RSPE_POLL_ERROR';
+ public static CONTENT: string = 'RSPE_POLL_CONTENT';
+
+ private _id: number = -1;
+ private _headline: string;
+ private _summary: string;
+ private _numQuestions: number = 0;
+ private _startMessage: string = '';
+ private _endMessage: string = '';
+ private _questionArray: IPollQuestion[] = null;
+ private _npsPoll: boolean = false;
+
+ constructor(k: string, _arg_2: IRoomSession, _arg_3: number)
+ {
+ super(k, _arg_2);
+
+ this._id = _arg_3;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get headline(): string
+ {
+ return this._headline;
+ }
+
+ public set headline(k: string)
+ {
+ this._headline = k;
+ }
+
+ public get summary(): string
+ {
+ return this._summary;
+ }
+
+ public set summary(k: string)
+ {
+ this._summary = k;
+ }
+
+ public get numQuestions(): number
+ {
+ return this._numQuestions;
+ }
+
+ public set numQuestions(k: number)
+ {
+ this._numQuestions = k;
+ }
+
+ public get startMessage(): string
+ {
+ return this._startMessage;
+ }
+
+ public set startMessage(k: string)
+ {
+ this._startMessage = k;
+ }
+
+ public get endMessage(): string
+ {
+ return this._endMessage;
+ }
+
+ public set endMessage(k: string)
+ {
+ this._endMessage = k;
+ }
+
+ public get questionArray(): IPollQuestion[]
+ {
+ return this._questionArray;
+ }
+
+ public set questionArray(k: IPollQuestion[])
+ {
+ this._questionArray = k;
+ }
+
+ public get npsPoll(): boolean
+ {
+ return this._npsPoll;
+ }
+
+ public set npsPoll(k: boolean)
+ {
+ this._npsPoll = k;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPresentEvent.ts b/submodules/renderer/src/events/session/RoomSessionPresentEvent.ts
new file mode 100644
index 0000000..d589987
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPresentEvent.ts
@@ -0,0 +1,64 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPresentEvent extends RoomSessionEvent
+{
+ public static RSPE_PRESENT_OPENED: string = 'RSPE_PRESENT_OPENED';
+
+ private _classId: number = 0;
+ private _itemType: string = '';
+ private _productCode: string;
+ private _placedItemId: number = 0;
+ private _placedItemType: string = '';
+ private _placedInRoom: boolean;
+ private _petFigureString: string;
+
+ constructor(k: string, _arg_2: IRoomSession, classId: number, itemType: string, productCode: string, placedItemId: number, placedItemType: string, placedInRoom: boolean, petFigureString: string)
+ {
+ super(k, _arg_2);
+
+ this._classId = classId;
+ this._itemType = itemType;
+ this._productCode = productCode;
+ this._placedItemId = placedItemId;
+ this._placedItemType = placedItemType;
+ this._placedInRoom = placedInRoom;
+ this._petFigureString = petFigureString;
+ }
+
+ public get classId(): number
+ {
+ return this._classId;
+ }
+
+
+ public get itemType(): string
+ {
+ return this._itemType;
+ }
+
+ public get productCode(): string
+ {
+ return this._productCode;
+ }
+
+ public get placedItemId(): number
+ {
+ return this._placedItemId;
+ }
+
+ public get placedInRoom(): boolean
+ {
+ return this._placedInRoom;
+ }
+
+ public get placedItemType(): string
+ {
+ return this._placedItemType;
+ }
+
+ public get petFigureString(): string
+ {
+ return this._petFigureString;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionPropertyUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionPropertyUpdateEvent.ts
new file mode 100644
index 0000000..bf284b4
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionPropertyUpdateEvent.ts
@@ -0,0 +1,12 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionPropertyUpdateEvent extends RoomSessionEvent
+{
+ public static RSDUE_ALLOW_PETS: string = 'RSDUE_ALLOW_PETS';
+
+ constructor(k: string, _arg_2: IRoomSession)
+ {
+ super(k, _arg_2);
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionQueueEvent.ts b/submodules/renderer/src/events/session/RoomSessionQueueEvent.ts
new file mode 100644
index 0000000..7cc3462
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionQueueEvent.ts
@@ -0,0 +1,57 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionQueueEvent extends RoomSessionEvent
+{
+ public static QUEUE_STATUS: string = 'RSQE_QUEUE_STATUS';
+ public static QUEUE_TYPE_CLUB: string = 'c';
+ public static QUEUE_TYPE_NORMAL: string = 'd';
+ public static QUEUE_TARGET_VISITOR: number = 2;
+ public static QUEUE_TARGET_SPECTATOR: number = 1;
+
+ private _name: string;
+ private _target: number;
+ private _queues: Map;
+ private _isActive: boolean;
+ private _activeQueue: string;
+
+ constructor(k: IRoomSession, _arg_2: string, _arg_3: number, _arg_4: boolean = false)
+ {
+ super(RoomSessionQueueEvent.QUEUE_STATUS, k);
+
+ this._name = _arg_2;
+ this._target = _arg_3;
+ this._queues = new Map();
+ this._isActive = _arg_4;
+ }
+
+ public get isActive(): boolean
+ {
+ return this._isActive;
+ }
+
+ public get queueSetName(): string
+ {
+ return this._name;
+ }
+
+ public get queueSetTarget(): number
+ {
+ return this._target;
+ }
+
+ public get queueTypes(): string[]
+ {
+ return Array.from(this._queues.keys());
+ }
+
+ public getQueueSize(k: string): number
+ {
+ return this._queues.get(k);
+ }
+
+ public addQueue(k: string, _arg_2: number): void
+ {
+ this._queues.set(k, _arg_2);
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionSpectatorModeEvent.ts b/submodules/renderer/src/events/session/RoomSessionSpectatorModeEvent.ts
new file mode 100644
index 0000000..aed9685
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionSpectatorModeEvent.ts
@@ -0,0 +1,12 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionSpectatorModeEvent extends RoomSessionEvent
+{
+ public static SPECTATOR_MODE: string = 'RSSME_SPECTATOR_MODE';
+
+ constructor(type: string, session: IRoomSession)
+ {
+ super(type, session);
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionUserBadgesEvent.ts b/submodules/renderer/src/events/session/RoomSessionUserBadgesEvent.ts
new file mode 100644
index 0000000..9d28c1a
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionUserBadgesEvent.ts
@@ -0,0 +1,29 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionUserBadgesEvent extends RoomSessionEvent
+{
+ public static RSUBE_BADGES: string = 'RSUBE_BADGES';
+
+ private _userId: number = 0;
+ private _badges: string[];
+
+ constructor(k: IRoomSession, _arg_2: number, _arg_3: string[])
+ {
+ super(RoomSessionUserBadgesEvent.RSUBE_BADGES, k);
+
+ this._badges = [];
+ this._userId = _arg_2;
+ this._badges = _arg_3;
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public get badges(): string[]
+ {
+ return this._badges;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionUserDataUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionUserDataUpdateEvent.ts
new file mode 100644
index 0000000..6e8d239
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionUserDataUpdateEvent.ts
@@ -0,0 +1,21 @@
+import { IRoomSession, IRoomUserData } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionUserDataUpdateEvent extends RoomSessionEvent
+{
+ public static USER_DATA_UPDATED: string = 'RMUDUE_USER_DATA_UPDATED';
+
+ private _addedUsers: IRoomUserData[];
+
+ constructor(session: IRoomSession, addedUsers: IRoomUserData[])
+ {
+ super(RoomSessionUserDataUpdateEvent.USER_DATA_UPDATED, session);
+
+ this._addedUsers = addedUsers;
+ }
+
+ public get addedUsers(): IRoomUserData[]
+ {
+ return this._addedUsers;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionUserFigureUpdateEvent.ts b/submodules/renderer/src/events/session/RoomSessionUserFigureUpdateEvent.ts
new file mode 100644
index 0000000..40c410a
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionUserFigureUpdateEvent.ts
@@ -0,0 +1,49 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionUserFigureUpdateEvent extends RoomSessionEvent
+{
+ public static USER_FIGURE: string = 'RSUBE_FIGURE';
+
+ private _roomIndex: number = 0;
+ private _figure: string = '';
+ private _gender: string = '';
+ private _customInfo: string = '';
+ private _achievementScore: number;
+
+ constructor(session: IRoomSession, roomIndex: number, figure: string, gender: string, customInfo: string, achievementScore: number)
+ {
+ super(RoomSessionUserFigureUpdateEvent.USER_FIGURE, session);
+
+ this._roomIndex = roomIndex;
+ this._figure = figure;
+ this._gender = gender;
+ this._customInfo = customInfo;
+ this._achievementScore = achievementScore;
+ }
+
+ public get roomIndex(): number
+ {
+ return this._roomIndex;
+ }
+
+ public get figure(): string
+ {
+ return this._figure;
+ }
+
+ public get gender(): string
+ {
+ return this._gender;
+ }
+
+ public get customInfo(): string
+ {
+ return this._customInfo;
+ }
+
+ public get activityPoints(): number
+ {
+ return this._achievementScore;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionUserTagsEvent.ts b/submodules/renderer/src/events/session/RoomSessionUserTagsEvent.ts
new file mode 100644
index 0000000..057b7bc
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionUserTagsEvent.ts
@@ -0,0 +1,27 @@
+import { NitroEvent } from '../core';
+
+export class RoomSessionUserTagsEvent extends NitroEvent
+{
+ public static UTRE_USER_TAGS_RECEIVED: string = 'UTRE_USER_TAGS_RECEIVED';
+
+ private _userId: number;
+ private _tags: string[];
+
+ constructor(k: number, _arg_2: string[])
+ {
+ super(RoomSessionUserTagsEvent.UTRE_USER_TAGS_RECEIVED);
+
+ this._userId = k;
+ this._tags = _arg_2;
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public get tags(): string[]
+ {
+ return this._tags;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionVoteEvent.ts b/submodules/renderer/src/events/session/RoomSessionVoteEvent.ts
new file mode 100644
index 0000000..d8d778b
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionVoteEvent.ts
@@ -0,0 +1,50 @@
+import { IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+
+export class RoomSessionVoteEvent extends RoomSessionEvent
+{
+ public static VOTE_QUESTION: string = 'RSPE_VOTE_QUESTION';
+ public static VOTE_RESULT: string = 'RSPE_VOTE_RESULT';
+
+ private _question: string = '';
+ private _choices: string[];
+ private _SafeStr_7651: string[];
+ private _SafeStr_7654: number = 0;
+
+ constructor(_arg_1: string, _arg_2: IRoomSession, _arg_3: string, _arg_4: string[], _arg_5: string[] = null, _arg_6: number = 0)
+ {
+ super(_arg_1, _arg_2);
+
+ this._choices = [];
+ this._SafeStr_7651 = [];
+ this._question = _arg_3;
+ this._choices = _arg_4;
+ this._SafeStr_7651 = _arg_5;
+ if(this._SafeStr_7651 == null)
+ {
+ this._SafeStr_7651 = [];
+ }
+ this._SafeStr_7654 = _arg_6;
+ }
+
+ public get question(): string
+ {
+ return this._question;
+ }
+
+ public get choices(): string[]
+ {
+ return this._choices.slice();
+ }
+
+ public get _SafeStr_4173(): string[]
+ {
+ return this._SafeStr_7651.slice();
+ }
+
+ public get _SafeStr_4174(): number
+ {
+ return this._SafeStr_7654;
+ }
+}
diff --git a/submodules/renderer/src/events/session/RoomSessionWordQuizEvent.ts b/submodules/renderer/src/events/session/RoomSessionWordQuizEvent.ts
new file mode 100644
index 0000000..df5a1db
--- /dev/null
+++ b/submodules/renderer/src/events/session/RoomSessionWordQuizEvent.ts
@@ -0,0 +1,111 @@
+import { IQuestion, IRoomSession } from '../../api';
+import { RoomSessionEvent } from './RoomSessionEvent';
+
+export class RoomSessionWordQuizEvent extends RoomSessionEvent
+{
+ public static QUESTION: string = 'RWPUW_NEW_QUESTION';
+ public static FINISHED: string = 'RWPUW_QUESION_FINSIHED';
+ public static ANSWERED: string = 'RWPUW_QUESTION_ANSWERED';
+
+ private _id: number = -1;
+ private _pollType: string = null;
+ private _pollId: number = -1;
+ private _questionId: number = -1;
+ private _duration: number = -1;
+ private _question: IQuestion = null;
+ private _userId: number = -1;
+ private _value: string;
+ private _answerCounts: Map;
+
+ constructor(k: string, _arg_2: IRoomSession, _arg_3: number = -1)
+ {
+ super(k, _arg_2);
+
+ this._id = _arg_3;
+ }
+
+ public get id(): number
+ {
+ return this._id;
+ }
+
+ public get pollType(): string
+ {
+ return this._pollType;
+ }
+
+ public set pollType(pollType: string)
+ {
+ this._pollType = pollType;
+ }
+
+ public get pollId(): number
+ {
+ return this._pollId;
+ }
+
+ public set pollId(k: number)
+ {
+ this._pollId = k;
+ }
+
+ public get questionId(): number
+ {
+ return this._questionId;
+ }
+
+ public set questionId(k: number)
+ {
+ this._questionId = k;
+ }
+
+ public get duration(): number
+ {
+ return this._duration;
+ }
+
+ public set duration(k: number)
+ {
+ this._duration = k;
+ }
+
+ public get question(): IQuestion
+ {
+ return this._question;
+ }
+
+ public set question(k: IQuestion)
+ {
+ this._question = k;
+ }
+
+ public get userId(): number
+ {
+ return this._userId;
+ }
+
+ public set userId(k: number)
+ {
+ this._userId = k;
+ }
+
+ public get value(): string
+ {
+ return this._value;
+ }
+
+ public set value(value: string)
+ {
+ this._value = value;
+ }
+
+ public get answerCounts(): Map
+ {
+ return this._answerCounts;
+ }
+
+ public set answerCounts(k: Map)
+ {
+ this._answerCounts = k;
+ }
+}
diff --git a/submodules/renderer/src/events/session/SessionDataPreferencesEvent.ts b/submodules/renderer/src/events/session/SessionDataPreferencesEvent.ts
new file mode 100644
index 0000000..7e362d9
--- /dev/null
+++ b/submodules/renderer/src/events/session/SessionDataPreferencesEvent.ts
@@ -0,0 +1,20 @@
+import { NitroEvent } from '../core';
+
+export class SessionDataPreferencesEvent extends NitroEvent
+{
+ public static UPDATED: string = 'APUE_UPDATED';
+
+ private _uiFlags: number;
+
+ constructor(k: number)
+ {
+ super(SessionDataPreferencesEvent.UPDATED);
+
+ this._uiFlags = k;
+ }
+
+ public get uiFlags(): number
+ {
+ return this._uiFlags;
+ }
+}
diff --git a/submodules/renderer/src/events/session/UserNameUpdateEvent.ts b/submodules/renderer/src/events/session/UserNameUpdateEvent.ts
new file mode 100644
index 0000000..9b8051e
--- /dev/null
+++ b/submodules/renderer/src/events/session/UserNameUpdateEvent.ts
@@ -0,0 +1,20 @@
+import { NitroEvent } from '../core';
+
+export class UserNameUpdateEvent extends NitroEvent
+{
+ public static UNUE_NAME_UPDATED: string = 'unue_name_updated';
+
+ private _name: string;
+
+ constructor(name: string)
+ {
+ super(UserNameUpdateEvent.UNUE_NAME_UPDATED);
+
+ this._name = name;
+ }
+
+ public get name(): string
+ {
+ return this._name;
+ }
+}
diff --git a/submodules/renderer/src/events/session/index.ts b/submodules/renderer/src/events/session/index.ts
new file mode 100644
index 0000000..82421b0
--- /dev/null
+++ b/submodules/renderer/src/events/session/index.ts
@@ -0,0 +1,36 @@
+export * from './BadgeImageReadyEvent';
+export * from './MysteryBoxKeysUpdateEvent';
+export * from './PerksUpdatedEvent';
+export * from './RoomSessionChatEvent';
+export * from './RoomSessionConfirmPetBreedingEvent';
+export * from './RoomSessionConfirmPetBreedingResultEvent';
+export * from './RoomSessionDanceEvent';
+export * from './RoomSessionDimmerPresetsEvent';
+export * from './RoomSessionDimmerPresetsEventPresetItem';
+export * from './RoomSessionDoorbellEvent';
+export * from './RoomSessionErrorMessageEvent';
+export * from './RoomSessionEvent';
+export * from './RoomSessionFavoriteGroupUpdateEvent';
+export * from './RoomSessionFriendRequestEvent';
+export * from './RoomSessionNestBreedingSuccessEvent';
+export * from './RoomSessionPetBreedingEvent';
+export * from './RoomSessionPetBreedingResultEvent';
+export * from './RoomSessionPetCommandsUpdateEvent';
+export * from './RoomSessionPetFigureUpdateEvent';
+export * from './RoomSessionPetInfoUpdateEvent';
+export * from './RoomSessionPetLevelUpdateEvent';
+export * from './RoomSessionPetPackageEvent';
+export * from './RoomSessionPetStatusUpdateEvent';
+export * from './RoomSessionPollEvent';
+export * from './RoomSessionPresentEvent';
+export * from './RoomSessionPropertyUpdateEvent';
+export * from './RoomSessionQueueEvent';
+export * from './RoomSessionSpectatorModeEvent';
+export * from './RoomSessionUserBadgesEvent';
+export * from './RoomSessionUserDataUpdateEvent';
+export * from './RoomSessionUserFigureUpdateEvent';
+export * from './RoomSessionUserTagsEvent';
+export * from './RoomSessionVoteEvent';
+export * from './RoomSessionWordQuizEvent';
+export * from './SessionDataPreferencesEvent';
+export * from './UserNameUpdateEvent';
diff --git a/submodules/renderer/src/index.ts b/submodules/renderer/src/index.ts
new file mode 100644
index 0000000..64121b0
--- /dev/null
+++ b/submodules/renderer/src/index.ts
@@ -0,0 +1,6 @@
+export * from './api';
+export * from './core';
+export * from './events';
+export * from './nitro';
+export * from './pixi-proxy';
+export * from './room';
diff --git a/submodules/renderer/src/nitro/INitro.ts b/submodules/renderer/src/nitro/INitro.ts
new file mode 100644
index 0000000..4d25089
--- /dev/null
+++ b/submodules/renderer/src/nitro/INitro.ts
@@ -0,0 +1,31 @@
+import { Application } from '@pixi/app';
+import { IAvatarRenderManager, IEventDispatcher, ILinkEventTracker, INitroCommunicationManager, INitroCore, INitroLocalizationManager, IRoomCameraWidgetManager, IRoomEngine, IRoomManager, IRoomSessionManager, ISessionDataManager, ISoundManager } from '../api';
+
+export interface INitro
+{
+ init(): void;
+ dispose(): void;
+ getConfiguration(key: string, value?: T): T;
+ getLocalization(key: string): string;
+ getLocalizationWithParameter(key: string, parameter: string, replacement: string): string;
+ getLocalizationWithParameters(key: string, parameters: string[], replacements: string[]): string;
+ addLinkEventTracker(tracker: ILinkEventTracker): void;
+ removeLinkEventTracker(tracker: ILinkEventTracker): void;
+ createLinkEvent(link: string): void;
+ application: Application;
+ core: INitroCore;
+ events: IEventDispatcher;
+ localization: INitroLocalizationManager;
+ communication: INitroCommunicationManager;
+ avatar: IAvatarRenderManager;
+ roomEngine: IRoomEngine;
+ sessionDataManager: ISessionDataManager;
+ roomSessionManager: IRoomSessionManager;
+ roomManager: IRoomManager;
+ cameraManager: IRoomCameraWidgetManager;
+ soundManager: ISoundManager;
+ width: number;
+ height: number;
+ isReady: boolean;
+ isDisposed: boolean;
+}
diff --git a/submodules/renderer/src/nitro/Nitro.ts b/submodules/renderer/src/nitro/Nitro.ts
new file mode 100644
index 0000000..f821c6e
--- /dev/null
+++ b/submodules/renderer/src/nitro/Nitro.ts
@@ -0,0 +1,365 @@
+import { Application, IApplicationOptions } from '@pixi/app';
+import { SCALE_MODES } from '@pixi/constants';
+import { settings } from '@pixi/settings';
+import { IAvatarRenderManager, IEventDispatcher, ILinkEventTracker, INitroCommunicationManager, INitroCore, INitroLocalizationManager, IRoomCameraWidgetManager, IRoomEngine, IRoomManager, IRoomSessionManager, ISessionDataManager, ISoundManager, NitroConfiguration, NitroLogger } from '../api';
+import { ConfigurationEvent, EventDispatcher, NitroCore } from '../core';
+import { NitroEvent, RoomEngineEvent } from '../events';
+import { GetTicker, PixiApplicationProxy } from '../pixi-proxy';
+import { RoomManager } from '../room';
+import { AvatarRenderManager } from './avatar';
+import { RoomCameraWidgetManager } from './camera';
+import { NitroCommunicationManager } from './communication';
+import { LegacyExternalInterface } from './externalInterface';
+import { GameMessageHandler } from './game';
+import { INitro } from './INitro';
+import { NitroLocalizationManager } from './localization';
+import './Plugins';
+import { LandscapeRasterizer, RoomEngine } from './room';
+import { RoomSessionManager, SessionDataManager } from './session';
+import { SoundManager } from './sound';
+import { HabboWebTools } from './utils/HabboWebTools';
+
+LegacyExternalInterface.available;
+
+settings.SCALE_MODE = (!(window.devicePixelRatio % 1)) ? SCALE_MODES.NEAREST : SCALE_MODES.LINEAR;
+settings.ROUND_PIXELS = true;
+settings.GC_MAX_IDLE = 120;
+
+export class Nitro implements INitro
+{
+ public static WEBGL_CONTEXT_LOST: string = 'NE_WEBGL_CONTEXT_LOST';
+ public static WEBGL_UNAVAILABLE: string = 'NE_WEBGL_UNAVAILABLE';
+ public static READY: string = 'NE_READY!';
+
+ private static INSTANCE: INitro = null;
+
+ private _application: Application;
+ private _core: INitroCore;
+ private _events: IEventDispatcher;
+ private _communication: INitroCommunicationManager;
+ private _localization: INitroLocalizationManager;
+ private _avatar: IAvatarRenderManager;
+ private _roomEngine: IRoomEngine;
+ private _sessionDataManager: ISessionDataManager;
+ private _roomSessionManager: IRoomSessionManager;
+ private _roomManager: IRoomManager;
+ private _cameraManager: IRoomCameraWidgetManager;
+ private _soundManager: ISoundManager;
+ private _linkTrackers: ILinkEventTracker[];
+
+ private _isReady: boolean;
+ private _isDisposed: boolean;
+
+ constructor(core: INitroCore, options?: IApplicationOptions)
+ {
+ if(!Nitro.INSTANCE) Nitro.INSTANCE = this;
+
+ this._application = new PixiApplicationProxy(options);
+ this._core = core;
+ this._events = new EventDispatcher();
+ this._communication = new NitroCommunicationManager(core.communication);
+ this._localization = new NitroLocalizationManager(this._communication);
+ this._avatar = new AvatarRenderManager();
+ this._roomEngine = new RoomEngine(this._communication);
+ this._sessionDataManager = new SessionDataManager(this._communication);
+ this._roomSessionManager = new RoomSessionManager(this._communication, this._roomEngine);
+ this._roomManager = new RoomManager(this._roomEngine, this._roomEngine.visualizationFactory, this._roomEngine.logicFactory);
+ this._cameraManager = new RoomCameraWidgetManager();
+ this._soundManager = new SoundManager();
+ this._linkTrackers = [];
+
+ this._isReady = false;
+ this._isDisposed = false;
+
+ this._core.configuration.events.addEventListener(ConfigurationEvent.LOADED, this.onConfigurationLoadedEvent.bind(this));
+ this._roomEngine.events.addEventListener(RoomEngineEvent.ENGINE_INITIALIZED, this.onRoomEngineReady.bind(this));
+ }
+
+ public static bootstrap(): void
+ {
+ if(Nitro.INSTANCE)
+ {
+ Nitro.INSTANCE.dispose();
+
+ Nitro.INSTANCE = null;
+ }
+
+ const canvas = document.createElement('canvas');
+
+ const instance = new this(new NitroCore(), {
+ autoDensity: false,
+ width: window.innerWidth,
+ height: window.innerHeight,
+ resolution: window.devicePixelRatio,
+ view: canvas
+ });
+
+ canvas.addEventListener('webglcontextlost', () => instance.events.dispatchEvent(new NitroEvent(Nitro.WEBGL_CONTEXT_LOST)));
+ }
+
+ public init(): void
+ {
+ if(this._isReady || this._isDisposed) return;
+
+ if(this._avatar) this._avatar.init();
+
+ if(this._soundManager) this._soundManager.init();
+
+ if(this._roomEngine)
+ {
+ this._roomEngine.sessionDataManager = this._sessionDataManager;
+ this._roomEngine.roomSessionManager = this._roomSessionManager;
+ this._roomEngine.roomManager = this._roomManager;
+
+ if(this._sessionDataManager) this._sessionDataManager.init();
+ if(this._roomSessionManager) this._roomSessionManager.init();
+
+ this._roomEngine.init();
+ }
+
+ if(!this._communication.connection)
+ {
+ throw new Error('No connection found');
+ }
+
+ new GameMessageHandler(this._communication.connection);
+
+ this._isReady = true;
+ }
+
+ public dispose(): void
+ {
+ if(this._isDisposed) return;
+
+ if(this._roomManager)
+ {
+ this._roomManager.dispose();
+
+ this._roomManager = null;
+ }
+
+ if(this._roomSessionManager)
+ {
+ this._roomSessionManager.dispose();
+
+ this._roomSessionManager = null;
+ }
+
+ if(this._sessionDataManager)
+ {
+ this._sessionDataManager.dispose();
+
+ this._sessionDataManager = null;
+ }
+
+ if(this._roomEngine)
+ {
+ this._roomEngine.dispose();
+
+ this._roomEngine = null;
+ }
+
+ if(this._avatar)
+ {
+ this._avatar.dispose();
+
+ this._avatar = null;
+ }
+
+ if(this._soundManager)
+ {
+ this._soundManager.dispose();
+
+ this._soundManager = null;
+ }
+
+ if(this._communication)
+ {
+ this._communication.dispose();
+
+ this._communication = null;
+ }
+
+ if(this._application)
+ {
+ this._application.destroy();
+
+ this._application = null;
+ }
+
+ this._isDisposed = true;
+ this._isReady = false;
+ }
+
+ private onConfigurationLoadedEvent(event: ConfigurationEvent): void
+ {
+ GetTicker().maxFPS = NitroConfiguration.getValue('system.fps.max', 24);
+
+ NitroLogger.LOG_DEBUG = NitroConfiguration.getValue('system.log.debug', true);
+ NitroLogger.LOG_WARN = NitroConfiguration.getValue('system.log.warn', false);
+ NitroLogger.LOG_ERROR = NitroConfiguration.getValue('system.log.error', false);
+ NitroLogger.LOG_EVENTS = NitroConfiguration.getValue('system.log.events', false);
+ NitroLogger.LOG_PACKETS = NitroConfiguration.getValue('system.log.packets', false);
+
+ LandscapeRasterizer.LANDSCAPES_ENABLED = NitroConfiguration.getValue('room.landscapes.enabled', true);
+ }
+
+ private onRoomEngineReady(event: RoomEngineEvent): void
+ {
+ this.startSendingHeartBeat();
+ }
+
+ public getConfiguration(key: string, value: T = null): T
+ {
+ return NitroConfiguration.getValue(key, value);
+ }
+
+ public getLocalization(key: string): string
+ {
+ return this._localization.getValue(key);
+ }
+
+ public getLocalizationWithParameter(key: string, parameter: string, replacement: string): string
+ {
+ return this._localization.getValueWithParameter(key, parameter, replacement);
+ }
+
+ public getLocalizationWithParameters(key: string, parameters: string[], replacements: string[]): string
+ {
+ return this._localization.getValueWithParameters(key, parameters, replacements);
+ }
+
+ public addLinkEventTracker(tracker: ILinkEventTracker): void
+ {
+ if(this._linkTrackers.indexOf(tracker) >= 0) return;
+
+ this._linkTrackers.push(tracker);
+ }
+
+ public removeLinkEventTracker(tracker: ILinkEventTracker): void
+ {
+ const index = this._linkTrackers.indexOf(tracker);
+
+ if(index === -1) return;
+
+ this._linkTrackers.splice(index, 1);
+ }
+
+ public createLinkEvent(link: string): void
+ {
+ if(!link || (link === '')) return;
+
+ for(const tracker of this._linkTrackers)
+ {
+ if(!tracker) continue;
+
+ const prefix = tracker.eventUrlPrefix;
+
+ if(prefix.length > 0)
+ {
+ if(link.substr(0, prefix.length) === prefix) tracker.linkReceived(link);
+ }
+ else
+ {
+ tracker.linkReceived(link);
+ }
+ }
+ }
+
+ private startSendingHeartBeat(): void
+ {
+ this.sendHeartBeat();
+
+ setInterval(this.sendHeartBeat, 10000);
+ }
+
+ private sendHeartBeat(): void
+ {
+ HabboWebTools.sendHeartBeat();
+ }
+
+ public get application(): Application
+ {
+ return this._application;
+ }
+
+ public get core(): INitroCore
+ {
+ return this._core;
+ }
+
+ public get events(): IEventDispatcher
+ {
+ return this._events;
+ }
+
+ public get localization(): INitroLocalizationManager
+ {
+ return this._localization;
+ }
+
+ public get communication(): INitroCommunicationManager
+ {
+ return this._communication;
+ }
+
+ public get avatar(): IAvatarRenderManager
+ {
+ return this._avatar;
+ }
+
+ public get roomEngine(): IRoomEngine
+ {
+ return this._roomEngine;
+ }
+
+ public get sessionDataManager(): ISessionDataManager
+ {
+ return this._sessionDataManager;
+ }
+
+ public get roomSessionManager(): IRoomSessionManager
+ {
+ return this._roomSessionManager;
+ }
+
+ public get roomManager(): IRoomManager
+ {
+ return this._roomManager;
+ }
+
+ public get cameraManager(): IRoomCameraWidgetManager
+ {
+ return this._cameraManager;
+ }
+
+ public get soundManager(): ISoundManager
+ {
+ return this._soundManager;
+ }
+
+ public get width(): number
+ {
+ return this._application.renderer.width;
+ }
+
+ public get height(): number
+ {
+ return this._application.renderer.height;
+ }
+
+ public get isReady(): boolean
+ {
+ return this._isReady;
+ }
+
+ public get isDisposed(): boolean
+ {
+ return this._isDisposed;
+ }
+
+ public static get instance(): INitro
+ {
+ return this.INSTANCE || null;
+ }
+}
diff --git a/submodules/renderer/src/nitro/Plugins.ts b/submodules/renderer/src/nitro/Plugins.ts
new file mode 100644
index 0000000..5cf5e8c
--- /dev/null
+++ b/submodules/renderer/src/nitro/Plugins.ts
@@ -0,0 +1,23 @@
+import '@pixi/canvas-display';
+import { BatchRenderer, extensions } from '@pixi/core';
+import { Extract } from '@pixi/extract';
+import '@pixi/graphics-extras';
+import { InteractionManager } from '@pixi/interaction';
+import { AppLoaderPlugin } from '@pixi/loaders';
+import '@pixi/math-extras';
+import '@pixi/mixin-cache-as-bitmap';
+import '@pixi/mixin-get-child-by-name';
+import '@pixi/mixin-get-global-position';
+import '@pixi/polyfill';
+import { TilingSpriteRenderer } from '@pixi/sprite-tiling';
+import { SpritesheetLoader } from '@pixi/spritesheet';
+import { TickerPlugin } from '@pixi/ticker';
+
+extensions.add(
+ BatchRenderer,
+ Extract,
+ TilingSpriteRenderer,
+ InteractionManager,
+ SpritesheetLoader,
+ AppLoaderPlugin,
+ TickerPlugin);
diff --git a/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadLibrary.ts b/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadLibrary.ts
new file mode 100644
index 0000000..f87d1b0
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadLibrary.ts
@@ -0,0 +1,72 @@
+import { IAssetManager, IAvatarAssetDownloadLibrary } from '../../api';
+import { EventDispatcher } from '../../core';
+import { AvatarRenderLibraryEvent } from '../../events';
+
+export class AvatarAssetDownloadLibrary extends EventDispatcher implements IAvatarAssetDownloadLibrary
+{
+ public static DOWNLOAD_COMPLETE: string = 'AADL_DOWNLOAD_COMPLETE';
+
+ private static NOT_LOADED: number = 0;
+ private static LOADING: number = 1;
+ private static LOADED: number = 2;
+
+ private _state: number;
+ private _libraryName: string;
+ private _revision: string;
+ private _downloadUrl: string;
+ private _assets: IAssetManager;
+
+ constructor(id: string, revision: string, assets: IAssetManager, assetUrl: string)
+ {
+ super();
+
+ this._state = AvatarAssetDownloadLibrary.NOT_LOADED;
+ this._libraryName = id;
+ this._revision = revision;
+ this._downloadUrl = assetUrl;
+ this._assets = assets;
+
+ this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName);
+ this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision);
+
+ const asset = this._assets.getCollection(this._libraryName);
+
+ if(asset) this._state = AvatarAssetDownloadLibrary.LOADED;
+ }
+
+ public async downloadAsset(): Promise
+ {
+ if(!this._assets || (this._state === AvatarAssetDownloadLibrary.LOADING) || (this._state === AvatarAssetDownloadLibrary.LOADED)) return;
+
+ const asset = this._assets.getCollection(this._libraryName);
+
+ if(asset)
+ {
+ this._state = AvatarAssetDownloadLibrary.LOADED;
+
+ this.dispatchEvent(new AvatarRenderLibraryEvent(AvatarRenderLibraryEvent.DOWNLOAD_COMPLETE, this));
+
+ return;
+ }
+
+ this._state = AvatarAssetDownloadLibrary.LOADING;
+
+ const status = await this._assets.downloadAsset(this._downloadUrl);
+
+ if(!status) return;
+
+ this._state = AvatarAssetDownloadLibrary.LOADED;
+
+ this.dispatchEvent(new AvatarRenderLibraryEvent(AvatarRenderLibraryEvent.DOWNLOAD_COMPLETE, this));
+ }
+
+ public get libraryName(): string
+ {
+ return this._libraryName;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return (this._state === AvatarAssetDownloadLibrary.LOADED);
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadManager.ts b/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadManager.ts
new file mode 100644
index 0000000..2580250
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarAssetDownloadManager.ts
@@ -0,0 +1,337 @@
+import { IAssetManager, IAvatarFigureContainer, IAvatarImageListener, INitroEvent, NitroConfiguration, NitroLogger } from '../../api';
+import { EventDispatcher } from '../../core';
+import { AvatarRenderEvent, AvatarRenderLibraryEvent, NitroEvent } from '../../events';
+import { AvatarAssetDownloadLibrary } from './AvatarAssetDownloadLibrary';
+import { AvatarStructure } from './AvatarStructure';
+
+export class AvatarAssetDownloadManager extends EventDispatcher
+{
+ public static DOWNLOADER_READY: string = 'AADM_DOWNLOADER_READY';
+ public static LIBRARY_LOADED: string = 'AADM_LIBRARY_LOADED';
+
+ private static MAX_DOWNLOADS: number = 2;
+
+ private _assets: IAssetManager;
+ private _structure: AvatarStructure;
+
+ private _missingMandatoryLibs: string[];
+ private _figureMap: Map;
+ private _pendingContainers: [IAvatarFigureContainer, IAvatarImageListener][];
+ private _figureListeners: Map;
+ private _incompleteFigures: Map;
+ private _pendingDownloadQueue: AvatarAssetDownloadLibrary[];
+ private _currentDownloads: AvatarAssetDownloadLibrary[];
+ private _libraryNames: string[];
+ private _isReady: boolean;
+
+ constructor(assets: IAssetManager, structure: AvatarStructure)
+ {
+ super();
+
+ this._assets = assets;
+ this._structure = structure;
+
+ this._missingMandatoryLibs = NitroConfiguration.getValue('avatar.mandatory.libraries');
+ this._figureMap = new Map();
+ this._pendingContainers = [];
+ this._figureListeners = new Map();
+ this._incompleteFigures = new Map();
+ this._pendingDownloadQueue = [];
+ this._currentDownloads = [];
+ this._libraryNames = [];
+ this._isReady = false;
+
+ this.onLibraryLoaded = this.onLibraryLoaded.bind(this);
+ this.onAvatarRenderReady = this.onAvatarRenderReady.bind(this);
+
+ this.loadFigureMap();
+
+ this._structure.renderManager.events.addEventListener(AvatarRenderEvent.AVATAR_RENDER_READY, this.onAvatarRenderReady);
+ }
+
+ private loadFigureMap(): void
+ {
+ const request = new XMLHttpRequest();
+
+ try
+ {
+ request.open('GET', NitroConfiguration.getValue('avatar.figuremap.url'));
+
+ request.send();
+
+ request.onloadend = e =>
+ {
+ if(request.responseText)
+ {
+ const data = JSON.parse(request.responseText);
+
+ this.processFigureMap(data.libraries);
+
+ this.processMissingLibraries();
+
+ this._isReady = true;
+
+ this.dispatchEvent(new NitroEvent(AvatarAssetDownloadManager.DOWNLOADER_READY));
+ }
+ };
+
+ request.onerror = e =>
+ {
+ throw new Error('invalid_avatar_figure_map');
+ };
+ }
+
+ catch (e)
+ {
+ NitroLogger.error(e);
+ }
+ }
+
+ private processFigureMap(data: any): void
+ {
+ if(!data) return;
+
+ for(const library of data)
+ {
+ if(!library) continue;
+
+ const id = (library.id as string);
+ const revision = (library.revision || '');
+
+ if(this._libraryNames.indexOf(id) >= 0) continue;
+
+ this._libraryNames.push(id);
+
+ const downloadLibrary = new AvatarAssetDownloadLibrary(id, revision, this._assets, NitroConfiguration.getValue('avatar.asset.url'));
+
+ downloadLibrary.addEventListener(AvatarRenderLibraryEvent.DOWNLOAD_COMPLETE, this.onLibraryLoaded);
+
+ 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 onAvatarRenderReady(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ for(const [container, listener] of this._pendingContainers)
+ {
+ this.downloadAvatarFigure(container, listener);
+ }
+
+ this._pendingContainers = [];
+ }
+
+ 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);
+
+ this.dispatchEvent(new NitroEvent(AvatarAssetDownloadManager.LIBRARY_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 processMissingLibraries(): void
+ {
+ const libraries = this._missingMandatoryLibs.slice();
+
+ for(const library of libraries)
+ {
+ if(!library) continue;
+
+ const map = this._figureMap.get(library);
+
+ if(map) for(const avatar of map) avatar && this.downloadLibrary(avatar);
+ }
+ }
+
+ public isAvatarFigureContainerReady(container: IAvatarFigureContainer): boolean
+ {
+ if(!this._isReady || !this._structure.renderManager.isReady)
+ {
+ return false;
+ }
+
+ const pendingLibraries = this.getAvatarFigurePendingLibraries(container);
+
+ return !pendingLibraries.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
+ {
+ if(!this._isReady || !this._structure.renderManager.isReady)
+ {
+ this._pendingContainers.push([container, listener]);
+
+ return;
+ }
+
+ 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;
+
+ this.downloadLibrary(library);
+ }
+ }
+ else
+ {
+ if(listener && !listener.disposed) listener.resetFigure(figure);
+ }
+ }
+
+ private downloadLibrary(library: AvatarAssetDownloadLibrary): void
+ {
+ if(!library || library.isLoaded) return;
+
+ if((this._pendingDownloadQueue.indexOf(library) >= 0) || (this._currentDownloads.indexOf(library) >= 0)) return;
+
+ this._pendingDownloadQueue.push(library);
+
+ this.processDownloadQueue();
+ }
+
+ private processDownloadQueue(): void
+ {
+ while(this._pendingDownloadQueue.length)
+ {
+ const library = this._pendingDownloadQueue[0];
+
+ library.downloadAsset();
+
+ this._currentDownloads.push(this._pendingDownloadQueue.shift());
+ }
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/AvatarFigureContainer.ts b/submodules/renderer/src/nitro/avatar/AvatarFigureContainer.ts
new file mode 100644
index 0000000..abef07b
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarFigureContainer.ts
@@ -0,0 +1,116 @@
+import { IAvatarFigureContainer } from '../../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/submodules/renderer/src/nitro/avatar/AvatarImage.ts b/submodules/renderer/src/nitro/avatar/AvatarImage.ts
new file mode 100644
index 0000000..30f15f4
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarImage.ts
@@ -0,0 +1,1100 @@
+import { RenderTexture, Texture } from '@pixi/core';
+import { Container } from '@pixi/display';
+import { ColorMatrixFilter } from '@pixi/filter-color-matrix';
+import { Rectangle } from '@pixi/math';
+import { Sprite } from '@pixi/sprite';
+import { AdvancedMap, AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActionDefinition, IActiveActionData, IAdvancedMap, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IGraphicAsset, IPartColor, ISpriteDataContainer } from '../../api';
+import { GetTickerTime, NitroContainer, NitroSprite, PaletteMapFilter, PixiApplicationProxy, TextureUtils } from '../../pixi-proxy';
+import { ActiveActionData } from './actions';
+import { AssetAliasCollection } from './alias';
+import { AvatarFigureContainer } from './AvatarFigureContainer';
+import { AvatarStructure } from './AvatarStructure';
+import { AvatarImageCache } from './cache';
+import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
+
+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 _structure: AvatarStructure;
+ protected _scale: string;
+ protected _mainDirection: number;
+ protected _headDirection: number;
+ protected _mainAction: IActiveActionData;
+ protected _disposed: boolean;
+ protected _canvasOffsets: number[];
+ protected _assets: AssetAliasCollection;
+ protected _cache: AvatarImageCache;
+ protected _figure: AvatarFigureContainer;
+ protected _avatarSpriteData: IAvatarDataContainer;
+ protected _actions: ActiveActionData[];
+ protected _image: RenderTexture;
+ protected _reusableTexture: RenderTexture;
+
+ private _defaultAction: IActiveActionData;
+ private _frameCounter: number = 0;
+ private _directionOffset: number = 0;
+ private _changes: boolean;
+ private _sprites: ISpriteDataContainer[];
+ private _isAnimating: boolean = false;
+ private _animationHasResetOnToggle: boolean = false;
+ private _actionsSorted: boolean = false;
+ private _sortedActions: IActiveActionData[];
+ private _lastActionsString: string;
+ private _currentActionsString: string;
+ private _fullImageCache: IAdvancedMap;
+ private _fullImageCacheSize: number = 5;
+ protected _isCachedImage: boolean = false;
+ private _useFullImageCache: boolean = false;
+ private _effectIdInUse: number = -1;
+ private _animationFrameCount: number;
+ private _cachedBodyParts: string[];
+ private _cachedBodyPartsDirection: number = -1;
+ private _cachedBodyPartsGeometryType: string = null;
+ private _cachedBodyPartsAvatarSet: string = null;
+ private _effectManager: EffectAssetDownloadManager;
+ private _effectListener: IAvatarEffectListener;
+
+ constructor(k: AvatarStructure, _arg_2: AssetAliasCollection, _arg_3: AvatarFigureContainer, _arg_4: string, _arg_5: EffectAssetDownloadManager, _arg_6: IAvatarEffectListener = null)
+ {
+ this._canvasOffsets = [];
+ this._actions = [];
+ this._cachedBodyParts = [];
+ this._changes = true;
+ this._disposed = false;
+ this._effectManager = _arg_5;
+ this._structure = k;
+ this._assets = _arg_2;
+ this._scale = _arg_4;
+ this._effectListener = _arg_6;
+ if(this._scale == null)
+ {
+ this._scale = AvatarScaleType.LARGE;
+ }
+ if(_arg_3 == null)
+ {
+ _arg_3 = new AvatarFigureContainer('hr-893-45.hd-180-2.ch-210-66.lg-270-82.sh-300-91.wa-2007-.ri-1-');
+ }
+ this._figure = _arg_3;
+ this._cache = new AvatarImageCache(this._structure, this, this._assets, this._scale);
+ this.setDirection(AvatarImage.DEFAULT_AVATAR_SET, AvatarImage.DEFAULT_DIRECTION);
+ this._actions = [];
+ this._defaultAction = new ActiveActionData(AvatarAction.POSTURE_STAND);
+ this._defaultAction.definition = this._structure.getActionDefinition(AvatarImage.DEFAULT_ACTION);
+ this.resetActions();
+ this._fullImageCache = new AdvancedMap();
+ this._animationFrameCount = 0;
+ }
+
+ public getServerRenderData(): any[]
+ {
+ this.getAvatarPartsForCamera(AvatarSetType.FULL);
+
+ return this._cache.getServerRenderData();
+ }
+
+ 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._image)
+ {
+ this._image.destroy();
+
+ this._image = null;
+ }
+
+ if(this._cache)
+ {
+ this._cache.dispose();
+ this._cache = null;
+ }
+
+ if(this._fullImageCache)
+ {
+ for(const k of this._fullImageCache.getValues()) (k && k.destroy());
+
+ this._fullImageCache = null;
+ }
+
+ this._image = 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(k: string, _arg_2: number): void
+ {
+ _arg_2 = (_arg_2 + this._directionOffset);
+
+ if(_arg_2 < AvatarDirectionAngle.MIN_DIRECTION)
+ {
+ _arg_2 = (AvatarDirectionAngle.MAX_DIRECTION + (_arg_2 + 1));
+ }
+
+ if(_arg_2 > AvatarDirectionAngle.MAX_DIRECTION)
+ {
+ _arg_2 = (_arg_2 - (AvatarDirectionAngle.MAX_DIRECTION + 1));
+ }
+
+ if(this._structure.isMainAvatarSet(k))
+ {
+ this._mainDirection = _arg_2;
+ }
+
+ if((k === AvatarSetType.HEAD) || (k === AvatarSetType.FULL))
+ {
+ if((k === AvatarSetType.HEAD) && (this.isHeadTurnPreventedByAction()))
+ {
+ _arg_2 = this._mainDirection;
+ }
+
+ this._headDirection = _arg_2;
+ }
+
+ this._cache.setDirection(k, _arg_2);
+ 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 getFullImageCacheKey(): string
+ {
+ if(!this._useFullImageCache) return null;
+
+ if(((this._sortedActions.length == 1) && (this._mainDirection == this._headDirection)))
+ {
+ return (this._mainDirection + this._currentActionsString) + (this._frameCounter % 4);
+ }
+
+ if(this._sortedActions.length == 2)
+ {
+ for(const k of this._sortedActions)
+ {
+ if(((k.actionType == 'fx') && ((((k.actionParameter == '33') || (k.actionParameter == '34')) || (k.actionParameter == '35')) || (k.actionParameter == '36'))))
+ {
+ return (this._mainDirection + this._currentActionsString) + 0;
+ }
+
+ if(((k.actionType == 'fx') && ((k.actionParameter == '38') || (k.actionParameter == '39'))))
+ {
+ return (((this._mainDirection + '_') + this._headDirection) + this._currentActionsString) + (this._frameCounter % 11);
+ }
+
+ if((k.actionType === 'dance') && ((k.actionParameter === '1') || (k.actionParameter === '2') || (k.actionParameter === '3') || (k.actionParameter === '4')))
+ {
+ let frame = (this._frameCounter % 8);
+
+ if((k.actionParameter === '3')) frame = (this._frameCounter % 10);
+
+ if((k.actionParameter === '4')) frame = (this._frameCounter % 16);
+
+ return (((this._mainDirection + k.actionType) + k.actionParameter) + frame);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private getBodyParts(k: string, _arg_2: string, _arg_3: number): string[]
+ {
+ if((((!(_arg_3 == this._cachedBodyPartsDirection)) || (!(_arg_2 == this._cachedBodyPartsGeometryType))) || (!(k == this._cachedBodyPartsAvatarSet))))
+ {
+ this._cachedBodyPartsDirection = _arg_3;
+ this._cachedBodyPartsGeometryType = _arg_2;
+ this._cachedBodyPartsAvatarSet = k;
+ this._cachedBodyParts = this._structure.getBodyParts(k, _arg_2, _arg_3);
+ }
+ return this._cachedBodyParts;
+ }
+
+ public getAvatarPartsForCamera(k: string): void
+ {
+ let _local_4: string;
+ if(this._mainAction == null)
+ {
+ return;
+ }
+ const _local_2 = this._structure.getCanvas(this._scale, this._mainAction.definition.geometryType);
+ if(_local_2 == null)
+ {
+ return;
+ }
+ const _local_3 = this.getBodyParts(k, this._mainAction.definition.geometryType, this._mainDirection);
+ let _local_6 = (_local_3.length - 1);
+ while(_local_6 >= 0)
+ {
+ _local_4 = _local_3[_local_6];
+ const _local_5 = this._cache.getImageContainer(_local_4, this._frameCounter, true);
+ _local_6--;
+ }
+ }
+
+ public getImage(setType: string, hightlight: boolean, scale: number = 1, cache: boolean = true): RenderTexture
+ {
+ if(!this._changes) return this._image;
+
+ 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;
+
+ if(this._image && ((this._image.width !== avatarCanvas.width) || (this._image.height !== avatarCanvas.height)))
+ {
+ if(this._reusableTexture)
+ {
+ this._reusableTexture.destroy(true);
+
+ this._reusableTexture = null;
+ }
+
+ this._image = null;
+ this._isCachedImage = false;
+ }
+
+ const _local_6 = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection);
+
+ this._image = null;
+
+ const container = new NitroContainer();
+
+ let isCachable = true;
+ let partCount = (_local_6.length - 1);
+
+ while(partCount >= 0)
+ {
+ const set = _local_6[partCount];
+ const part = this._cache.getImageContainer(set, this._frameCounter);
+
+ if(part)
+ {
+ const partCacheContainer = part.image;
+
+ if(!partCacheContainer)
+ {
+ container.destroy({
+ children: true
+ });
+
+ return null;
+ }
+
+ isCachable = ((isCachable) && (part.isCacheable));
+
+ const point = part.regPoint.clone();
+
+ if(point)
+ {
+ point.x += avatarCanvas.offset.x;
+ point.y += avatarCanvas.offset.y;
+
+ point.x += avatarCanvas.regPoint.x;
+ point.y += avatarCanvas.regPoint.y;
+
+ const partContainer = new NitroContainer();
+
+ partContainer.addChild(partCacheContainer);
+
+ if(partContainer)
+ {
+ partContainer.position.set(point.x, point.y);
+
+ container.addChild(partContainer);
+ }
+ }
+ }
+
+ partCount--;
+ }
+
+ if(this._avatarSpriteData)
+ {
+ if(!container.filters) container.filters = [];
+
+ if(this._avatarSpriteData.colorTransform) container.filters.push(this._avatarSpriteData.colorTransform);
+
+ if(this._avatarSpriteData.paletteIsGrayscale)
+ {
+ this.convertToGrayscale(container);
+
+ container.filters.push(new PaletteMapFilter(this._avatarSpriteData.reds, PaletteMapFilter.CHANNEL_RED));
+ }
+ }
+
+ if(!cache)
+ {
+ return TextureUtils.generateTexture(container, new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height));
+ }
+
+ if(this._reusableTexture)
+ {
+ PixiApplicationProxy.instance.renderer.render(container, {
+ renderTexture: this._reusableTexture,
+ clear: true
+ });
+
+ //@ts-ignore
+ this._reusableTexture.baseTexture.hitMap = null;
+ }
+ else
+ {
+ this._reusableTexture = TextureUtils.generateTexture(container, new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height));
+ }
+
+ if(!this._reusableTexture) return null;
+
+ /*
+ if(this._avatarSpriteData)
+ {
+ if(this._avatarSpriteData.paletteIsGrayscale)
+ {
+ this._reusableTexture = this.applyPalette(this._reusableTexture, this._avatarSpriteData.reds, [], []);
+ }
+ }
+ */
+
+ this._image = this._reusableTexture;
+ this._changes = false;
+
+ return this._image;
+ }
+
+ 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));
+
+ PixiApplicationProxy.instance.renderer.render(newTexture, {
+ renderTexture: texture,
+ clear: true
+ });
+
+ return texture;
+ }
+
+ public getImageAsSprite(setType: string, scale: number = 1): Sprite
+ {
+ 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 setTypes = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection);
+ const container = new NitroSprite();
+ const sprite = new NitroSprite(Texture.EMPTY);
+
+ sprite.width = avatarCanvas.width;
+ sprite.height = avatarCanvas.height;
+
+ container.addChild(sprite);
+
+ let partCount = (setTypes.length - 1);
+
+ while(partCount >= 0)
+ {
+ const set = setTypes[partCount];
+ const part = this._cache.getImageContainer(set, this._frameCounter);
+
+ if(part)
+ {
+ const partCacheContainer = part.image;
+
+ if(!partCacheContainer)
+ {
+ container.destroy({
+ children: true
+ });
+
+ return null;
+ }
+
+ const point = part.regPoint.clone();
+
+ if(point)
+ {
+ point.x += avatarCanvas.offset.x;
+ point.y += avatarCanvas.offset.y;
+
+ point.x += avatarCanvas.regPoint.x;
+ point.y += avatarCanvas.regPoint.y;
+
+ const partContainer = new NitroContainer();
+
+ partContainer.addChild(partCacheContainer);
+
+ partContainer.position.set(point.x, point.y);
+
+ container.addChild(partContainer);
+ }
+ }
+
+ partCount--;
+ }
+
+ return container;
+ }
+
+ public getCroppedImage(setType: string, scale: number = 1): HTMLImageElement
+ {
+ 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 setTypes = this.getBodyParts(setType, this._mainAction.definition.geometryType, this._mainDirection);
+ const container = new NitroContainer();
+
+ let partCount = (setTypes.length - 1);
+
+ while(partCount >= 0)
+ {
+ const set = setTypes[partCount];
+ const part = this._cache.getImageContainer(set, this._frameCounter);
+
+ if(part)
+ {
+ const partCacheContainer = part.image;
+
+ if(!partCacheContainer)
+ {
+ container.destroy({
+ children: true
+ });
+
+ return null;
+ }
+
+ const point = part.regPoint.clone();
+
+ if(point)
+ {
+ point.x += avatarCanvas.offset.x;
+ point.y += avatarCanvas.offset.y;
+
+ point.x += avatarCanvas.regPoint.x;
+ point.y += avatarCanvas.regPoint.y;
+
+ const partContainer = new NitroContainer();
+
+ partContainer.addChild(partCacheContainer);
+
+ if(partContainer)
+ {
+ partContainer.position.set(point.x, point.y);
+
+ container.addChild(partContainer);
+ }
+ }
+ }
+
+ partCount--;
+ }
+
+ const texture = TextureUtils.generateTexture(container, new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height));
+
+ const image = TextureUtils.generateImage(texture);
+
+ if(!image) return null;
+
+ return image;
+ }
+
+ protected getFullImage(k: string): RenderTexture
+ {
+ const existing = this._fullImageCache.getValue(k);
+
+ if(existing)
+ {
+ if(!existing.valid)
+ {
+ this._fullImageCache.remove(k);
+
+ existing.destroy(true);
+ }
+
+ return existing;
+ }
+
+ return null;
+ }
+
+ protected cacheFullImage(k: string, _arg_2: RenderTexture): void
+ {
+ const existing = this._fullImageCache.getValue(k);
+
+ if(existing)
+ {
+ this._fullImageCache.remove(k);
+
+ existing.destroy(true);
+ }
+
+ if(this._fullImageCache.length === this._fullImageCacheSize)
+ {
+ const oldestKey = this._fullImageCache.getKey(0);
+
+ if(oldestKey)
+ {
+ const removed = this._fullImageCache.remove(oldestKey);
+
+ removed.destroy(true);
+ }
+ }
+
+ this._fullImageCache.add(k, _arg_2);
+ }
+
+ public getAsset(k: string): IGraphicAsset
+ {
+ return this._assets.getAsset(k);
+ }
+
+ public getDirection(): number
+ {
+ return this._mainDirection;
+ }
+
+ public initActionAppends(): void
+ {
+ this._actions = [];
+ this._actionsSorted = false;
+ this._currentActionsString = '';
+ this._useFullImageCache = false;
+ }
+
+ public endActionAppends(): void
+ {
+ let k: ActiveActionData;
+
+ 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._useFullImageCache = true;
+ this._useFullImageCache = true;
+ }
+
+ 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._useFullImageCache = true;
+ }
+ }
+
+ 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(k: string, _arg_2: string = ''): void
+ {
+ let _local_3: ActiveActionData;
+ if(!this._actions) this._actions = [];
+
+ let _local_4 = 0;
+ while(_local_4 < this._actions.length)
+ {
+ _local_3 = this._actions[_local_4];
+ if(((_local_3.actionType == k) && (_local_3.actionParameter == _arg_2)))
+ {
+ return;
+ }
+ _local_4++;
+ }
+ this._actions.push(new ActiveActionData(k, _arg_2, 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
+ {
+ let _local_2: IActionDefinition;
+ let _local_3: ActiveActionData;
+ let k: boolean;
+ if(this._sortedActions == null)
+ {
+ return false;
+ }
+ for(const _local_3 of this._sortedActions)
+ {
+ _local_2 = this._structure.getActionDefinitionWithState(_local_3.actionType);
+ if(((!(_local_2 == null)) && (_local_2.getPreventHeadTurn(_local_3.actionParameter))))
+ {
+ k = true;
+ }
+ }
+ return k;
+ }
+
+ private sortActions(): boolean
+ {
+ let _local_2: boolean;
+ let _local_3: boolean;
+ let _local_4: ActiveActionData;
+ let _local_5: number;
+ let k: boolean;
+
+ 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 !== '')
+ {
+ k = true;
+
+ this._lastActionsString = '';
+ }
+ }
+ else
+ {
+ this._canvasOffsets = this._structure.getCanvasOffsets(this._sortedActions, this._scale, this._mainDirection);
+
+ for(const _local_4 of this._sortedActions)
+ {
+ this._currentActionsString = (this._currentActionsString + (_local_4.actionType + _local_4.actionParameter));
+
+ if(_local_4.actionType === AvatarAction.EFFECT)
+ {
+ const _local_5 = parseInt(_local_4.actionParameter);
+
+ if(this._effectIdInUse !== _local_5) _local_2 = true;
+
+ this._effectIdInUse = _local_5;
+
+ _local_3 = true;
+ }
+ }
+
+ if(!_local_3)
+ {
+ if(this._effectIdInUse > -1) _local_2 = true;
+
+ this._effectIdInUse = -1;
+ }
+
+ if(_local_2) this._cache.disposeInactiveActions(0);
+
+ if(this._lastActionsString != this._currentActionsString)
+ {
+ k = true;
+
+ this._lastActionsString = this._currentActionsString;
+ }
+ }
+
+ this._actionsSorted = true;
+
+ return k;
+ }
+
+ private setActionsToParts(): void
+ {
+ if(!this._sortedActions == null) return;
+
+ const _local_3: number = GetTickerTime();
+ const _local_4: string[] = [];
+
+ for(const k of this._sortedActions) _local_4.push(k.actionType);
+
+ for(const k of this._sortedActions)
+ {
+ if((k && k.definition) && k.definition.isAnimation)
+ {
+ const _local_2 = this._structure.getAnimation(((k.definition.state + '.') + k.actionParameter));
+
+ if(_local_2 && _local_2.hasOverriddenActions())
+ {
+ const _local_5 = _local_2.overriddenActionNames();
+
+ if(_local_5)
+ {
+ for(const _local_6 of _local_5)
+ {
+ if(_local_4.indexOf(_local_6) >= 0) k.overridingAction = _local_2.overridingAction(_local_6);
+ }
+ }
+ }
+
+ if(_local_2 && _local_2.resetOnToggle)
+ {
+ this._animationHasResetOnToggle = true;
+ }
+ }
+ }
+
+ for(const k of this._sortedActions)
+ {
+ if(!((!(k)) || (!(k.definition))))
+ {
+ if(k.definition.isAnimation && (k.actionParameter === '')) k.actionParameter = '1';
+
+ this.setActionToParts(k, _local_3);
+
+ if(k.definition.isAnimation)
+ {
+ this._isAnimating = k.definition.isAnimated(k.actionParameter);
+
+ const _local_2 = this._structure.getAnimation(((k.definition.state + '.') + k.actionParameter));
+
+ if(_local_2)
+ {
+ this._sprites = this._sprites.concat(_local_2.spriteData);
+
+ if(_local_2.hasDirectionData()) this._directionOffset = _local_2.directionData.offset;
+
+ if(_local_2.hasAvatarData()) this._avatarSpriteData = _local_2.avatarData;
+ }
+ }
+ }
+ }
+ }
+
+ private setActionToParts(k: IActiveActionData, _arg_2: number): void
+ {
+ if(((k == null) || (k.definition == null)))
+ {
+ return;
+ }
+ if(k.definition.assetPartDefinition == '')
+ {
+ return;
+ }
+ if(k.definition.isMain)
+ {
+ this._mainAction = k;
+ this._cache.setGeometryType(k.definition.geometryType);
+ }
+ this._cache.setAction(k, _arg_2);
+ this._changes = true;
+ }
+
+ private resetBodyPartCache(k: IActiveActionData): void
+ {
+ if(!k) return;
+
+ if(k.definition.assetPartDefinition === '') return;
+
+ if(k.definition.isMain)
+ {
+ this._mainAction = k;
+ this._cache.setGeometryType(k.definition.geometryType);
+ }
+
+ this._cache.resetBodyPartCache(k);
+ this._changes = true;
+ }
+
+ public get avatarSpriteData(): IAvatarDataContainer
+ {
+ return this._avatarSpriteData;
+ }
+
+ private convertToGrayscale(container: Container, channel: string = 'CHANNELS_EQUAL'): Container
+ {
+ let _local_3 = 0.33;
+ let _local_4 = 0.33;
+ let _local_5 = 0.33;
+ const _local_6 = 1;
+
+ switch(channel)
+ {
+ case AvatarImage.CHANNELS_UNIQUE:
+ _local_3 = 0.3;
+ _local_4 = 0.59;
+ _local_5 = 0.11;
+ break;
+ case AvatarImage.CHANNELS_RED:
+ _local_3 = 1;
+ _local_4 = 0;
+ _local_5 = 0;
+ break;
+ case AvatarImage.CHANNELS_GREEN:
+ _local_3 = 0;
+ _local_4 = 1;
+ _local_5 = 0;
+ break;
+ case AvatarImage.CHANNELS_BLUE:
+ _local_3 = 0;
+ _local_4 = 0;
+ _local_5 = 1;
+ break;
+ case AvatarImage.CHANNELS_DESATURATED:
+ _local_3 = 0.3086;
+ _local_4 = 0.6094;
+ _local_5 = 0.082;
+ break;
+ }
+
+ const colorFilter = new ColorMatrixFilter();
+
+ colorFilter.matrix = [_local_3, _local_4, _local_5, 0, 0, _local_3, _local_4, _local_5, 0, 0, _local_3, _local_4, _local_5, 0, 0, 0, 0, 0, 1, 0];
+
+ container.filters.push(colorFilter);
+
+ return container;
+ }
+
+ private errorThis(k: string): void
+ {
+ }
+
+ private logThis(k: string): void
+ {
+ }
+
+ public isPlaceholder(): boolean
+ {
+ return false;
+ }
+
+ public forceActionUpdate(): void
+ {
+ this._lastActionsString = '';
+ }
+
+ public get animationHasResetOnToggle(): boolean
+ {
+ return this._animationHasResetOnToggle;
+ }
+
+ public get mainAction(): string
+ {
+ return this._mainAction.actionType;
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/AvatarImageBodyPartContainer.ts b/submodules/renderer/src/nitro/avatar/AvatarImageBodyPartContainer.ts
new file mode 100644
index 0000000..6ef966f
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarImageBodyPartContainer.ts
@@ -0,0 +1,89 @@
+import { Container } from '@pixi/display';
+import { Point } from '@pixi/math';
+
+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/submodules/renderer/src/nitro/avatar/AvatarImagePartContainer.ts b/submodules/renderer/src/nitro/avatar/AvatarImagePartContainer.ts
new file mode 100644
index 0000000..a632ab7
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarImagePartContainer.ts
@@ -0,0 +1,136 @@
+import { IActionDefinition, IPartColor } from '../../api';
+import { AdjustmentFilter } from '../../pixi-proxy';
+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 _blendTransform: AdjustmentFilter;
+ 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;
+ this._blendTransform = null;
+
+ 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/submodules/renderer/src/nitro/avatar/AvatarRenderManager.ts b/submodules/renderer/src/nitro/avatar/AvatarRenderManager.ts
new file mode 100644
index 0000000..8249966
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarRenderManager.ts
@@ -0,0 +1,468 @@
+import { AvatarSetType, GetAssetManager, IAssetManager, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IAvatarImageListener, IAvatarRenderManager, IFigureData, IFigurePartSet, IFigureSetData, IGraphicAsset, INitroEvent, IStructureData, NitroConfiguration, NitroLogger } from '../../api';
+import { NitroManager } from '../../core';
+import { AvatarRenderEvent, NitroEvent } from '../../events';
+import { FigureDataContainer } from '../utils';
+import { AssetAliasCollection } from './alias';
+import { AvatarAssetDownloadManager } from './AvatarAssetDownloadManager';
+import { AvatarFigureContainer } from './AvatarFigureContainer';
+import { AvatarImage } from './AvatarImage';
+import { AvatarStructure } from './AvatarStructure';
+import { HabboAvatarAnimations } from './data/HabboAvatarAnimations';
+import { HabboAvatarGeometry } from './data/HabboAvatarGeometry';
+import { HabboAvatarPartSets } from './data/HabboAvatarPartSets';
+import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
+import { PlaceHolderAvatarImage } from './PlaceHolderAvatarImage';
+import { AvatarStructureDownload } from './structure';
+
+export class AvatarRenderManager extends NitroManager implements IAvatarRenderManager
+{
+ private static DEFAULT_FIGURE: string = 'hd-99999-99999';
+
+ private _aliasCollection: AssetAliasCollection;
+
+ private _structure: AvatarStructure;
+ private _avatarAssetDownloadManager: AvatarAssetDownloadManager;
+ private _effectAssetDownloadManager: EffectAssetDownloadManager;
+
+ private _placeHolderFigure: AvatarFigureContainer;
+
+ private _figureMapReady: boolean;
+ private _effectMapReady: boolean;
+ private _actionsReady: boolean;
+ private _structureReady: boolean;
+ private _geometryReady: boolean;
+ private _partSetsReady: boolean;
+ private _animationsReady: boolean;
+ private _isReady: boolean;
+
+ constructor()
+ {
+ super();
+
+ this._structure = null;
+ this._avatarAssetDownloadManager = null;
+
+ this._placeHolderFigure = null;
+
+ this._figureMapReady = false;
+ this._effectMapReady = false;
+ this._actionsReady = false;
+ this._geometryReady = false;
+ this._partSetsReady = false;
+ this._animationsReady = false;
+ this._isReady = false;
+
+ this.onAvatarAssetDownloaderReady = this.onAvatarAssetDownloaderReady.bind(this);
+ this.onAvatarAssetDownloaded = this.onAvatarAssetDownloaded.bind(this);
+ this.onEffectAssetDownloaderReady = this.onEffectAssetDownloaderReady.bind(this);
+ this.onEffectAssetDownloaded = this.onEffectAssetDownloaded.bind(this);
+ this.onAvatarStructureDownloadDone = this.onAvatarStructureDownloadDone.bind(this);
+ }
+
+ public onInit(): void
+ {
+ this._structure = new AvatarStructure(this);
+
+ this.loadGeometry();
+ this.loadPartSets();
+ this.loadActions();
+ this.loadAnimations();
+ this.loadFigureData();
+
+ this._aliasCollection = new AssetAliasCollection(this, GetAssetManager());
+
+ this._aliasCollection.init();
+
+ if(!this._avatarAssetDownloadManager)
+ {
+ this._avatarAssetDownloadManager = new AvatarAssetDownloadManager(GetAssetManager(), this._structure);
+
+ this._avatarAssetDownloadManager.addEventListener(AvatarAssetDownloadManager.DOWNLOADER_READY, this.onAvatarAssetDownloaderReady);
+ this._avatarAssetDownloadManager.addEventListener(AvatarAssetDownloadManager.LIBRARY_LOADED, this.onAvatarAssetDownloaded);
+ }
+
+ if(!this._effectAssetDownloadManager)
+ {
+ this._effectAssetDownloadManager = new EffectAssetDownloadManager(GetAssetManager(), this._structure);
+
+ this._effectAssetDownloadManager.addEventListener(EffectAssetDownloadManager.DOWNLOADER_READY, this.onEffectAssetDownloaderReady);
+ this._effectAssetDownloadManager.addEventListener(EffectAssetDownloadManager.LIBRARY_LOADED, this.onEffectAssetDownloaded);
+ }
+
+ this.checkReady();
+ }
+
+ public onDispose(): void
+ {
+ if(this._avatarAssetDownloadManager)
+ {
+ this._avatarAssetDownloadManager.removeEventListener(AvatarAssetDownloadManager.DOWNLOADER_READY, this.onAvatarAssetDownloaderReady);
+
+ this._avatarAssetDownloadManager.removeEventListener(AvatarAssetDownloadManager.LIBRARY_LOADED, this.onAvatarAssetDownloaded);
+ }
+
+ if(this._effectAssetDownloadManager)
+ {
+ this._effectAssetDownloadManager.removeEventListener(EffectAssetDownloadManager.DOWNLOADER_READY, this.onEffectAssetDownloaderReady);
+
+ this._effectAssetDownloadManager.removeEventListener(EffectAssetDownloadManager.LIBRARY_LOADED, this.onEffectAssetDownloaded);
+ }
+ }
+
+ private loadGeometry(): void
+ {
+ if(!this._structure) return;
+
+ this._structure.initGeometry(HabboAvatarGeometry.geometry);
+
+ this._geometryReady = true;
+
+ this.checkReady();
+ }
+
+ private loadPartSets(): void
+ {
+ if(!this._structure) return;
+
+ this._structure.initPartSets(HabboAvatarPartSets.partSets);
+
+ this._partSetsReady = true;
+
+ this.checkReady();
+ }
+
+ private loadActions(): void
+ {
+ const defaultActions = NitroConfiguration.getValue('avatar.default.actions');
+
+ if(defaultActions) this._structure.initActions(GetAssetManager(), defaultActions);
+
+ const request = new XMLHttpRequest();
+
+ try
+ {
+ request.open('GET', NitroConfiguration.getValue('avatar.actions.url'));
+
+ request.send();
+
+ request.onloadend = e =>
+ {
+ if(!this._structure) return;
+
+ this._structure.updateActions(JSON.parse(request.responseText));
+
+ this._actionsReady = true;
+
+ this.checkReady();
+ };
+
+ request.onerror = e =>
+ {
+ throw new Error('invalid_avatar_actions');
+ };
+ }
+
+ catch (e)
+ {
+ NitroLogger.error(e);
+ }
+ }
+
+ private loadAnimations(): void
+ {
+ if(!this._structure) return;
+
+ this._structure.initAnimation(HabboAvatarAnimations.animations);
+
+ this._animationsReady = true;
+
+ this.checkReady();
+ }
+
+ private loadFigureData(): void
+ {
+ const defaultFigureData = NitroConfiguration.getValue('avatar.default.figuredata');
+
+ if(!defaultFigureData || (typeof defaultFigureData === 'string'))
+ {
+ NitroLogger.error('XML figuredata is no longer supported');
+
+ return;
+ }
+
+ if(this._structure) this._structure.initFigureData(defaultFigureData);
+
+ const structureDownloader = new AvatarStructureDownload(NitroConfiguration.getValue('avatar.figuredata.url'), (this._structure.figureData as IFigureSetData));
+
+ structureDownloader.addEventListener(AvatarStructureDownload.AVATAR_STRUCTURE_DONE, this.onAvatarStructureDownloadDone);
+ }
+
+ private onAvatarStructureDownloadDone(event: INitroEvent): void
+ {
+ this._structureReady = true;
+
+ this._structure.init();
+
+ this.checkReady();
+ }
+
+ private onAvatarAssetDownloaderReady(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ this._figureMapReady = true;
+
+ this.checkReady();
+ }
+
+ private onAvatarAssetDownloaded(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ this._aliasCollection.reset();
+ }
+
+ private onEffectAssetDownloaderReady(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ this._effectMapReady = true;
+
+ this.checkReady();
+ }
+
+ private onEffectAssetDownloaded(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ this._aliasCollection.reset();
+ }
+
+ private checkReady(): void
+ {
+ if(this._isReady) return;
+
+ if(!this._geometryReady || !this._partSetsReady || !this._actionsReady || !this._animationsReady || !this._figureMapReady || !this._effectMapReady || !this._structureReady) return;
+
+ this._isReady = true;
+
+ if(this.events) this.events.dispatchEvent(new NitroEvent(AvatarRenderEvent.AVATAR_RENDER_READY));
+ }
+
+ 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);
+ }
+
+ if(!this._placeHolderFigure) this._placeHolderFigure = new AvatarFigureContainer(AvatarRenderManager.DEFAULT_FIGURE);
+
+ 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 isReady(): boolean
+ {
+ return this._isReady;
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/AvatarStructure.ts b/submodules/renderer/src/nitro/avatar/AvatarStructure.ts
new file mode 100644
index 0000000..4d8d0eb
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/AvatarStructure.ts
@@ -0,0 +1,635 @@
+import { Point } from '@pixi/math';
+import { AvatarDirectionAngle, IActionDefinition, IActiveActionData, IAssetAnimation, IAssetManager, IAvatarFigureContainer, IAvatarImage, IAvatarRenderManager, IFigureData, IFigurePartSet, IPartColor, IStructureData } from '../../api';
+import { EventDispatcher } from '../../core';
+import { ActionDefinition, AvatarActionManager } from './actions';
+import { Animation, AnimationManager, AvatarAnimationLayerData } from './animation';
+import { AvatarImagePartContainer } from './AvatarImagePartContainer';
+import { AvatarRenderManager } from './AvatarRenderManager';
+import { AvatarModelGeometry } from './geometry';
+import { AnimationAction, AvatarAnimationData, AvatarAnimationFrame, AvatarCanvas, FigureSetData, PartSetsData } from './structure';
+
+export class AvatarStructure extends EventDispatcher
+{
+ 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)
+ {
+ super();
+
+ 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 dispose(): void
+ {
+ if(this.disposed) return;
+
+ super.dispose();
+
+ this._renderManager = null;
+ this._figureData = null;
+ this._partSetsData = null;
+ this._animationData = null;
+ this._mandatorySetTypeIds = null;
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/EffectAssetDownloadLibrary.ts b/submodules/renderer/src/nitro/avatar/EffectAssetDownloadLibrary.ts
new file mode 100644
index 0000000..04b1ba7
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/EffectAssetDownloadLibrary.ts
@@ -0,0 +1,83 @@
+import { IAssetAnimation, IAssetManager, IEffectAssetDownloadLibrary } from '../../api';
+import { EventDispatcher } from '../../core';
+import { AvatarRenderEffectLibraryEvent } from '../../events';
+
+export class EffectAssetDownloadLibrary extends EventDispatcher 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;
+ private _libraryName: string;
+ private _revision: string;
+ private _downloadUrl: string;
+ private _assets: IAssetManager;
+ private _animation: { [index: string]: IAssetAnimation };
+
+ constructor(id: string, revision: string, assets: IAssetManager, assetUrl: string)
+ {
+ super();
+
+ this._state = EffectAssetDownloadLibrary.NOT_LOADED;
+ this._libraryName = id;
+ this._revision = revision;
+ this._downloadUrl = assetUrl;
+ this._assets = assets;
+ this._animation = null;
+
+ this._downloadUrl = this._downloadUrl.replace(/%libname%/gi, this._libraryName);
+ this._downloadUrl = this._downloadUrl.replace(/%revision%/gi, this._revision);
+
+ const asset = this._assets.getCollection(this._libraryName);
+
+ if(asset) this._state = EffectAssetDownloadLibrary.LOADED;
+ }
+
+ public async downloadAsset(): Promise
+ {
+ if(!this._assets || (this._state === EffectAssetDownloadLibrary.LOADING) || (this._state === EffectAssetDownloadLibrary.LOADED)) return;
+
+ const asset = this._assets.getCollection(this._libraryName);
+
+ if(asset)
+ {
+ this._state = EffectAssetDownloadLibrary.LOADED;
+
+ this.dispatchEvent(new AvatarRenderEffectLibraryEvent(AvatarRenderEffectLibraryEvent.DOWNLOAD_COMPLETE, this));
+
+ return;
+ }
+
+ this._state = EffectAssetDownloadLibrary.LOADING;
+
+ const status = await this._assets.downloadAsset(this._downloadUrl);
+
+ if(!status) return;
+
+ this._state = EffectAssetDownloadLibrary.LOADED;
+
+ const collection = this._assets.getCollection(this._libraryName);
+
+ if(collection) this._animation = collection.data.animations;
+
+ this.dispatchEvent(new AvatarRenderEffectLibraryEvent(AvatarRenderEffectLibraryEvent.DOWNLOAD_COMPLETE, this));
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/EffectAssetDownloadManager.ts b/submodules/renderer/src/nitro/avatar/EffectAssetDownloadManager.ts
new file mode 100644
index 0000000..4d46c1d
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/EffectAssetDownloadManager.ts
@@ -0,0 +1,297 @@
+import { IAssetManager, IAvatarEffectListener, INitroEvent, NitroConfiguration, NitroLogger } from '../../api';
+import { EventDispatcher } from '../../core';
+import { AvatarRenderEffectLibraryEvent, AvatarRenderEvent, NitroEvent } from '../../events';
+import { AvatarStructure } from './AvatarStructure';
+import { EffectAssetDownloadLibrary } from './EffectAssetDownloadLibrary';
+
+export class EffectAssetDownloadManager extends EventDispatcher
+{
+ public static DOWNLOADER_READY: string = 'EADM_DOWNLOADER_READY';
+ public static LIBRARY_LOADED: string = 'EADM_LIBRARY_LOADED';
+
+ private static MAX_DOWNLOADS: number = 2;
+
+ private _assets: IAssetManager;
+ private _structure: AvatarStructure;
+
+ private _missingMandatoryLibs: string[];
+ private _effectMap: Map;
+ private _initDownloadBuffer: [number, IAvatarEffectListener][];
+ private _effectListeners: Map;
+ private _incompleteEffects: Map;
+ private _pendingDownloadQueue: EffectAssetDownloadLibrary[];
+ private _currentDownloads: EffectAssetDownloadLibrary[];
+ private _libraryNames: string[];
+ private _isReady: boolean;
+
+ constructor(assets: IAssetManager, structure: AvatarStructure)
+ {
+ super();
+
+ this._assets = assets;
+ this._structure = structure;
+
+ this._missingMandatoryLibs = NitroConfiguration.getValue('avatar.mandatory.effect.libraries');
+ this._effectMap = new Map();
+ this._effectListeners = new Map();
+ this._incompleteEffects = new Map();
+ this._initDownloadBuffer = [];
+ this._pendingDownloadQueue = [];
+ this._currentDownloads = [];
+ this._libraryNames = [];
+ this._isReady = false;
+
+ this.onLibraryLoaded = this.onLibraryLoaded.bind(this);
+ this.onAvatarRenderReady = this.onAvatarRenderReady.bind(this);
+
+ this.loadEffectMap();
+
+ this._structure.renderManager.events.addEventListener(AvatarRenderEvent.AVATAR_RENDER_READY, this.onAvatarRenderReady);
+ }
+
+ private loadEffectMap(): void
+ {
+ const request = new XMLHttpRequest();
+
+ try
+ {
+ request.open('GET', NitroConfiguration.getValue('avatar.effectmap.url'));
+
+ request.send();
+
+ request.onloadend = e =>
+ {
+ if(request.responseText)
+ {
+ const data = JSON.parse(request.responseText);
+
+ this.processEffectMap(data.effects);
+
+ this.processMissingLibraries();
+
+ this._isReady = true;
+
+ this.dispatchEvent(new NitroEvent(EffectAssetDownloadManager.DOWNLOADER_READY));
+ }
+ };
+
+ request.onerror = e =>
+ {
+ throw new Error('invalid_avatar_effect_map');
+ };
+ }
+
+ catch (e)
+ {
+ NitroLogger.error(e);
+ }
+ }
+
+ private processEffectMap(data: any): void
+ {
+ if(!data) return;
+
+ for(const effect of data)
+ {
+ if(!effect) continue;
+
+ const id = (effect.id as string);
+ const lib = (effect.lib as string);
+ const revision = (effect.revision || '');
+
+ if(this._libraryNames.indexOf(lib) >= 0) continue;
+
+ this._libraryNames.push(lib);
+
+ const downloadLibrary = new EffectAssetDownloadLibrary(lib, revision, this._assets, NitroConfiguration.getValue('avatar.asset.effect.url'));
+
+ downloadLibrary.addEventListener(AvatarRenderEffectLibraryEvent.DOWNLOAD_COMPLETE, this.onLibraryLoaded);
+
+ let existing = this._effectMap.get(id);
+
+ if(!existing) existing = [];
+
+ existing.push(downloadLibrary);
+
+ this._effectMap.set(id, existing);
+ }
+ }
+
+ public downloadAvatarEffect(id: number, listener: IAvatarEffectListener): void
+ {
+ if(!this._isReady || !this._structure.renderManager.isReady)
+ {
+ this._initDownloadBuffer.push([id, listener]);
+
+ return;
+ }
+
+ 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;
+
+ this.downloadLibrary(library);
+ }
+ }
+ else
+ {
+ if(listener && !listener.disposed) listener.resetEffect(id);
+ }
+ }
+
+ private onAvatarRenderReady(event: INitroEvent): void
+ {
+ if(!event) return;
+
+ for(const [id, listener] of this._initDownloadBuffer)
+ {
+ this.downloadAvatarEffect(id, listener);
+ }
+
+ this._initDownloadBuffer = [];
+ }
+
+ 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);
+
+ this.dispatchEvent(new NitroEvent(EffectAssetDownloadManager.LIBRARY_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 processMissingLibraries(): void
+ {
+ const libraries = this._missingMandatoryLibs.slice();
+
+ for(const library of libraries)
+ {
+ if(!library) continue;
+
+ const map = this._effectMap.get(library);
+
+ if(map) for(const effect of map) effect && this.downloadLibrary(effect);
+ }
+ }
+
+ public isAvatarEffectReady(effect: number): boolean
+ {
+ if(!this._isReady || !this._structure.renderManager.isReady)
+ {
+ return false;
+ }
+
+ const pendingLibraries = this.getAvatarEffectPendingLibraries(effect);
+
+ return !pendingLibraries.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;
+ }
+
+ private downloadLibrary(library: EffectAssetDownloadLibrary): void
+ {
+ if(!library || library.isLoaded) return;
+
+ if((this._pendingDownloadQueue.indexOf(library) >= 0) || (this._currentDownloads.indexOf(library) >= 0)) return;
+
+ this._pendingDownloadQueue.push(library);
+
+ this.processDownloadQueue();
+ }
+
+ private processDownloadQueue(): void
+ {
+ while(this._pendingDownloadQueue.length)
+ {
+ const library = this._pendingDownloadQueue[0];
+
+ library.downloadAsset();
+
+ this._currentDownloads.push(this._pendingDownloadQueue.shift());
+ }
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/PlaceHolderAvatarImage.ts b/submodules/renderer/src/nitro/avatar/PlaceHolderAvatarImage.ts
new file mode 100644
index 0000000..1a56373
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/actions/ActionDefinition.ts b/submodules/renderer/src/nitro/avatar/actions/ActionDefinition.ts
new file mode 100644
index 0000000..cf4163b
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/actions/ActionDefinition.ts
@@ -0,0 +1,224 @@
+import { IActionDefinition } from '../../../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;
+ private _params: Map;
+ private _defaultParameterValue: string;
+ private _canvasOffsets: 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;
+ this._types = new Map();
+ this._params = new Map();
+ this._defaultParameterValue = '';
+ this._canvasOffsets = null;
+
+ 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/submodules/renderer/src/nitro/avatar/actions/ActionType.ts b/submodules/renderer/src/nitro/avatar/actions/ActionType.ts
new file mode 100644
index 0000000..d6d0312
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/actions/ActiveActionData.ts b/submodules/renderer/src/nitro/avatar/actions/ActiveActionData.ts
new file mode 100644
index 0000000..4488354
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/actions/ActiveActionData.ts
@@ -0,0 +1,73 @@
+import { IActionDefinition, IActiveActionData } from '../../../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/submodules/renderer/src/nitro/avatar/actions/AvatarActionManager.ts b/submodules/renderer/src/nitro/avatar/actions/AvatarActionManager.ts
new file mode 100644
index 0000000..a50cabd
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/actions/AvatarActionManager.ts
@@ -0,0 +1,186 @@
+import { IActiveActionData, IAssetManager } from '../../../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/submodules/renderer/src/nitro/avatar/actions/index.ts b/submodules/renderer/src/nitro/avatar/actions/index.ts
new file mode 100644
index 0000000..a849536
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/actions/index.ts
@@ -0,0 +1,4 @@
+export * from './ActionDefinition';
+export * from './ActionType';
+export * from './ActiveActionData';
+export * from './AvatarActionManager';
diff --git a/submodules/renderer/src/nitro/avatar/alias/AssetAlias.ts b/submodules/renderer/src/nitro/avatar/alias/AssetAlias.ts
new file mode 100644
index 0000000..b1a20a3
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/alias/AssetAlias.ts
@@ -0,0 +1,37 @@
+import { IAssetAlias } from '../../../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/submodules/renderer/src/nitro/avatar/alias/AssetAliasCollection.ts b/submodules/renderer/src/nitro/avatar/alias/AssetAliasCollection.ts
new file mode 100644
index 0000000..80e5c7e
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/alias/AssetAliasCollection.ts
@@ -0,0 +1,89 @@
+import { IAssetManager, IGraphicAsset } from '../../../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/submodules/renderer/src/nitro/avatar/alias/index.ts b/submodules/renderer/src/nitro/avatar/alias/index.ts
new file mode 100644
index 0000000..7d9524c
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/alias/index.ts
@@ -0,0 +1,2 @@
+export * from './AssetAlias';
+export * from './AssetAliasCollection';
diff --git a/submodules/renderer/src/nitro/avatar/animation/AddDataContainer.ts b/submodules/renderer/src/nitro/avatar/animation/AddDataContainer.ts
new file mode 100644
index 0000000..b20d1f4
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/AddDataContainer.ts
@@ -0,0 +1,61 @@
+import { IAssetAnimationAdd } from '../../../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/submodules/renderer/src/nitro/avatar/animation/Animation.ts b/submodules/renderer/src/nitro/avatar/animation/Animation.ts
new file mode 100644
index 0000000..74c5b8e
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/Animation.ts
@@ -0,0 +1,311 @@
+import { IAnimation, IAssetAnimation, IAssetAnimationFrame } from '../../../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/submodules/renderer/src/nitro/avatar/animation/AnimationManager.ts b/submodules/renderer/src/nitro/avatar/animation/AnimationManager.ts
new file mode 100644
index 0000000..73f3f23
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/AnimationManager.ts
@@ -0,0 +1,49 @@
+import { IAnimation, IAnimationLayerData, IAnimationManager, IAssetAnimation } from '../../../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/submodules/renderer/src/nitro/avatar/animation/AvatarAnimationLayerData.ts b/submodules/renderer/src/nitro/avatar/animation/AvatarAnimationLayerData.ts
new file mode 100644
index 0000000..d412430
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/AvatarAnimationLayerData.ts
@@ -0,0 +1,109 @@
+import { IActionDefinition, IActiveActionData, IAnimationLayerData, IAssetAnimationFramePart } from '../../../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/submodules/renderer/src/nitro/avatar/animation/AvatarDataContainer.ts b/submodules/renderer/src/nitro/avatar/animation/AvatarDataContainer.ts
new file mode 100644
index 0000000..bd6113c
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/AvatarDataContainer.ts
@@ -0,0 +1,136 @@
+import { IAssetAnimationAvatar, IAvatarDataContainer } from '../../../api';
+import { AdjustmentFilter } from '../../../pixi-proxy';
+
+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/submodules/renderer/src/nitro/avatar/animation/DirectionDataContainer.ts b/submodules/renderer/src/nitro/avatar/animation/DirectionDataContainer.ts
new file mode 100644
index 0000000..74cb246
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/DirectionDataContainer.ts
@@ -0,0 +1,16 @@
+import { IAssetAnimationDirection } from '../../../api';
+
+export class DirectionDataContainer
+{
+ private _offset: number;
+
+ constructor(k: IAssetAnimationDirection)
+ {
+ this._offset = k.offset;
+ }
+
+ public get offset(): number
+ {
+ return this._offset;
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/animation/SpriteDataContainer.ts b/submodules/renderer/src/nitro/avatar/animation/SpriteDataContainer.ts
new file mode 100644
index 0000000..e3c818e
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/animation/SpriteDataContainer.ts
@@ -0,0 +1,94 @@
+import { IAnimation, IAssetAnimationSprite, ISpriteDataContainer } from '../../../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/submodules/renderer/src/nitro/avatar/animation/index.ts b/submodules/renderer/src/nitro/avatar/animation/index.ts
new file mode 100644
index 0000000..f2e83c4
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/cache/AvatarImageActionCache.ts b/submodules/renderer/src/nitro/avatar/cache/AvatarImageActionCache.ts
new file mode 100644
index 0000000..5cc57fe
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/cache/AvatarImageActionCache.ts
@@ -0,0 +1,57 @@
+import { GetTickerTime } from '../../../pixi-proxy';
+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/submodules/renderer/src/nitro/avatar/cache/AvatarImageBodyPartCache.ts b/submodules/renderer/src/nitro/avatar/cache/AvatarImageBodyPartCache.ts
new file mode 100644
index 0000000..660355a
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/cache/AvatarImageBodyPartCache.ts
@@ -0,0 +1,96 @@
+import { IActiveActionData } from '../../../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/submodules/renderer/src/nitro/avatar/cache/AvatarImageCache.ts b/submodules/renderer/src/nitro/avatar/cache/AvatarImageCache.ts
new file mode 100644
index 0000000..beb4a06
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/cache/AvatarImageCache.ts
@@ -0,0 +1,522 @@
+import { Texture } from '@pixi/core';
+import { Matrix, Point, Rectangle } from '@pixi/math';
+import { AvatarDirectionAngle, AvatarFigurePartType, AvatarScaleType, GeometryType, IActiveActionData, IAvatarImage, RoomObjectSpriteData } from '../../../api';
+import { GetTickerTime, NitroContainer, NitroSprite } from '../../../pixi-proxy';
+import { AssetAliasCollection } from '../alias';
+import { AvatarAnimationLayerData } from '../animation';
+import { AvatarImageBodyPartContainer } from '../AvatarImageBodyPartContainer';
+import { AvatarImagePartContainer } from '../AvatarImagePartContainer';
+import { AvatarStructure } from '../AvatarStructure';
+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;
+ private _serverRenderData: RoomObjectSpriteData[];
+
+ 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();
+ this._serverRenderData = [];
+ }
+
+ 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(k: string, frameNumber: number, _arg_3: boolean = false): AvatarImageBodyPartContainer
+ {
+ let _local_4 = this.getBodyPartCache(k);
+
+ if(!_local_4)
+ {
+ _local_4 = new AvatarImageBodyPartCache();
+
+ this._cache.set(k, _local_4);
+ }
+
+ let _local_5 = _local_4.getDirection();
+ let _local_7 = _local_4.getAction();
+ let frameCount = frameNumber;
+
+ if(_local_7.definition.startFromFrameZero) frameCount -= _local_7.startFrame;
+
+ let _local_8 = _local_7;
+ let _local_9: string[] = [];
+ let _local_10: Map = new Map();
+ const _local_11 = new Point();
+
+ if(!((!(_local_7)) || (!(_local_7.definition))))
+ {
+ if(_local_7.definition.isAnimation)
+ {
+ let _local_15 = _local_5;
+
+ const _local_16 = this._structure.getAnimation(((_local_7.definition.state + '.') + _local_7.actionParameter));
+ const _local_17 = (frameNumber - _local_7.startFrame);
+
+ if(_local_16)
+ {
+ const _local_18 = _local_16.getLayerData(_local_17, k, _local_7.overridingAction);
+
+ if(_local_18)
+ {
+ _local_15 = (_local_5 + _local_18.dd);
+
+ if(_local_18.dd < 0)
+ {
+ if(_local_15 < 0)
+ {
+ _local_15 = (8 + _local_15);
+ }
+ else if(_local_15 > 7) _local_15 = (8 - _local_15);
+ }
+ else
+ {
+ if(_local_15 < 0)
+ {
+ _local_15 = (_local_15 + 8);
+ }
+ else if(_local_15 > 7) _local_15 = (_local_15 - 8);
+ }
+
+ if(this._scale === AvatarScaleType.LARGE)
+ {
+ _local_11.x = _local_18.dx;
+ _local_11.y = _local_18.dy;
+ }
+ else
+ {
+ _local_11.x = (_local_18.dx / 2);
+ _local_11.y = (_local_18.dy / 2);
+ }
+
+ frameCount = _local_18.animationFrame;
+
+ if(_local_18.action)
+ {
+ _local_7 = _local_18.action;
+ }
+
+ if(_local_18.type === AvatarAnimationLayerData.BODYPART)
+ {
+ if(_local_18.action != null)
+ {
+ _local_8 = _local_18.action;
+ }
+
+ _local_5 = _local_15;
+ }
+ else if(_local_18.type === AvatarAnimationLayerData.FX) _local_5 = _local_15;
+
+ _local_10 = _local_18.items;
+ }
+
+ _local_9 = _local_16.removeData;
+ }
+ }
+ }
+
+ let _local_12 = _local_4.getActionCache(_local_8);
+
+ if(!_local_12 || _arg_3)
+ {
+ _local_12 = new AvatarImageActionCache();
+ _local_4.updateActionCache(_local_8, _local_12);
+ }
+
+ let _local_13 = _local_12.getDirectionCache(_local_5);
+
+ if(!_local_13 || _arg_3)
+ {
+ const _local_19 = this._structure.getParts(k, this._avatar.getFigure(), _local_8, this._geometryType, _local_5, _local_9, this._avatar, _local_10);
+
+ _local_13 = new AvatarImageDirectionCache(_local_19);
+
+ _local_12.updateDirectionCache(_local_5, _local_13);
+ }
+
+ let _local_14 = _local_13.getImageContainer(frameCount);
+
+ if(!_local_14 || _arg_3)
+ {
+ const _local_20 = _local_13.getPartList();
+
+ _local_14 = this.renderBodyPart(_local_5, _local_20, frameCount, _local_7, _arg_3);
+
+ if(_local_14 && !_arg_3)
+ {
+ if(_local_14.isCacheable) _local_13.updateImageContainer(_local_14, frameCount);
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ const offset = this._structure.getFrameBodyPartOffset(_local_8, _local_5, frameCount, k);
+
+ _local_11.x += offset.x;
+ _local_11.y += offset.y;
+
+ _local_14.offset = _local_11;
+
+ return _local_14;
+ }
+
+ public getServerRenderData(): any[]
+ {
+ this._serverRenderData = [];
+
+ return this._serverRenderData;
+ }
+
+ 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, _arg_4: IActiveActionData, renderServerData: boolean = false): 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 = _arg_4.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.valid || !texture.baseTexture)
+ {
+ 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));
+
+ if(renderServerData)
+ {
+ const spriteData = new RoomObjectSpriteData();
+
+ spriteData.name = this._assets.getAssetName(assetName);
+ spriteData.x = (-(offset.x) - 33);
+ spriteData.y = -(offset.y);
+ spriteData.z = (this._serverRenderData.length * -0.0001);
+ spriteData.width = asset.rectangle.width;
+ spriteData.height = asset.rectangle.height;
+ spriteData.flipH = flipH;
+
+ if(assetPartDefinition === 'lay') spriteData.x = (spriteData.x + 53);
+
+ if(isFlipped)
+ {
+ spriteData.flipH = (!(spriteData.flipH));
+
+ if(spriteData.flipH) spriteData.x = (-(spriteData.x) - texture.width);
+ else spriteData.x = (spriteData.x + 65);
+ }
+
+ if(container.isColorable) spriteData.color = `${color}`;
+
+ this._serverRenderData.push(spriteData);
+ }
+
+ 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 NitroContainer();
+
+ const sprite = new NitroSprite(Texture.EMPTY);
+
+ sprite.width = bounds.width;
+ sprite.height = bounds.height;
+
+ container.addChild(sprite);
+
+ for(const data of k)
+ {
+ if(!data) continue;
+
+ const texture = data.texture;
+ const color = data.colorTransform;
+ const flipH = (!(isFlipped && data.flipH) && (isFlipped || data.flipH));
+ 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(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 NitroSprite(texture);
+
+ sprite.tint = color;
+ sprite.transform.setFromMatrix(this._matrix);
+
+ container.addChild(sprite);
+ }
+
+ return new ImageData(null, container.getLocalBounds(), point, isFlipped, null, container);
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/cache/AvatarImageDirectionCache.ts b/submodules/renderer/src/nitro/avatar/cache/AvatarImageDirectionCache.ts
new file mode 100644
index 0000000..da3a75e
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/cache/ImageData.ts b/submodules/renderer/src/nitro/avatar/cache/ImageData.ts
new file mode 100644
index 0000000..82b8339
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/cache/ImageData.ts
@@ -0,0 +1,67 @@
+import { Resource, Texture } from '@pixi/core';
+import { Container } from '@pixi/display';
+import { Point, Rectangle } from '@pixi/math';
+
+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/submodules/renderer/src/nitro/avatar/cache/index.ts b/submodules/renderer/src/nitro/avatar/cache/index.ts
new file mode 100644
index 0000000..d8d2e53
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/data/HabboAvatarAnimations.ts b/submodules/renderer/src/nitro/avatar/data/HabboAvatarAnimations.ts
new file mode 100644
index 0000000..f1fc2cc
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/data/HabboAvatarGeometry.ts b/submodules/renderer/src/nitro/avatar/data/HabboAvatarGeometry.ts
new file mode 100644
index 0000000..e6b9db0
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/data/HabboAvatarPartSets.ts b/submodules/renderer/src/nitro/avatar/data/HabboAvatarPartSets.ts
new file mode 100644
index 0000000..1bd4750
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/geometry/AvatarModelGeometry.ts b/submodules/renderer/src/nitro/avatar/geometry/AvatarModelGeometry.ts
new file mode 100644
index 0000000..0ad6fca
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/AvatarModelGeometry.ts
@@ -0,0 +1,287 @@
+import { IAvatarImage } from '../../../api';
+import { AvatarCanvas } from '../structure';
+import { AvatarSet } from './AvatarSet';
+import { GeometryBodyPart } from './GeometryBodyPart';
+import { Matrix4x4 } from './Matrix4x4';
+import { Vector3D } from './Vector3D';
+
+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/submodules/renderer/src/nitro/avatar/geometry/AvatarSet.ts b/submodules/renderer/src/nitro/avatar/geometry/AvatarSet.ts
new file mode 100644
index 0000000..2dee804
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/geometry/GeometryBodyPart.ts b/submodules/renderer/src/nitro/avatar/geometry/GeometryBodyPart.ts
new file mode 100644
index 0000000..1c23eb4
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/GeometryBodyPart.ts
@@ -0,0 +1,194 @@
+import { IAvatarImage } from '../../../api';
+import { GeometryItem } from './GeometryItem';
+import { Matrix4x4 } from './Matrix4x4';
+import { Node3D } from './Node3D';
+import { Vector3D } from './Vector3D';
+
+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/submodules/renderer/src/nitro/avatar/geometry/GeometryItem.ts b/submodules/renderer/src/nitro/avatar/geometry/GeometryItem.ts
new file mode 100644
index 0000000..25cd818
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/GeometryItem.ts
@@ -0,0 +1,55 @@
+import { Node3D } from './Node3D';
+import { Vector3D } from './Vector3D';
+
+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/submodules/renderer/src/nitro/avatar/geometry/Matrix4x4.ts b/submodules/renderer/src/nitro/avatar/geometry/Matrix4x4.ts
new file mode 100644
index 0000000..24cc063
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/Matrix4x4.ts
@@ -0,0 +1,133 @@
+import { Vector3D } from './Vector3D';
+
+export class Matrix4x4
+{
+ public static IDENTITY:Matrix4x4 = new Matrix4x4(1, 0, 0, 0, 1, 0, 0, 0, 1);
+ private static TOLERANS: number = 1E-18;
+
+ private _data: number[];
+
+ constructor(k: number = 0, _arg_2: number = 0, _arg_3: number = 0, _arg_4: number = 0, _arg_5: number = 0, _arg_6: number = 0, _arg_7: number = 0, _arg_8: number = 0, _arg_9: number = 0)
+ {
+ this._data = [k, _arg_2, _arg_3, _arg_4, _arg_5, _arg_6, _arg_7, _arg_8, _arg_9];
+ }
+
+ public static getXRotationMatrix(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+
+ return new Matrix4x4(1, 0, 0, 0, _local_3, -(_local_4), 0, _local_4, _local_3);
+ }
+
+ public static getYRotationMatrix(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+
+ return new Matrix4x4(_local_3, 0, _local_4, 0, 1, 0, -(_local_4), 0, _local_3);
+ }
+
+ public static getZRotationMatrix(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+
+ return new Matrix4x4(_local_3, -(_local_4), 0, _local_4, _local_3, 0, 0, 0, 1);
+ }
+
+ public identity(): Matrix4x4
+ {
+ this._data = [1, 0, 0, 0, 1, 0, 0, 0, 1];
+
+ return this;
+ }
+
+ public vectorMultiplication(k: Vector3D): Vector3D
+ {
+ const _local_2 = (((k.x * this._data[0]) + (k.y * this._data[3])) + (k.z * this._data[6]));
+ const _local_3 = (((k.x * this._data[1]) + (k.y * this._data[4])) + (k.z * this._data[7]));
+ const _local_4 = (((k.x * this._data[2]) + (k.y * this._data[5])) + (k.z * this._data[8]));
+
+ return new Vector3D(_local_2, _local_3, _local_4);
+ }
+
+ public multiply(k:Matrix4x4): Matrix4x4
+ {
+ const _local_2 = (((this._data[0] * k.data[0]) + (this._data[1] * k.data[3])) + (this._data[2] * k.data[6]));
+ const _local_3 = (((this._data[0] * k.data[1]) + (this._data[1] * k.data[4])) + (this._data[2] * k.data[7]));
+ const _local_4 = (((this._data[0] * k.data[2]) + (this._data[1] * k.data[5])) + (this._data[2] * k.data[8]));
+ const _local_5 = (((this._data[3] * k.data[0]) + (this._data[4] * k.data[3])) + (this._data[5] * k.data[6]));
+ const _local_6 = (((this._data[3] * k.data[1]) + (this._data[4] * k.data[4])) + (this._data[5] * k.data[7]));
+ const _local_7 = (((this._data[3] * k.data[2]) + (this._data[4] * k.data[5])) + (this._data[5] * k.data[8]));
+ const _local_8 = (((this._data[6] * k.data[0]) + (this._data[7] * k.data[3])) + (this._data[8] * k.data[6]));
+ const _local_9 = (((this._data[6] * k.data[1]) + (this._data[7] * k.data[4])) + (this._data[8] * k.data[7]));
+ const _local_10 = (((this._data[6] * k.data[2]) + (this._data[7] * k.data[5])) + (this._data[8] * k.data[8]));
+
+ return new Matrix4x4(_local_2, _local_3, _local_4, _local_5, _local_6, _local_7, _local_8, _local_9, _local_10);
+ }
+
+ public scalarMultiply(k: number): void
+ {
+ let index = 0;
+
+ while(index < this._data.length)
+ {
+ this._data[index] = (this._data[index] * k);
+
+ index++;
+ }
+ }
+
+ public rotateX(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+ const _local_5 = new Matrix4x4(1, 0, 0, 0, _local_3, -(_local_4), 0, _local_4, _local_3);
+
+ return _local_5.multiply(this);
+ }
+
+ public rotateY(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+ const _local_5 = new Matrix4x4(_local_3, 0, _local_4, 0, 1, 0, -(_local_4), 0, _local_3);
+
+ return _local_5.multiply(this);
+ }
+
+ public rotateZ(k: number): Matrix4x4
+ {
+ const _local_2 = ((k * Math.PI) / 180);
+ const _local_3 = Math.cos(_local_2);
+ const _local_4 = Math.sin(_local_2);
+ const _local_5 = new Matrix4x4(_local_3, -(_local_4), 0, _local_4, _local_3, 0, 0, 0, 1);
+
+ return _local_5.multiply(this);
+ }
+
+ public skew(): void
+ {
+ }
+
+ public transpose(): Matrix4x4
+ {
+ return new Matrix4x4(this._data[0], this._data[3], this._data[6], this._data[1], this._data[4], this._data[7], this._data[2], this._data[5], this._data[8]);
+ }
+
+ public equals(k: Matrix4x4): boolean
+ {
+ return false;
+ }
+
+ public get data(): number[]
+ {
+ return this._data;
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/geometry/Node3D.ts b/submodules/renderer/src/nitro/avatar/geometry/Node3D.ts
new file mode 100644
index 0000000..310dff4
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/Node3D.ts
@@ -0,0 +1,33 @@
+import { Matrix4x4 } from './Matrix4x4';
+import { Vector3D } from './Vector3D';
+
+export class Node3D
+{
+ private _location: Vector3D;
+ private _transformedLocation: Vector3D;
+ private _needsTransformation: boolean;
+
+ constructor(k: number, _arg_2: number, _arg_3: number)
+ {
+ this._location = new Vector3D(k, _arg_2, _arg_3);
+ this._transformedLocation = new Vector3D();
+ this._needsTransformation = false;
+
+ if(((!(k == 0)) || (!(_arg_2 == 0))) || (!(_arg_3 == 0))) this._needsTransformation = true;
+ }
+
+ public get location(): Vector3D
+ {
+ return this._location;
+ }
+
+ public get transformedLocation(): Vector3D
+ {
+ return this._transformedLocation;
+ }
+
+ public applyTransform(k: Matrix4x4): void
+ {
+ if(this._needsTransformation) this._transformedLocation = k.vectorMultiplication(this._location);
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/geometry/Vector3D.ts b/submodules/renderer/src/nitro/avatar/geometry/Vector3D.ts
new file mode 100644
index 0000000..4afba81
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/Vector3D.ts
@@ -0,0 +1,120 @@
+export class Vector3D
+{
+ private _x: number;
+ private _y: number;
+ private _z: number;
+
+ constructor(k: number = 0, _arg_2: number = 0, _arg_3: number = 0)
+ {
+ this._x = k;
+ this._y = _arg_2;
+ this._z = _arg_3;
+ }
+
+ public static dot(k: Vector3D, _arg_2: Vector3D): number
+ {
+ return ((k.x * _arg_2.x) + (k.y * _arg_2.y)) + (k.z * _arg_2.z);
+ }
+
+ public static cross(k: Vector3D, _arg_2: Vector3D): Vector3D
+ {
+ const _local_3 = new Vector3D();
+
+ _local_3.x = ((k.y * _arg_2.z) - (k.z * _arg_2.y));
+ _local_3.y = ((k.z * _arg_2.x) - (k.x * _arg_2.z));
+ _local_3.z = ((k.x * _arg_2.y) - (k.y * _arg_2.x));
+
+ return _local_3;
+ }
+
+ public static subtract(k: Vector3D, _arg_2: Vector3D): Vector3D
+ {
+ return new Vector3D((k.x - _arg_2.x), (k.y - _arg_2.y), (k.z - _arg_2.z));
+ }
+
+ public dot(k: Vector3D): number
+ {
+ return ((this._x * k.x) + (this._y * k.y)) + (this._z * k.z);
+ }
+
+ public cross(k: Vector3D): Vector3D
+ {
+ const _local_2 = new Vector3D();
+
+ _local_2.x = ((this._y * k.z) - (this._z * k.y));
+ _local_2.y = ((this._z * k.x) - (this._x * k.z));
+ _local_2.z = ((this._x * k.y) - (this._y * k.x));
+
+ return _local_2;
+ }
+
+ public subtract(k: Vector3D): void
+ {
+ this._x = (this._x - k.x);
+ this._y = (this._y - k.y);
+ this._z = (this._z - k.z);
+ }
+
+ public add(k: Vector3D): void
+ {
+ this._x = (this._x + k.x);
+ this._y = (this._y + k.y);
+ this._z = (this._z + k.z);
+ }
+
+ public normalize(): void
+ {
+ const k = (1 / this.length());
+
+ this._x = (this._x * k);
+ this._y = (this._y * k);
+ this._z = (this._z * k);
+ }
+
+ public scaleBy(value: number): void
+ {
+ this._x *= value;
+ this._y *= value;
+ this._z *= value;
+ }
+
+ public length(): number
+ {
+ return Math.sqrt((((this._x * this._x) + (this._y * this._y)) + (this._z * this._z)));
+ }
+
+ public toString(): string
+ {
+ return (((((('Vector3D: (' + this._x) + ',') + this._y) + ',') + this._z) + ')');
+ }
+
+ public get x(): number
+ {
+ return this._x;
+ }
+
+ public set x(k: number)
+ {
+ this._x = k;
+ }
+
+ public get y(): number
+ {
+ return this._y;
+ }
+
+ public set y(k: number)
+ {
+ this._y = k;
+ }
+
+ public get z(): number
+ {
+ return this._z;
+ }
+
+ public set z(k: number)
+ {
+ this._z = k;
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/geometry/index.ts b/submodules/renderer/src/nitro/avatar/geometry/index.ts
new file mode 100644
index 0000000..4e0b66d
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/geometry/index.ts
@@ -0,0 +1,7 @@
+export * from './AvatarModelGeometry';
+export * from './AvatarSet';
+export * from './GeometryBodyPart';
+export * from './GeometryItem';
+export * from './Matrix4x4';
+export * from './Node3D';
+export * from './Vector3D';
diff --git a/submodules/renderer/src/nitro/avatar/index.ts b/submodules/renderer/src/nitro/avatar/index.ts
new file mode 100644
index 0000000..86ffe1b
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/index.ts
@@ -0,0 +1,24 @@
+export * from './actions';
+export * from './alias';
+export * from './animation';
+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 './cache';
+export * from './data/HabboAvatarAnimations';
+export * from './data/HabboAvatarGeometry';
+export * from './data/HabboAvatarPartSets';
+export * from './EffectAssetDownloadLibrary';
+export * from './EffectAssetDownloadManager';
+export * from './geometry';
+export * from './pets';
+export * from './PlaceHolderAvatarImage';
+export * from './structure';
+export * from './structure/animation';
+export * from './structure/figure';
+export * from './structure/parts';
diff --git a/submodules/renderer/src/nitro/avatar/pets/PetCustomPart.ts b/submodules/renderer/src/nitro/avatar/pets/PetCustomPart.ts
new file mode 100644
index 0000000..7c1f802
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/pets/PetCustomPart.ts
@@ -0,0 +1,45 @@
+import { IPetCustomPart } from '../../../api';
+
+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/submodules/renderer/src/nitro/avatar/pets/PetFigureData.ts b/submodules/renderer/src/nitro/avatar/pets/PetFigureData.ts
new file mode 100644
index 0000000..fe59699
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/pets/PetFigureData.ts
@@ -0,0 +1,229 @@
+import { IPetCustomPart } from '../../../api';
+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/submodules/renderer/src/nitro/avatar/pets/index.ts b/submodules/renderer/src/nitro/avatar/pets/index.ts
new file mode 100644
index 0000000..5c93ab1
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/pets/index.ts
@@ -0,0 +1,2 @@
+export * from './PetCustomPart';
+export * from './PetFigureData';
diff --git a/submodules/renderer/src/nitro/avatar/structure/AvatarAnimationData.ts b/submodules/renderer/src/nitro/avatar/structure/AvatarAnimationData.ts
new file mode 100644
index 0000000..f8b2618
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/AvatarAnimationData.ts
@@ -0,0 +1,57 @@
+import { IActionDefinition, IFigureSetData } from '../../../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/submodules/renderer/src/nitro/avatar/structure/AvatarCanvas.ts b/submodules/renderer/src/nitro/avatar/structure/AvatarCanvas.ts
new file mode 100644
index 0000000..9916e68
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/AvatarCanvas.ts
@@ -0,0 +1,47 @@
+import { Point } from '@pixi/math';
+import { AvatarScaleType } from '../../../api';
+
+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/submodules/renderer/src/nitro/avatar/structure/AvatarStructureDownload.ts b/submodules/renderer/src/nitro/avatar/structure/AvatarStructureDownload.ts
new file mode 100644
index 0000000..365925c
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/AvatarStructureDownload.ts
@@ -0,0 +1,52 @@
+import { IFigureSetData, NitroLogger } from '../../../api';
+import { EventDispatcher } from '../../../core';
+import { NitroEvent } from '../../../events';
+
+export class AvatarStructureDownload extends EventDispatcher
+{
+ public static AVATAR_STRUCTURE_DONE: string = 'AVATAR_STRUCTURE_DONE';
+
+ private _dataReceiver: IFigureSetData;
+
+ constructor(downloadUrl: string, dataReceiver: IFigureSetData)
+ {
+ super();
+
+ this._dataReceiver = dataReceiver;
+
+ this.download(downloadUrl);
+ }
+
+ private download(url: string): void
+ {
+ const request = new XMLHttpRequest();
+
+ try
+ {
+ request.open('GET', url);
+
+ request.send();
+
+ request.onloadend = e =>
+ {
+ const response = request.responseText;
+
+ if(!response || !response.length) throw new Error('invalid_figure_data');
+
+ if(this._dataReceiver) this._dataReceiver.appendJSON(JSON.parse(response));
+
+ this.dispatchEvent(new NitroEvent(AvatarStructureDownload.AVATAR_STRUCTURE_DONE));
+ };
+
+ request.onerror = e =>
+ {
+ throw new Error('invalid_avatar_figure_data');
+ };
+ }
+
+ catch (e)
+ {
+ NitroLogger.error(e);
+ }
+ }
+}
diff --git a/submodules/renderer/src/nitro/avatar/structure/FigureSetData.ts b/submodules/renderer/src/nitro/avatar/structure/FigureSetData.ts
new file mode 100644
index 0000000..b855457
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/FigureSetData.ts
@@ -0,0 +1,129 @@
+import { IFigureData, IFigurePartSet, IFigureSetData, IPalette, ISetType, IStructureData } from '../../../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/submodules/renderer/src/nitro/avatar/structure/PartSetsData.ts b/submodules/renderer/src/nitro/avatar/structure/PartSetsData.ts
new file mode 100644
index 0000000..36548ee
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/PartSetsData.ts
@@ -0,0 +1,118 @@
+import { IActionDefinition, IFigureSetData } from '../../../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/submodules/renderer/src/nitro/avatar/structure/animation/AnimationAction.ts b/submodules/renderer/src/nitro/avatar/structure/animation/AnimationAction.ts
new file mode 100644
index 0000000..0b7e6ae
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/animation/AnimationAction.ts
@@ -0,0 +1,138 @@
+import { Point } from '@pixi/math';
+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/submodules/renderer/src/nitro/avatar/structure/animation/AnimationActionPart.ts b/submodules/renderer/src/nitro/avatar/structure/animation/AnimationActionPart.ts
new file mode 100644
index 0000000..ea16687
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/structure/animation/AvatarAnimationFrame.ts b/submodules/renderer/src/nitro/avatar/structure/animation/AvatarAnimationFrame.ts
new file mode 100644
index 0000000..3b9ec35
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/structure/animation/index.ts b/submodules/renderer/src/nitro/avatar/structure/animation/index.ts
new file mode 100644
index 0000000..98af842
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/animation/index.ts
@@ -0,0 +1,3 @@
+export * from './AnimationAction';
+export * from './AnimationActionPart';
+export * from './AvatarAnimationFrame';
diff --git a/submodules/renderer/src/nitro/avatar/structure/figure/FigurePart.ts b/submodules/renderer/src/nitro/avatar/structure/figure/FigurePart.ts
new file mode 100644
index 0000000..f870dc0
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/figure/FigurePart.ts
@@ -0,0 +1,58 @@
+import { IFigureDataPart, IFigurePart } from '../../../../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 dispose(): void
+ {
+
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/structure/figure/FigurePartSet.ts b/submodules/renderer/src/nitro/avatar/structure/figure/FigurePartSet.ts
new file mode 100644
index 0000000..f568386
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/figure/FigurePartSet.ts
@@ -0,0 +1,141 @@
+import { IFigureDataSet, IFigurePart, IFigurePartSet } from '../../../../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
+ {
+ for(const part of this._parts)
+ {
+ const figurePart = part as FigurePart;
+
+ figurePart.dispose();
+ }
+
+ 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/submodules/renderer/src/nitro/avatar/structure/figure/Palette.ts b/submodules/renderer/src/nitro/avatar/structure/figure/Palette.ts
new file mode 100644
index 0000000..cf179db
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/figure/Palette.ts
@@ -0,0 +1,45 @@
+import { AdvancedMap, IAdvancedMap, IFigureDataPalette, IPalette, IPartColor } from '../../../../api';
+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/submodules/renderer/src/nitro/avatar/structure/figure/PartColor.ts b/submodules/renderer/src/nitro/avatar/structure/figure/PartColor.ts
new file mode 100644
index 0000000..42d0838
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/figure/PartColor.ts
@@ -0,0 +1,46 @@
+import { IFigureDataColor, IPartColor } from '../../../../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/submodules/renderer/src/nitro/avatar/structure/figure/SetType.ts b/submodules/renderer/src/nitro/avatar/structure/figure/SetType.ts
new file mode 100644
index 0000000..9a87d6d
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/figure/SetType.ts
@@ -0,0 +1,103 @@
+import { AdvancedMap, IAdvancedMap, IFigureDataSetType, IFigurePartSet, ISetType } from '../../../../api';
+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/submodules/renderer/src/nitro/avatar/structure/figure/index.ts b/submodules/renderer/src/nitro/avatar/structure/figure/index.ts
new file mode 100644
index 0000000..1b9ebc3
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/structure/index.ts b/submodules/renderer/src/nitro/avatar/structure/index.ts
new file mode 100644
index 0000000..11269ae
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/index.ts
@@ -0,0 +1,8 @@
+export * from './animation';
+export * from './AvatarAnimationData';
+export * from './AvatarCanvas';
+export * from './AvatarStructureDownload';
+export * from './figure';
+export * from './FigureSetData';
+export * from './parts';
+export * from './PartSetsData';
diff --git a/submodules/renderer/src/nitro/avatar/structure/parts/ActivePartSet.ts b/submodules/renderer/src/nitro/avatar/structure/parts/ActivePartSet.ts
new file mode 100644
index 0000000..4244308
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/structure/parts/PartDefinition.ts b/submodules/renderer/src/nitro/avatar/structure/parts/PartDefinition.ts
new file mode 100644
index 0000000..19caa8c
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/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/submodules/renderer/src/nitro/avatar/structure/parts/index.ts b/submodules/renderer/src/nitro/avatar/structure/parts/index.ts
new file mode 100644
index 0000000..31faf62
--- /dev/null
+++ b/submodules/renderer/src/nitro/avatar/structure/parts/index.ts
@@ -0,0 +1,2 @@
+export * from './ActivePartSet';
+export * from './PartDefinition';
diff --git a/submodules/renderer/src/nitro/camera/RoomCameraWidgetEffect.ts b/submodules/renderer/src/nitro/camera/RoomCameraWidgetEffect.ts
new file mode 100644
index 0000000..2b3375c
--- /dev/null
+++ b/submodules/renderer/src/nitro/camera/RoomCameraWidgetEffect.ts
@@ -0,0 +1,61 @@
+import { Resource, Texture } from '@pixi/core';
+import { ColorMatrix } from '@pixi/filter-color-matrix';
+import { IRoomCameraWidgetEffect } from '../../api';
+
+export class RoomCameraWidgetEffect implements IRoomCameraWidgetEffect
+{
+ private _name: string;
+ private _minLevel: number = -1;
+ private _texture: Texture = null;
+ private _colorMatrix: ColorMatrix = null;
+ private _blendMode: number = null;
+
+ constructor(name: string, minLevel: number = -1, texture: Texture = null, colorMatrix: ColorMatrix = null, blendMode: number = 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(): number
+ {
+ return this._blendMode;
+ }
+
+ public set blendMode(blendMode: number)
+ {
+ this._blendMode = blendMode;
+ }
+
+ public get minLevel(): number
+ {
+ return this._minLevel;
+ }
+}
diff --git a/submodules/renderer/src/nitro/camera/RoomCameraWidgetManager.ts b/submodules/renderer/src/nitro/camera/RoomCameraWidgetManager.ts
new file mode 100644
index 0000000..1270463
--- /dev/null
+++ b/submodules/renderer/src/nitro/camera/RoomCameraWidgetManager.ts
@@ -0,0 +1,106 @@
+import { Texture } from '@pixi/core';
+import { ColorMatrix, ColorMatrixFilter } from '@pixi/filter-color-matrix';
+import { IEventDispatcher, IRoomCameraWidgetEffect, IRoomCameraWidgetManager, IRoomCameraWidgetSelectedEffect, NitroConfiguration } from '../../api';
+import { EventDispatcher } from '../../core';
+import { RoomCameraWidgetManagerEvent } from '../../events';
+import { NitroContainer, NitroSprite, TextureUtils } from '../../pixi-proxy';
+import { RoomCameraWidgetEffect } from './RoomCameraWidgetEffect';
+
+export class RoomCameraWidgetManager implements IRoomCameraWidgetManager
+{
+ private _effects: Map;
+ private _events: IEventDispatcher;
+ private _isLoaded: boolean;
+
+ constructor()
+ {
+ this._effects = new Map();
+ this._events = new EventDispatcher();
+ this._isLoaded = false;
+ }
+
+ public init(): void
+ {
+ if(this._isLoaded) return;
+
+ this._isLoaded = true;
+
+ const imagesUrl = NitroConfiguration.getValue('image.library.url') + 'Habbo-Stories/';
+ const effects = NitroConfiguration.getValue<{ name: string, colorMatrix?: ColorMatrix, minLevel: number, blendMode?: number, 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
+ {
+ cameraEffect.texture = Texture.from(imagesUrl + effect.name + '.png');
+ cameraEffect.blendMode = effect.blendMode;
+ }
+
+ this._effects.set(cameraEffect.name, cameraEffect);
+ }
+
+ this.events.dispatchEvent(new RoomCameraWidgetManagerEvent(RoomCameraWidgetManagerEvent.INITIALIZED));
+ }
+
+ public applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): HTMLImageElement
+ {
+ const container = new NitroContainer();
+ const sprite = new NitroSprite(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(!sprite.filters) sprite.filters = [];
+
+ sprite.filters.push(filter);
+ }
+ else
+ {
+ const effectSprite = new NitroSprite(effect.texture);
+ effectSprite.alpha = selectedEffect.alpha;
+ effectSprite.blendMode = effect.blendMode;
+
+ container.addChild(effectSprite);
+ }
+ }
+
+ return TextureUtils.generateImage(container);
+ }
+
+ public get effects(): Map
+ {
+ return this._effects;
+ }
+
+ public get events(): IEventDispatcher
+ {
+ return this._events;
+ }
+
+ public get isLoaded(): boolean
+ {
+ return this._isLoaded;
+ }
+}
diff --git a/submodules/renderer/src/nitro/camera/RoomCameraWidgetSelectedEffect.ts b/submodules/renderer/src/nitro/camera/RoomCameraWidgetSelectedEffect.ts
new file mode 100644
index 0000000..c0d9528
--- /dev/null
+++ b/submodules/renderer/src/nitro/camera/RoomCameraWidgetSelectedEffect.ts
@@ -0,0 +1,23 @@
+import { IRoomCameraWidgetEffect } from '../../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/submodules/renderer/src/nitro/camera/index.ts b/submodules/renderer/src/nitro/camera/index.ts
new file mode 100644
index 0000000..c79058c
--- /dev/null
+++ b/submodules/renderer/src/nitro/camera/index.ts
@@ -0,0 +1,3 @@
+export * from './RoomCameraWidgetEffect';
+export * from './RoomCameraWidgetManager';
+export * from './RoomCameraWidgetSelectedEffect';
diff --git a/submodules/renderer/src/nitro/communication/NitroCommunicationDemo.ts b/submodules/renderer/src/nitro/communication/NitroCommunicationDemo.ts
new file mode 100644
index 0000000..ebfbacc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/NitroCommunicationDemo.ts
@@ -0,0 +1,191 @@
+import { IConnection, INitroCommunicationDemo, INitroCommunicationManager, NitroConfiguration, NitroLogger } from '../../api';
+import { NitroManager } from '../../core';
+import { NitroCommunicationDemoEvent, SocketConnectionEvent } from '../../events';
+import { GetTickerTime } from '../../pixi-proxy';
+import { Nitro } from '../Nitro';
+import { AuthenticatedEvent, ClientHelloMessageComposer, ClientPingEvent, InfoRetrieveMessageComposer, PongMessageComposer, SSOTicketMessageComposer } from './messages';
+
+export class NitroCommunicationDemo extends NitroManager implements INitroCommunicationDemo
+{
+ private _communication: INitroCommunicationManager;
+
+ private _handShaking: boolean;
+ private _didConnect: boolean;
+
+ private _pongInterval: any;
+
+ constructor(communication: INitroCommunicationManager)
+ {
+ super();
+
+ this._communication = communication;
+
+ this._handShaking = false;
+ this._didConnect = false;
+
+ this._pongInterval = null;
+
+ this.onConnectionOpenedEvent = this.onConnectionOpenedEvent.bind(this);
+ this.onConnectionClosedEvent = this.onConnectionClosedEvent.bind(this);
+ this.onConnectionErrorEvent = this.onConnectionErrorEvent.bind(this);
+ this.sendPong = this.sendPong.bind(this);
+ }
+
+ protected onInit(): void
+ {
+ const connection = this._communication.connection;
+
+ if(connection)
+ {
+ connection.addEventListener(SocketConnectionEvent.CONNECTION_OPENED, this.onConnectionOpenedEvent);
+ connection.addEventListener(SocketConnectionEvent.CONNECTION_CLOSED, this.onConnectionClosedEvent);
+ connection.addEventListener(SocketConnectionEvent.CONNECTION_ERROR, this.onConnectionErrorEvent);
+ }
+
+ this._communication.registerMessageEvent(new ClientPingEvent(this.onClientPingEvent.bind(this)));
+ this._communication.registerMessageEvent(new AuthenticatedEvent(this.onAuthenticatedEvent.bind(this)));
+ }
+
+ protected onDispose(): void
+ {
+ const connection = this._communication.connection;
+
+ if(connection)
+ {
+ connection.removeEventListener(SocketConnectionEvent.CONNECTION_OPENED, this.onConnectionOpenedEvent);
+ connection.removeEventListener(SocketConnectionEvent.CONNECTION_CLOSED, this.onConnectionClosedEvent);
+ connection.removeEventListener(SocketConnectionEvent.CONNECTION_ERROR, this.onConnectionErrorEvent);
+ }
+
+ this._handShaking = false;
+
+ this.stopPonging();
+
+ super.onDispose();
+ }
+
+ private onConnectionOpenedEvent(event: Event): void
+ {
+ const connection = this._communication.connection;
+
+ if(!connection) return;
+
+ this._didConnect = true;
+
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_ESTABLISHED, connection);
+
+ if(NitroConfiguration.getValue('system.pong.manually', false)) this.startPonging();
+
+ this.startHandshake(connection);
+
+ connection.send(new ClientHelloMessageComposer(null, null, null, null));
+
+ this.tryAuthentication(connection);
+ }
+
+ private onConnectionClosedEvent(event: CloseEvent): void
+ {
+ const connection = this._communication.connection;
+
+ if(!connection) return;
+
+ this.stopPonging();
+
+ if(this._didConnect) this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_CLOSED, connection);
+ }
+
+ private onConnectionErrorEvent(event: CloseEvent): void
+ {
+ const connection = this._communication.connection;
+
+ if(!connection) return;
+
+ this.stopPonging();
+
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_ERROR, connection);
+ }
+
+ private tryAuthentication(connection: IConnection): void
+ {
+ if(!connection || !this.getSSO())
+ {
+ if(!this.getSSO())
+ {
+ NitroLogger.error('Login without an SSO ticket is not supported');
+ }
+
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKE_FAILED, connection);
+
+ return;
+ }
+
+ connection.send(new SSOTicketMessageComposer(this.getSSO(), GetTickerTime()));
+ }
+
+ private onClientPingEvent(event: ClientPingEvent): void
+ {
+ if(!event || !event.connection) return;
+
+ this.sendPong(event.connection);
+ }
+
+ private onAuthenticatedEvent(event: AuthenticatedEvent): void
+ {
+ if(!event || !event.connection) return;
+
+ this.completeHandshake(event.connection);
+
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED, event.connection);
+
+ event.connection.send(new InfoRetrieveMessageComposer());
+ }
+
+ private startHandshake(connection: IConnection): void
+ {
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKING, connection);
+
+ this._handShaking = true;
+ }
+
+ private completeHandshake(connection: IConnection): void
+ {
+ this.dispatchCommunicationDemoEvent(NitroCommunicationDemoEvent.CONNECTION_HANDSHAKED, connection);
+
+ this._handShaking = false;
+ }
+
+ private startPonging(): void
+ {
+ this.stopPonging();
+
+ this._pongInterval = setInterval(this.sendPong, NitroConfiguration.getValue('system.pong.interval.ms', 20000));
+ }
+
+ private stopPonging(): void
+ {
+ if(!this._pongInterval) return;
+
+ clearInterval(this._pongInterval);
+
+ this._pongInterval = null;
+ }
+
+ private sendPong(connection: IConnection = null): void
+ {
+ connection = ((connection || this._communication.connection) || null);
+
+ if(!connection) return;
+
+ connection.send(new PongMessageComposer());
+ }
+
+ private dispatchCommunicationDemoEvent(type: string, connection: IConnection): void
+ {
+ Nitro.instance.events.dispatchEvent(new NitroCommunicationDemoEvent(type, connection));
+ }
+
+ private getSSO(): string
+ {
+ return NitroConfiguration.getValue('sso.ticket', null);
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/NitroCommunicationManager.ts b/submodules/renderer/src/nitro/communication/NitroCommunicationManager.ts
new file mode 100644
index 0000000..dc12ec1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/NitroCommunicationManager.ts
@@ -0,0 +1,117 @@
+import { ICommunicationManager, IConnection, IConnectionStateListener, IMessageConfiguration, IMessageEvent, INitroCommunicationDemo, INitroCommunicationManager, INitroEvent, NitroConfiguration, NitroLogger } from '../../api';
+import { NitroManager } from '../../core';
+import { NitroCommunicationDemoEvent, SocketConnectionEvent } from '../../events';
+import { Nitro } from '../Nitro';
+import { NitroCommunicationDemo } from './NitroCommunicationDemo';
+import { NitroMessages } from './NitroMessages';
+
+export class NitroCommunicationManager extends NitroManager implements INitroCommunicationManager, IConnectionStateListener
+{
+ private _communication: ICommunicationManager;
+ private _connection: IConnection;
+ private _messages: IMessageConfiguration;
+
+ private _demo: INitroCommunicationDemo;
+
+ constructor(communication: ICommunicationManager)
+ {
+ super();
+
+ this._communication = communication;
+ this._connection = null;
+ this._messages = new NitroMessages();
+
+ this._demo = new NitroCommunicationDemo(this);
+
+ this.onConnectionOpenedEvent = this.onConnectionOpenedEvent.bind(this);
+ this.onConnectionClosedEvent = this.onConnectionClosedEvent.bind(this);
+ this.onConnectionErrorEvent = this.onConnectionErrorEvent.bind(this);
+ this.onConnectionAuthenticatedEvent = this.onConnectionAuthenticatedEvent.bind(this);
+ }
+
+ protected onInit(): void
+ {
+ if(this._connection) return;
+
+ Nitro.instance.events.addEventListener(NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED, this.onConnectionAuthenticatedEvent);
+
+ this._connection = this._communication.createConnection(this);
+
+ this._connection.registerMessages(this._messages);
+
+ this._connection.addEventListener(SocketConnectionEvent.CONNECTION_OPENED, this.onConnectionOpenedEvent);
+ this._connection.addEventListener(SocketConnectionEvent.CONNECTION_CLOSED, this.onConnectionClosedEvent);
+ this._connection.addEventListener(SocketConnectionEvent.CONNECTION_ERROR, this.onConnectionErrorEvent);
+
+ if(this._demo) this._demo.init();
+
+ this._connection.init(NitroConfiguration.getValue('socket.url'));
+ }
+
+ protected onDispose(): void
+ {
+ if(this._demo) this._demo.dispose();
+
+ if(this._connection)
+ {
+ this._connection.removeEventListener(SocketConnectionEvent.CONNECTION_OPENED, this.onConnectionOpenedEvent);
+ this._connection.removeEventListener(SocketConnectionEvent.CONNECTION_CLOSED, this.onConnectionClosedEvent);
+ this._connection.removeEventListener(SocketConnectionEvent.CONNECTION_ERROR, this.onConnectionErrorEvent);
+ }
+
+ Nitro.instance.events.removeEventListener(NitroCommunicationDemoEvent.CONNECTION_AUTHENTICATED, this.onConnectionAuthenticatedEvent);
+
+ super.onDispose();
+ }
+
+ private onConnectionOpenedEvent(event: Event): void
+ {
+ NitroLogger.log('Connection Initialized');
+ }
+
+ private onConnectionClosedEvent(event: CloseEvent): void
+ {
+ NitroLogger.log('Connection Closed');
+ }
+
+ private onConnectionErrorEvent(event: Event): void
+ {
+ NitroLogger.log('Connection Error');
+ }
+
+ private onConnectionAuthenticatedEvent(event: INitroEvent): void
+ {
+ NitroLogger.log('Connection Authenticated');
+
+ if(this._connection) this._connection.authenticated();
+ }
+
+ public connectionInit(socketUrl: string): void
+ {
+ NitroLogger.log('Initializing Connection', socketUrl);
+ }
+
+ 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 demo(): INitroCommunicationDemo
+ {
+ return this._demo;
+ }
+
+ public get connection(): IConnection
+ {
+ return this._connection;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/NitroMessages.ts b/submodules/renderer/src/nitro/communication/NitroMessages.ts
new file mode 100644
index 0000000..fb2a3fb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/NitroMessages.ts
@@ -0,0 +1,1179 @@
+import { IMessageConfiguration } from '../../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, CancelEventMessageComposer, CancelMarketplaceOfferMessageComposer, CancelMysteryBoxWaitMessageEvent, CancelPetBreedingComposer, CancelQuestMessageComposer, CanCreateRoomEvent, CanCreateRoomEventEvent, CanCreateRoomMessageComposer, CatalogGroupsComposer, CatalogPageExpirationEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPageWithEarliestExpiryMessageEvent, 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, ConvertedRoomIdEvent, ConvertGlobalRoomIdMessageComposer, CraftableProductsEvent, CraftComposer, CraftingRecipeEvent, CraftingRecipesAvailableEvent, CraftingResultEvent, CraftSecretComposer, CreateFlatMessageComposer, CurrentTimingCodeMessageEvent, CustomUserNotificationMessageEvent, DeclineFriendMessageComposer, DefaultSanctionMessageComposer, DeleteFavouriteRoomMessageComposer, DeletePendingCallsForHelpMessageComposer, DesktopViewComposer, DesktopViewEvent, DiceValueMessageEvent, DirectSMSClubBuyAvailableMessageEvent, DisconnectMessageComposer, DisconnectReasonEvent, DoorbellMessageEvent, EditEventMessageComposer, ElementPointerMessageEvent, EmailStatusResultEvent, EpicPopupMessageEvent, ExtendedProfileChangedMessageEvent, ExtendRentOrBuyoutFurniMessageComposer, ExtendRentOrBuyoutStripItemMessageComposer, 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, GetForumsListMessageComposer, GetForumStatsMessageComposer, 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, GotMysteryBoxPrizeMessageEvent, GoToFlatMessageComposer, 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, GuideSessionInvitedToGuideRoomMessageEvent, GuideSessionInviteRequesterMessageComposer, 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, IgnoredUsersEvent, IgnoreResultEvent, IgnoreUserComposer, IgnoreUserIdComposer, InClientLinkEvent, IncomingHeader, InfoFeedEnableMessageEvent, InfoRetrieveMessageComposer, InitCameraMessageEvent, InitDiffieHandshakeEvent, InitDiffieHandshakeMessageComposer, InstantMessageErrorEvent, InterstitialMessageEvent, InterstitialShownMessageComposer, IsBadgeRequestFulfilledEvent, IsOfferGiftableMessageEvent, IssueCloseNotificationMessageEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssuePickFailedMessageEvent, IsUserPartOfCompetitionMessageEvent, ItemDataUpdateMessageEvent, JoinedQueueMessageEvent, JoiningQueueFailedMessageEvent, JoinQueueMessageComposer, JukeboxPlayListFullMessageEvent, JukeboxSongDisksMessageEvent, LagWarningReportMessageComposer, LeaveQueueMessageComposer, LeftQueueMessageEvent, LimitedEditionSoldOutEvent, LimitedOfferAppearingNextMessageEvent, LoadGameMessageEvent, LoadGameUrlEvent, LoveLockFurniFinishedEvent, LoveLockFurniFriendConfirmedEvent, LoveLockFurniStartEvent, MaintenanceStatusMessageEvent, MakeOfferMessageComposer, MarkCatalogNewAdditionsPageOpenedComposer, MarketplaceBuyOfferResultEvent, MarketplaceCancelOfferResultEvent, MarketplaceCanMakeOfferResult, MarketplaceConfigurationEvent, MarketplaceItemStatsEvent, MarketplaceMakeOfferResult, MarketPlaceOffersEvent, MarketplaceOwnOffersEvent, MessageErrorEvent, MessengerInitComposer, MessengerInitEvent, MiniMailNewMessageEvent, MiniMailUnreadCountEvent, ModAlertMessageComposer, ModBanMessageComposer, ModerateMessageMessageComposer, ModerateRoomMessageComposer, ModerateThreadMessageComposer, ModeratorActionMessageComposer, ModeratorActionResultMessageEvent, ModeratorCautionEvent, ModeratorInitMessageEvent, ModeratorMessageEvent, ModeratorRoomInfoEvent, ModeratorToolPreferencesEvent, ModeratorUserInfoEvent, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModToolPreferencesComposer, ModToolSanctionComposer, ModTradingLockMessageComposer, MoodlightSettingsComposer, MoodlightSettingsSaveComposer, MoodlightTogggleStateComposer, MOTDNotificationEvent, MuteAllInRoomEvent, MyFavouriteRoomsSearchMessageComposer, MyFrequentRoomHistorySearchMessageComposer, MyFriendsRoomsSearchMessageComposer, MyGuildBasesSearchMessageComposer, MyRecommendedRoomsMessageComposer, MyRoomHistorySearchMessageComposer, MyRoomRightsSearchMessageComposer, MyRoomsSearchMessageComposer, MysteryBoxKeysEvent, MysteryBoxWaitingCanceledMessageComposer, NavigatorCategoryListModeComposer, NavigatorCollapsedEvent, NavigatorDeleteSavedSearchComposer, NavigatorHomeRoomEvent, NavigatorInitComposer, NavigatorLiftedEvent, NavigatorMetadataEvent, NavigatorOpenRoomCreatorEvent, NavigatorSearchCloseComposer, NavigatorSearchComposer, NavigatorSearchesEvent, NavigatorSearchEvent, NavigatorSearchOpenComposer, NavigatorSearchSaveComposer, NavigatorSettingsEvent, NavigatorSettingsSaveComposer, NewConsoleMessageEvent, NewFriendRequestEvent, NewUserExperienceGetGiftsComposer, NewUserExperienceGiftOfferMessageEvent, NewUserExperienceNotCompleteEvent, NewUserExperienceScriptProceedComposer, NoobnessLevelMessageEvent, NoOwnedRoomsAlertMessageEvent, NoSuchFlatEvent, 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, RoomPollResultEvent, PollErrorEvent, PollOfferEvent, PollRejectComposer, PollStartComposer, PongMessageComposer, PopularRoomsSearchMessageComposer, PopularRoomTagsResultEvent, PostMessageMessageComposer, PostMessageMessageEvent, PostQuizAnswersComposer, PostThreadMessageEvent, PresentOpenedMessageEvent, ProductOfferEvent, PromoArticlesMessageEvent, PublishPhotoMessageComposer, PurchaseBasicMembershipExtensionComposer, PurchaseErrorMessageEvent, PurchaseFromCatalogAsGiftComposer, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, PurchasePhotoMessageComposer, PurchaseRoomAdMessageComposer, PurchaseTargetedOfferComposer, PurchaseVipMembershipExtensionComposer, QuestCancelledMessageEvent, QuestCompletedMessageEvent, QuestDailyMessageEvent, QuestionAnsweredEvent, QuestionEvent, QuestionFinishedEvent, QuestMessageEvent, 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, RoomBannedUsersComposer, RoomBanUserComposer, RoomChatlogEvent, RoomChatSettingsEvent, 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, RoomReadyMessageEvent, RoomRightsClearEvent, RoomRightsEvent, RoomRightsOwnerEvent, RoomScoreEvent, RoomSettingsComposer, RoomSettingsDataEvent, RoomSettingsErrorEvent, RoomSettingsSavedEvent, RoomSettingsSaveErrorEvent, RoomSettingsUpdatedEvent, RoomsWhereMyFriendsAreSearchMessageComposer, RoomsWithHighestScoreSearchMessageComposer, 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, 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, SSOTicketMessageComposer, 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, VoucherRedeemErrorMessageEvent, VoucherRedeemOkMessageEvent, WardrobeMessageEvent, WeeklyCompetitiveFriendsLeaderboardEvent, WeeklyCompetitiveLeaderboardEvent, WeeklyGameRewardEvent, WeeklyGameRewardWinnersEvent, WelcomeGiftChangeEmailComposer, WelcomeGiftChangeEmailResultEvent, WelcomeGiftStatusEvent, WiredFurniActionEvent, WiredFurniConditionEvent, WiredFurniTriggerEvent, WiredOpenEvent, WiredRewardResultMessageEvent, WiredSaveSuccessEvent, WiredValidationErrorEvent, YouArePlayingGameEvent, YouAreSpectatorMessageEvent, YoutubeControlVideoMessageEvent, YoutubeDisplayPlaylistsEvent, YoutubeDisplayVideoMessageEvent, VotePollCounterMessageComposer } 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/submodules/renderer/src/nitro/communication/index.ts b/submodules/renderer/src/nitro/communication/index.ts
new file mode 100644
index 0000000..b5f456f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/index.ts
@@ -0,0 +1,4 @@
+export * from './messages';
+export * from './NitroCommunicationDemo';
+export * from './NitroCommunicationManager';
+export * from './NitroMessages';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/IncomingHeader.ts b/submodules/renderer/src/nitro/communication/messages/incoming/IncomingHeader.ts
new file mode 100644
index 0000000..f7ae0fd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/InterstitialMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/InterstitialMessageEvent.ts
new file mode 100644
index 0000000..bad2f83
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/InterstitialMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/RoomAdErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/RoomAdErrorEvent.ts
new file mode 100644
index 0000000..a355941
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/RoomAdErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/index.ts
new file mode 100644
index 0000000..7727ffc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/advertisement/index.ts
@@ -0,0 +1,2 @@
+export * from './InterstitialMessageEvent';
+export * from './RoomAdErrorEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityStatusMessageEvent.ts
new file mode 100644
index 0000000..0e5bc26
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityTimeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityTimeMessageEvent.ts
new file mode 100644
index 0000000..e1aa43e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/AvailabilityTimeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosedAndOpensEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosedAndOpensEvent.ts
new file mode 100644
index 0000000..e048a64
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosedAndOpensEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts
new file mode 100644
index 0000000..cae55a2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelClosesAndWillOpenAtEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts
new file mode 100644
index 0000000..74eda44
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/HotelWillCloseInMinutesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/MaintenanceStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/MaintenanceStatusMessageEvent.ts
new file mode 100644
index 0000000..3da15a8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/availability/MaintenanceStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/availability/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/availability/index.ts
new file mode 100644
index 0000000..8d657b5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts
new file mode 100644
index 0000000..886005c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/ChangeUserNameResultMessageEvent.ts
@@ -0,0 +1,25 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts
new file mode 100644
index 0000000..93d0d49
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/CheckUserNameResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/avatar/FigureUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/FigureUpdateEvent.ts
new file mode 100644
index 0000000..dacf15f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/FigureUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/avatar/WardrobeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/WardrobeMessageEvent.ts
new file mode 100644
index 0000000..b138c32
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/WardrobeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/avatar/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/index.ts
new file mode 100644
index 0000000..45a727e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/avatar/index.ts
@@ -0,0 +1,4 @@
+export * from './ChangeUserNameResultMessageEvent';
+export * from './CheckUserNameResultMessageEvent';
+export * from './FigureUpdateEvent';
+export * from './WardrobeMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotAddedToInventoryEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotAddedToInventoryEvent.ts
new file mode 100644
index 0000000..0036a0f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotAddedToInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotInventoryMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotInventoryMessageEvent.ts
new file mode 100644
index 0000000..f1c2a99
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotInventoryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotReceivedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotReceivedMessageEvent.ts
new file mode 100644
index 0000000..aab273d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotReceivedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotRemovedFromInventoryEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotRemovedFromInventoryEvent.ts
new file mode 100644
index 0000000..30982df
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/bots/BotRemovedFromInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/bots/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/bots/index.ts
new file mode 100644
index 0000000..dde10bf
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/bots/index.ts
@@ -0,0 +1,4 @@
+export * from './BotAddedToInventoryEvent';
+export * from './BotInventoryMessageEvent';
+export * from './BotReceivedMessageEvent';
+export * from './BotRemovedFromInventoryEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts
new file mode 100644
index 0000000..3e058ff
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhSanctionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhTopicsInitEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhTopicsInitEvent.ts
new file mode 100644
index 0000000..1109b5c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/CfhTopicsInitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/SanctionStatusEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/SanctionStatusEvent.ts
new file mode 100644
index 0000000..0710df1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/SanctionStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/index.ts
new file mode 100644
index 0000000..9b60cfb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/callforhelp/index.ts
@@ -0,0 +1,3 @@
+export * from './CfhSanctionMessageEvent';
+export * from './CfhTopicsInitEvent';
+export * from './SanctionStatusEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPublishStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPublishStatusMessageEvent.ts
new file mode 100644
index 0000000..f70e3d2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPublishStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts
new file mode 100644
index 0000000..7c0a8c6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraPurchaseOKMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraSnapshotMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraSnapshotMessageEvent.ts
new file mode 100644
index 0000000..d9a8f3d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraSnapshotMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraStorageUrlMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraStorageUrlMessageEvent.ts
new file mode 100644
index 0000000..7e7d1df
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CameraStorageUrlMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/CompetitionStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CompetitionStatusMessageEvent.ts
new file mode 100644
index 0000000..b2e1e10
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/CompetitionStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/InitCameraMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/InitCameraMessageEvent.ts
new file mode 100644
index 0000000..28d734f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/InitCameraMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/ThumbnailStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/ThumbnailStatusMessageEvent.ts
new file mode 100644
index 0000000..ec6e073
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/camera/ThumbnailStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/camera/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/camera/index.ts
new file mode 100644
index 0000000..03df06b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts
new file mode 100644
index 0000000..6e239a5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts
new file mode 100644
index 0000000..8341682
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/CampaignCalendarDoorOpenedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/campaign/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/index.ts
new file mode 100644
index 0000000..a6263ae
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/campaign/index.ts
@@ -0,0 +1,2 @@
+export * from './CampaignCalendarDataMessageEvent';
+export * from './CampaignCalendarDoorOpenedMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BonusRareInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BonusRareInfoMessageEvent.ts
new file mode 100644
index 0000000..2e6169a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BonusRareInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts
new file mode 100644
index 0000000..159bc88
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubFurniCountMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts
new file mode 100644
index 0000000..e4385dc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BuildersClubSubscriptionStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts
new file mode 100644
index 0000000..6cd294e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/BundleDiscountRulesetMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageExpirationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageExpirationEvent.ts
new file mode 100644
index 0000000..cd75eab
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageExpirationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageMessageEvent.ts
new file mode 100644
index 0000000..a9a6712
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts
new file mode 100644
index 0000000..50e8f9a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPageWithEarliestExpiryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPagesListEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPagesListEvent.ts
new file mode 100644
index 0000000..ae255bf
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPagesListEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPublishedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPublishedMessageEvent.ts
new file mode 100644
index 0000000..8364f2e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/CatalogPublishedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftInfoEvent.ts
new file mode 100644
index 0000000..cbae8d4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftSelectedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftSelectedEvent.ts
new file mode 100644
index 0000000..289b22c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ClubGiftSelectedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts
new file mode 100644
index 0000000..0b0fe3b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/DirectSMSClubBuyAvailableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/FireworkChargeDataEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/FireworkChargeDataEvent.ts
new file mode 100644
index 0000000..6617313
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/FireworkChargeDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts
new file mode 100644
index 0000000..39ff2e5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftReceiverNotFoundEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts
new file mode 100644
index 0000000..fe9077d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/GiftWrappingConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts
new file mode 100644
index 0000000..6347b0c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubExtendOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubOffersMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubOffersMessageEvent.ts
new file mode 100644
index 0000000..4a03436
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/HabboClubOffersMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts
new file mode 100644
index 0000000..e0aa9f7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/IsOfferGiftableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts
new file mode 100644
index 0000000..665c882
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedEditionSoldOutEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts
new file mode 100644
index 0000000..eb571d0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/LimitedOfferAppearingNextMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts
new file mode 100644
index 0000000..1ec3dfe
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/NotEnoughBalanceMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ProductOfferEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ProductOfferEvent.ts
new file mode 100644
index 0000000..f4c5126
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/ProductOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseErrorMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseErrorMessageEvent.ts
new file mode 100644
index 0000000..f2fd9da
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts
new file mode 100644
index 0000000..9c98db0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseNotAllowedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseOKMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseOKMessageEvent.ts
new file mode 100644
index 0000000..2a3eae5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/PurchaseOKMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts
new file mode 100644
index 0000000..c7b365e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/RoomAdPurchaseInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts
new file mode 100644
index 0000000..b119e45
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SeasonalCalendarDailyOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts
new file mode 100644
index 0000000..f77c4ee
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/SellablePetPalettesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferEvent.ts
new file mode 100644
index 0000000..6de23a9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts
new file mode 100644
index 0000000..71a0883
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/TargetedOfferNotFoundEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts
new file mode 100644
index 0000000..ceb9664
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts
new file mode 100644
index 0000000..5209e34
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/VoucherRedeemOkMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/catalog/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/catalog/index.ts
new file mode 100644
index 0000000..c7a281c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/client/ClientPingEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/client/ClientPingEvent.ts
new file mode 100644
index 0000000..05f4932
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/client/ClientPingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/client/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/client/index.ts
new file mode 100644
index 0000000..deaf34e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/client/index.ts
@@ -0,0 +1 @@
+export * from './ClientPingEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts
new file mode 100644
index 0000000..d947558
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionEntrySubmitResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts
new file mode 100644
index 0000000..e291b35
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CompetitionVotingInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts
new file mode 100644
index 0000000..7c9fab3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/CurrentTimingCodeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts
new file mode 100644
index 0000000..bf40c90
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/IsUserPartOfCompetitionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts
new file mode 100644
index 0000000..d8e1fda
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/NoOwnedRoomsAlertMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/SecondsUntilMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/SecondsUntilMessageEvent.ts
new file mode 100644
index 0000000..89432fa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/competition/SecondsUntilMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/competition/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/competition/index.ts
new file mode 100644
index 0000000..7c2b70a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftableProductsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftableProductsEvent.ts
new file mode 100644
index 0000000..268b907
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftableProductsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipeEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipeEvent.ts
new file mode 100644
index 0000000..dbfc86e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts
new file mode 100644
index 0000000..0e6ed08
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingRecipesAvailableEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingResultEvent.ts
new file mode 100644
index 0000000..15175c5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/CraftingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/crafting/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/index.ts
new file mode 100644
index 0000000..cf26449
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/crafting/index.ts
@@ -0,0 +1,4 @@
+export * from './CraftableProductsEvent';
+export * from './CraftingRecipeEvent';
+export * from './CraftingRecipesAvailableEvent';
+export * from './CraftingResultEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/desktop/DesktopViewEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/desktop/DesktopViewEvent.ts
new file mode 100644
index 0000000..0afb2c7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/desktop/DesktopViewEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/desktop/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/desktop/index.ts
new file mode 100644
index 0000000..2c0758c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/desktop/index.ts
@@ -0,0 +1 @@
+export * from './DesktopViewEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/AcceptFriendResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/AcceptFriendResultEvent.ts
new file mode 100644
index 0000000..c1fd8db
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/AcceptFriendResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts
new file mode 100644
index 0000000..37dedf3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FindFriendsProcessResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FollowFriendFailedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FollowFriendFailedEvent.ts
new file mode 100644
index 0000000..98f6061
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FollowFriendFailedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListFragmentEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListFragmentEvent.ts
new file mode 100644
index 0000000..a4cacdc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListFragmentEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListUpdateEvent.ts
new file mode 100644
index 0000000..64da572
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendListUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendNotificationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendNotificationEvent.ts
new file mode 100644
index 0000000..ccf0c87
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendRequestsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendRequestsEvent.ts
new file mode 100644
index 0000000..c490325
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/FriendRequestsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/HabboSearchResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/HabboSearchResultEvent.ts
new file mode 100644
index 0000000..3dbabf8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/HabboSearchResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/InstantMessageErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/InstantMessageErrorEvent.ts
new file mode 100644
index 0000000..3a3ab08
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/InstantMessageErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessageErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessageErrorEvent.ts
new file mode 100644
index 0000000..1510f56
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessageErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessengerInitEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessengerInitEvent.ts
new file mode 100644
index 0000000..ade1a64
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MessengerInitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailNewMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailNewMessageEvent.ts
new file mode 100644
index 0000000..5c452f1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailNewMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts
new file mode 100644
index 0000000..33dea73
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/MiniMailUnreadCountEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewConsoleMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewConsoleMessageEvent.ts
new file mode 100644
index 0000000..255d314
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewConsoleMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewFriendRequestEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewFriendRequestEvent.ts
new file mode 100644
index 0000000..a3b0bc5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/NewFriendRequestEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteErrorEvent.ts
new file mode 100644
index 0000000..c54b070
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteEvent.ts
new file mode 100644
index 0000000..2e0ea00
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/RoomInviteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/friendlist/index.ts
new file mode 100644
index 0000000..47c991c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts
new file mode 100644
index 0000000..1c680c8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2AccountGameStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts
new file mode 100644
index 0000000..fd07a8e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2GameDirectoryStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts
new file mode 100644
index 0000000..099bbe1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2InArenaQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts
new file mode 100644
index 0000000..cf72ef7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2JoiningGameFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts
new file mode 100644
index 0000000..65414fb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StartingGameFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts
new file mode 100644
index 0000000..90a5ef6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2StopCounterMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts
new file mode 100644
index 0000000..f6b7592
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/Game2UserLeftGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/directory/index.ts
new file mode 100644
index 0000000..8724315
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/game/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/index.ts
new file mode 100644
index 0000000..779f388
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/index.ts
@@ -0,0 +1,3 @@
+export * from './directory';
+export * from './lobby';
+export * from './score';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts
new file mode 100644
index 0000000..9f7702f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionCompletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts
new file mode 100644
index 0000000..c503c07
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts
new file mode 100644
index 0000000..2eaea11
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/AchievementResolutionsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts
new file mode 100644
index 0000000..3190043
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameAchievementsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameInviteMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameInviteMessageEvent.ts
new file mode 100644
index 0000000..36f21c0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameInviteMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameListMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameListMessageEvent.ts
new file mode 100644
index 0000000..8ce4aed
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameStatusMessageEvent.ts
new file mode 100644
index 0000000..401e8bc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/GameStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts
new file mode 100644
index 0000000..4c56240
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoinedQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts
new file mode 100644
index 0000000..6d4e646
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/JoiningQueueFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LeftQueueMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LeftQueueMessageEvent.ts
new file mode 100644
index 0000000..b502954
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LeftQueueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameMessageEvent.ts
new file mode 100644
index 0000000..67f2ec4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameUrlEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameUrlEvent.ts
new file mode 100644
index 0000000..829127e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/LoadGameUrlEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UnloadGameMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UnloadGameMessageEvent.ts
new file mode 100644
index 0000000..05be298
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UnloadGameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts
new file mode 100644
index 0000000..e228590
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/UserGameAchievementsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/lobby/index.ts
new file mode 100644
index 0000000..13421db
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts
new file mode 100644
index 0000000..98381f4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyFriendsLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts
new file mode 100644
index 0000000..4e99e2e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/Game2WeeklyLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts
new file mode 100644
index 0000000..76a64c9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveFriendsLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts
new file mode 100644
index 0000000..f9faf88
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyCompetitiveLeaderboardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardEvent.ts
new file mode 100644
index 0000000..d8464fd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts
new file mode 100644
index 0000000..c55fd0d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/WeeklyGameRewardWinnersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/game/score/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/game/score/index.ts
new file mode 100644
index 0000000..546b5a3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/generic/GenericErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/generic/GenericErrorEvent.ts
new file mode 100644
index 0000000..43b3a88
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/generic/GenericErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/generic/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/generic/index.ts
new file mode 100644
index 0000000..08ed38e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/generic/index.ts
@@ -0,0 +1 @@
+export * from './GenericErrorEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts
new file mode 100644
index 0000000..7e97ab2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/PhoneCollectionStateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts
new file mode 100644
index 0000000..c95a557
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryPhoneNumberResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts
new file mode 100644
index 0000000..016972f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/TryVerificationCodeResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/gifts/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/index.ts
new file mode 100644
index 0000000..ee498b9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/gifts/index.ts
@@ -0,0 +1,3 @@
+export * from './PhoneCollectionStateMessageEvent';
+export * from './TryPhoneNumberResultMessageEvent';
+export * from './TryVerificationCodeResultMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBadgePartsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBadgePartsEvent.ts
new file mode 100644
index 0000000..3cdfa97
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBadgePartsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBuyDataEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBuyDataEvent.ts
new file mode 100644
index 0000000..9447add
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupBuyDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts
new file mode 100644
index 0000000..007a78c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupConfirmMemberRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupInformationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupInformationEvent.ts
new file mode 100644
index 0000000..c75dae8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupInformationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupMembersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupMembersEvent.ts
new file mode 100644
index 0000000..90636b1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupMembersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupPurchasedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupPurchasedEvent.ts
new file mode 100644
index 0000000..2917115
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupPurchasedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupSettingsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupSettingsEvent.ts
new file mode 100644
index 0000000..efb9db1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/GroupSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts
new file mode 100644
index 0000000..ff97a5d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/group/HabboGroupDeactivatedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/group/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/group/index.ts
new file mode 100644
index 0000000..5fc4853
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumDataMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumDataMessageEvent.ts
new file mode 100644
index 0000000..a7de339
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumsListMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumsListMessageEvent.ts
new file mode 100644
index 0000000..f4ea021
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ForumsListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/GuildForumThreadsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/GuildForumThreadsEvent.ts
new file mode 100644
index 0000000..94bb408
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/GuildForumThreadsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostMessageMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostMessageMessageEvent.ts
new file mode 100644
index 0000000..147785c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostThreadMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostThreadMessageEvent.ts
new file mode 100644
index 0000000..077a6d6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/PostThreadMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts
new file mode 100644
index 0000000..30f5832
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/ThreadMessagesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts
new file mode 100644
index 0000000..922e757
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UnreadForumsCountMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateMessageMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateMessageMessageEvent.ts
new file mode 100644
index 0000000..24a109b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateThreadMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateThreadMessageEvent.ts
new file mode 100644
index 0000000..9ff2789
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/UpdateThreadMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/groupforums/index.ts
new file mode 100644
index 0000000..53566b9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts
new file mode 100644
index 0000000..c5b633e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/CompleteDiffieHandshakeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/DisconnectReasonEnum.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/DisconnectReasonEnum.ts
new file mode 100644
index 0000000..dcd50df
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/DisconnectReasonEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/DisconnectReasonEvent.ts
new file mode 100644
index 0000000..627fb1e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/DisconnectReasonEvent.ts
@@ -0,0 +1,33 @@
+import { DisconnectReasonEnum } from '.';
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../events';
+import { DisconnectReasonParser } from '../../parser';
+
+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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/IdentityAccountsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/IdentityAccountsEvent.ts
new file mode 100644
index 0000000..74a1550
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/IdentityAccountsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/InitDiffieHandshakeEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/InitDiffieHandshakeEvent.ts
new file mode 100644
index 0000000..d080543
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/InitDiffieHandshakeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/NoobnessLevelMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/NoobnessLevelMessageEvent.ts
new file mode 100644
index 0000000..113818b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/NoobnessLevelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/handshake/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/handshake/index.ts
new file mode 100644
index 0000000..81bb67a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts
new file mode 100644
index 0000000..d98a3e6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpDisabledNotifyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts
new file mode 100644
index 0000000..05d2695
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsDeletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts
new file mode 100644
index 0000000..34e1332
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpPendingCallsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpReplyMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpReplyMessageEvent.ts
new file mode 100644
index 0000000..dd95950
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpReplyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpResultMessageEvent.ts
new file mode 100644
index 0000000..1e71ecc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/CallForHelpResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts
new file mode 100644
index 0000000..c07cb7a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionDetachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts
new file mode 100644
index 0000000..da307ba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionOfferedToGuideMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts
new file mode 100644
index 0000000..009012e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionResultsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts
new file mode 100644
index 0000000..9cc7caa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionStartedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts
new file mode 100644
index 0000000..693f206
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/ChatReviewSessionVotingStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts
new file mode 100644
index 0000000..c989e4d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideOnDutyStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideReportingStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideReportingStatusMessageEvent.ts
new file mode 100644
index 0000000..ea4a56d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideReportingStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionAttachedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionAttachedMessageEvent.ts
new file mode 100644
index 0000000..539c041
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionAttachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionDetachedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionDetachedMessageEvent.ts
new file mode 100644
index 0000000..0eda406
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionDetachedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionEndedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionEndedMessageEvent.ts
new file mode 100644
index 0000000..58f7dd1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionEndedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionErrorMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionErrorMessageEvent.ts
new file mode 100644
index 0000000..16bbda3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionErrorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts
new file mode 100644
index 0000000..c259c55
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionInvitedToGuideRoomMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionMessageMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionMessageMessageEvent.ts
new file mode 100644
index 0000000..5d1ecb2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionMessageMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts
new file mode 100644
index 0000000..978862f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionPartnerIsTypingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts
new file mode 100644
index 0000000..ae2464c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionRequesterRoomMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionStartedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionStartedMessageEvent.ts
new file mode 100644
index 0000000..27939e1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideSessionStartedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts
new file mode 100644
index 0000000..cca728d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketCreationResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketResolutionMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketResolutionMessageEvent.ts
new file mode 100644
index 0000000..861035d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/GuideTicketResolutionMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/HotelMergeNameChangeEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/HotelMergeNameChangeEvent.ts
new file mode 100644
index 0000000..929a7b8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/HotelMergeNameChangeEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/IssueCloseNotificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/IssueCloseNotificationMessageEvent.ts
new file mode 100644
index 0000000..b8b3642
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/IssueCloseNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizDataMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizDataMessageEvent.ts
new file mode 100644
index 0000000..bf2b6ba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizResultsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizResultsMessageEvent.ts
new file mode 100644
index 0000000..d1d8806
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/help/QuizResultsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/help/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/help/index.ts
new file mode 100644
index 0000000..029319e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/index.ts
new file mode 100644
index 0000000..d9e905c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/index.ts
@@ -0,0 +1,75 @@
+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 './IncomingHeader';
+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 './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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementEvent.ts
new file mode 100644
index 0000000..9946dec
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsEvent.ts
new file mode 100644
index 0000000..cd167bd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts
new file mode 100644
index 0000000..4e33970
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/AchievementsScoreEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/index.ts
new file mode 100644
index 0000000..1344aec
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/achievements/index.ts
@@ -0,0 +1,3 @@
+export * from './AchievementEvent';
+export * from './AchievementsEvent';
+export * from './AchievementsScoreEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts
new file mode 100644
index 0000000..89570a2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectActivatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts
new file mode 100644
index 0000000..7f63c95
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectAddedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts
new file mode 100644
index 0000000..2e67098
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectExpiredEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts
new file mode 100644
index 0000000..451186c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectSelectedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts
new file mode 100644
index 0000000..40d0a22
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/AvatarEffectsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/avatareffect/index.ts
new file mode 100644
index 0000000..4a407ad
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts
new file mode 100644
index 0000000..bc6d58e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgePointLimitsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgeReceivedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgeReceivedEvent.ts
new file mode 100644
index 0000000..60d2b98
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgeReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgesEvent.ts
new file mode 100644
index 0000000..1b446e0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/BadgesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts
new file mode 100644
index 0000000..ca820dd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/IsBadgeRequestFulfilledEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/badges/index.ts
new file mode 100644
index 0000000..fe4c995
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts
new file mode 100644
index 0000000..153d74f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/FigureSetIdsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_16135.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_16135.ts
new file mode 100644
index 0000000..d1f356f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_16135.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_17532.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_17532.ts
new file mode 100644
index 0000000..f41a9c2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/_Str_17532.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/index.ts
new file mode 100644
index 0000000..477fbf3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/clothes/index.ts
@@ -0,0 +1,3 @@
+export * from './FigureSetIdsMessageEvent';
+export * from './_Str_16135';
+export * from './_Str_17532';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts
new file mode 100644
index 0000000..3baee65
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListAddOrUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListEvent.ts
new file mode 100644
index 0000000..abf9e71
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts
new file mode 100644
index 0000000..5b3b404
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListInvalidateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts
new file mode 100644
index 0000000..b7b1aaf
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurnitureListRemovedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts
new file mode 100644
index 0000000..50296e0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/FurniturePostItPlacedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts
new file mode 100644
index 0000000..d818781
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/PresentOpenedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/index.ts
new file mode 100644
index 0000000..349aca7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/gifts/index.ts
@@ -0,0 +1 @@
+export * from './PresentOpenedMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/furni/index.ts
new file mode 100644
index 0000000..79c3096
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/index.ts
new file mode 100644
index 0000000..4f6ae27
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts
new file mode 100644
index 0000000..f7f5b9a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingRequestEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts
new file mode 100644
index 0000000..62efea7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/ConfirmBreedingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts
new file mode 100644
index 0000000..b22de5b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/GoToBreedingNestFailureEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts
new file mode 100644
index 0000000..2f82165
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/NestBreedingSuccessEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts
new file mode 100644
index 0000000..ccfafbd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetAddedToInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetInventoryEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetInventoryEvent.ts
new file mode 100644
index 0000000..e6d02c3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts
new file mode 100644
index 0000000..b1414c3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetReceivedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts
new file mode 100644
index 0000000..0a4fda8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/PetRemovedFromInventoryEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/pets/index.ts
new file mode 100644
index 0000000..f7c5d97
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingAcceptEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingAcceptEvent.ts
new file mode 100644
index 0000000..bf71c7f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingAcceptEvent.ts
@@ -0,0 +1,26 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCloseEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCloseEvent.ts
new file mode 100644
index 0000000..bb333e8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCloseEvent.ts
@@ -0,0 +1,21 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCompletedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCompletedEvent.ts
new file mode 100644
index 0000000..d840bba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingCompletedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingConfirmationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingConfirmationEvent.ts
new file mode 100644
index 0000000..c6d33af
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingConfirmationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingListItemEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingListItemEvent.ts
new file mode 100644
index 0000000..34e1c6e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingListItemEvent.ts
@@ -0,0 +1,56 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts
new file mode 100644
index 0000000..be35e34
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNoSuchItemEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNotOpenEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNotOpenEvent.ts
new file mode 100644
index 0000000..2833163
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingNotOpenEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenEvent.ts
new file mode 100644
index 0000000..7c8fdfa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenEvent.ts
@@ -0,0 +1,36 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts
new file mode 100644
index 0000000..ba2f73c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOpenFailedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts
new file mode 100644
index 0000000..c082348
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingOtherNotAllowedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts
new file mode 100644
index 0000000..4f1b24f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/TradingYouAreNotAllowedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/inventory/trading/index.ts
new file mode 100644
index 0000000..cddd363
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/landingview/PromoArticlesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/PromoArticlesMessageEvent.ts
new file mode 100644
index 0000000..b74cb48
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/PromoArticlesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/landingview/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/index.ts
new file mode 100644
index 0000000..d566aeb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/index.ts
@@ -0,0 +1,2 @@
+export * from './PromoArticlesMessageEvent';
+export * from './votes';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts
new file mode 100644
index 0000000..a4d2631
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/CommunityGoalVoteMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/index.ts
new file mode 100644
index 0000000..adcbb0e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/landingview/votes/index.ts
@@ -0,0 +1 @@
+export * from './CommunityGoalVoteMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts
new file mode 100644
index 0000000..8ee9e26
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceBuyOfferResultEvent.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts
new file mode 100644
index 0000000..926d674
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCanMakeOfferResult.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts
new file mode 100644
index 0000000..b667147
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceCancelOfferResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts
new file mode 100644
index 0000000..c8f9713
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts
new file mode 100644
index 0000000..b42ad6b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceItemStatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts
new file mode 100644
index 0000000..67f2f7c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceMakeOfferResult.ts
@@ -0,0 +1,17 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOffersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOffersEvent.ts
new file mode 100644
index 0000000..f0430c8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOffersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts
new file mode 100644
index 0000000..07f829a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/MarketplaceOwnOffersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/marketplace/index.ts
new file mode 100644
index 0000000..7f4c2d5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/CfhChatlogEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/CfhChatlogEvent.ts
new file mode 100644
index 0000000..15f7070
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/CfhChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueDeletedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueDeletedMessageEvent.ts
new file mode 100644
index 0000000..fdc774b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueDeletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueInfoMessageEvent.ts
new file mode 100644
index 0000000..1cccb4d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssueInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssuePickFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssuePickFailedMessageEvent.ts
new file mode 100644
index 0000000..f57994e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/IssuePickFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts
new file mode 100644
index 0000000..3f92dca
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorActionResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorCautionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorCautionEvent.ts
new file mode 100644
index 0000000..5208f43
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorCautionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorInitMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorInitMessageEvent.ts
new file mode 100644
index 0000000..a4c027d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorInitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorMessageEvent.ts
new file mode 100644
index 0000000..f7c5a3b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorRoomInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorRoomInfoEvent.ts
new file mode 100644
index 0000000..37490d7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorRoomInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts
new file mode 100644
index 0000000..09d1bf8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorToolPreferencesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorUserInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorUserInfoEvent.ts
new file mode 100644
index 0000000..44961d5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/ModeratorUserInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomChatlogEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomChatlogEvent.ts
new file mode 100644
index 0000000..a41ada4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomVisitsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomVisitsEvent.ts
new file mode 100644
index 0000000..16a0339
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/RoomVisitsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserBannedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserBannedMessageEvent.ts
new file mode 100644
index 0000000..2c684e1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserBannedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserChatlogEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserChatlogEvent.ts
new file mode 100644
index 0000000..7134e28
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/UserChatlogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/moderation/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/moderation/index.ts
new file mode 100644
index 0000000..2bbc0c0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts
new file mode 100644
index 0000000..4d1ecb0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/CancelMysteryBoxWaitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts
new file mode 100644
index 0000000..a085d05
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/GotMysteryBoxPrizeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts
new file mode 100644
index 0000000..2f71462
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/MysteryBoxKeysEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts
new file mode 100644
index 0000000..945d362
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/ShowMysteryBoxWaitMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/index.ts
new file mode 100644
index 0000000..0d41333
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/mysterybox/index.ts
@@ -0,0 +1,4 @@
+export * from './CancelMysteryBoxWaitMessageEvent';
+export * from './GotMysteryBoxPrizeMessageEvent';
+export * from './MysteryBoxKeysEvent';
+export * from './ShowMysteryBoxWaitMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEvent.ts
new file mode 100644
index 0000000..ba811b9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEventEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEventEvent.ts
new file mode 100644
index 0000000..06641da
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CanCreateRoomEventEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts
new file mode 100644
index 0000000..eda6d8f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CategoriesWithVisitorCountEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts
new file mode 100644
index 0000000..71ea806
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/CompetitionRoomsDataMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/ConvertedRoomIdEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/ConvertedRoomIdEvent.ts
new file mode 100644
index 0000000..f0c39ce
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/ConvertedRoomIdEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/DoorbellMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/DoorbellMessageEvent.ts
new file mode 100644
index 0000000..f4c14d7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/DoorbellMessageEvent.ts
@@ -0,0 +1,21 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouriteChangedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouriteChangedEvent.ts
new file mode 100644
index 0000000..62f1c3a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouriteChangedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouritesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouritesEvent.ts
new file mode 100644
index 0000000..13aecb2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FavouritesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts
new file mode 100644
index 0000000..5ab87ba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatAccessDeniedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatCreatedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatCreatedEvent.ts
new file mode 100644
index 0000000..3702d19
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/FlatCreatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GetGuestRoomResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GetGuestRoomResultEvent.ts
new file mode 100644
index 0000000..190585c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GetGuestRoomResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GuestRoomSearchResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GuestRoomSearchResultEvent.ts
new file mode 100644
index 0000000..a7a65f8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/GuestRoomSearchResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorCollapsedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorCollapsedEvent.ts
new file mode 100644
index 0000000..344f474
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorCollapsedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorHomeRoomEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorHomeRoomEvent.ts
new file mode 100644
index 0000000..c8e80aa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorHomeRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorLiftedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorLiftedEvent.ts
new file mode 100644
index 0000000..8f95e10
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorLiftedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorMetadataEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorMetadataEvent.ts
new file mode 100644
index 0000000..f6c2dda
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorMetadataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts
new file mode 100644
index 0000000..a403734
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorOpenRoomCreatorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchEvent.ts
new file mode 100644
index 0000000..2ee5fa9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchesEvent.ts
new file mode 100644
index 0000000..32a72c4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSearchesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSettingsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSettingsEvent.ts
new file mode 100644
index 0000000..eed6578
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/NavigatorSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/PopularRoomTagsResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/PopularRoomTagsResultEvent.ts
new file mode 100644
index 0000000..49b4948
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/PopularRoomTagsResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventCancelEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventCancelEvent.ts
new file mode 100644
index 0000000..4846e93
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventCancelEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventEvent.ts
new file mode 100644
index 0000000..6e8a5de
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomEventEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts
new file mode 100644
index 0000000..30b57da
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomFilterSettingsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts
new file mode 100644
index 0000000..a7c04d3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomSettingsUpdatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts
new file mode 100644
index 0000000..7824096
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/RoomThumbnailUpdateResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserEventCatsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserEventCatsEvent.ts
new file mode 100644
index 0000000..693ee3f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserEventCatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserFlatCatsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserFlatCatsEvent.ts
new file mode 100644
index 0000000..9d53f37
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/UserFlatCatsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/navigator/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/navigator/index.ts
new file mode 100644
index 0000000..deac832
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/AchievementNotificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/AchievementNotificationMessageEvent.ts
new file mode 100644
index 0000000..81af079
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/AchievementNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts
new file mode 100644
index 0000000..c35b6cc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ActivityPointNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/BotErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/BotErrorEvent.ts
new file mode 100644
index 0000000..8770bfe
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/BotErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ClubGiftNotificationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ClubGiftNotificationEvent.ts
new file mode 100644
index 0000000..a322be9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ClubGiftNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ConnectionErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ConnectionErrorEvent.ts
new file mode 100644
index 0000000..ef2a223
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ConnectionErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ElementPointerMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ElementPointerMessageEvent.ts
new file mode 100644
index 0000000..9abc353
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/ElementPointerMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HabboBroadcastMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HabboBroadcastMessageEvent.ts
new file mode 100644
index 0000000..574423d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HabboBroadcastMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HotelWillShutdownEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HotelWillShutdownEvent.ts
new file mode 100644
index 0000000..481c158
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/HotelWillShutdownEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts
new file mode 100644
index 0000000..aa4a1f0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/InfoFeedEnableMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/MOTDNotificationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/MOTDNotificationEvent.ts
new file mode 100644
index 0000000..1ef2d8c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/MOTDNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/NotificationDialogMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/NotificationDialogMessageEvent.ts
new file mode 100644
index 0000000..102d35e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/NotificationDialogMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts
new file mode 100644
index 0000000..fe22151
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/OfferRewardDeliveredMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetLevelNotificationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetLevelNotificationEvent.ts
new file mode 100644
index 0000000..300836c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetLevelNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetPlacingErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetPlacingErrorEvent.ts
new file mode 100644
index 0000000..093b4c3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/PetPlacingErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/RestoreClientMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/RestoreClientMessageEvent.ts
new file mode 100644
index 0000000..8537758
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/RestoreClientMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/SimpleAlertMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/SimpleAlertMessageEvent.ts
new file mode 100644
index 0000000..c9192e2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/SimpleAlertMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/UnseenItemsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/UnseenItemsEvent.ts
new file mode 100644
index 0000000..51cbd65
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/UnseenItemsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/notifications/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/notifications/index.ts
new file mode 100644
index 0000000..943253e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGift.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGift.ts
new file mode 100644
index 0000000..ecc4045
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGift.ts
@@ -0,0 +1,37 @@
+import { IMessageDataWrapper } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts
new file mode 100644
index 0000000..3f8d4d0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOptions.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOptions.ts
new file mode 100644
index 0000000..ff2fd1b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceGiftOptions.ts
@@ -0,0 +1,40 @@
+import { IMessageDataWrapper } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts
new file mode 100644
index 0000000..89229d2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/nux/NewUserExperienceNotCompleteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/nux/ProductOffer.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/ProductOffer.ts
new file mode 100644
index 0000000..9fc58b4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/nux/ProductOffer.ts
@@ -0,0 +1,28 @@
+import { IMessageDataWrapper } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/nux/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/nux/index.ts
new file mode 100644
index 0000000..731f00d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/perk/PerkAllowancesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/perk/PerkAllowancesMessageEvent.ts
new file mode 100644
index 0000000..7d7cf0c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/perk/PerkAllowancesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/perk/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/perk/index.ts
new file mode 100644
index 0000000..b19fe4b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/perk/index.ts
@@ -0,0 +1 @@
+export * from './PerkAllowancesMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts
new file mode 100644
index 0000000..88d4482
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageRequestedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts
new file mode 100644
index 0000000..b1cd4f0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/OpenPetPackageResultMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetLevelUpdateMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetLevelUpdateMessageEvent.ts
new file mode 100644
index 0000000..e1c393c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetLevelUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetScratchFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetScratchFailedMessageEvent.ts
new file mode 100644
index 0000000..becaaac
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetScratchFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetTrainingPanelMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetTrainingPanelMessageEvent.ts
new file mode 100644
index 0000000..66cf798
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/PetTrainingPanelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts
new file mode 100644
index 0000000..21201a2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/PetBreedingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/index.ts
new file mode 100644
index 0000000..c18ef67
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/pet/breeding/index.ts
@@ -0,0 +1 @@
+export * from './PetBreedingMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/pet/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/pet/index.ts
new file mode 100644
index 0000000..d5fb00b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollContentsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollContentsEvent.ts
new file mode 100644
index 0000000..fa0674b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollContentsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollErrorEvent.ts
new file mode 100644
index 0000000..01bef84
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollOfferEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollOfferEvent.ts
new file mode 100644
index 0000000..6aecdd3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/PollOfferEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionAnsweredEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionAnsweredEvent.ts
new file mode 100644
index 0000000..7ea9203
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionAnsweredEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionEvent.ts
new file mode 100644
index 0000000..4ec3196
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionFinishedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionFinishedEvent.ts
new file mode 100644
index 0000000..809e2b2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/QuestionFinishedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/RoomPollResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/RoomPollResultEvent.ts
new file mode 100644
index 0000000..3af4f9d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/RoomPollResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/StartRoomPollEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/StartRoomPollEvent.ts
new file mode 100644
index 0000000..b89817c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/poll/StartRoomPollEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/poll/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/poll/index.ts
new file mode 100644
index 0000000..a90c6f5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts
new file mode 100644
index 0000000..9087c13
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalEarnedPrizesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts
new file mode 100644
index 0000000..0ad79a4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalHallOfFameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts
new file mode 100644
index 0000000..3c0dc05
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/CommunityGoalProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts
new file mode 100644
index 0000000..2f9d4bc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/ConcurrentUsersGoalProgressMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/EpicPopupMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/EpicPopupMessageEvent.ts
new file mode 100644
index 0000000..611bcda
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/EpicPopupMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCancelledMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCancelledMessageEvent.ts
new file mode 100644
index 0000000..c7f8b01
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCancelledMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCompletedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCompletedMessageEvent.ts
new file mode 100644
index 0000000..1cd26f7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestCompletedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestDailyMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestDailyMessageEvent.ts
new file mode 100644
index 0000000..5ddb274
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestDailyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestMessageEvent.ts
new file mode 100644
index 0000000..774c538
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestsMessageEvent.ts
new file mode 100644
index 0000000..f4a14f3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/QuestsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/SeasonalQuestsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/SeasonalQuestsMessageEvent.ts
new file mode 100644
index 0000000..0a5d07e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/quest/SeasonalQuestsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/quest/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/quest/index.ts
new file mode 100644
index 0000000..f2b8707
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts
new file mode 100644
index 0000000..41cfa6f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerFinishedMessageEvent.ts
@@ -0,0 +1,19 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerStatusMessageEvent.ts
new file mode 100644
index 0000000..b9a3c6f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/RecyclerStatusMessageEvent.ts
@@ -0,0 +1,20 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/recycler/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/index.ts
new file mode 100644
index 0000000..b6f40ee
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/recycler/index.ts
@@ -0,0 +1,2 @@
+export * from './RecyclerFinishedMessageEvent';
+export * from './RecyclerStatusMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterErrorEvent.ts
new file mode 100644
index 0000000..84bf3f8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterEvent.ts
new file mode 100644
index 0000000..11b9210
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomEnterEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomForwardEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomForwardEvent.ts
new file mode 100644
index 0000000..78ce833
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/RoomForwardEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts
new file mode 100644
index 0000000..5724323
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/RoomDoorbellAcceptedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/index.ts
new file mode 100644
index 0000000..ce67bee
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/doorbell/index.ts
@@ -0,0 +1 @@
+export * from './RoomDoorbellAcceptedEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/access/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/index.ts
new file mode 100644
index 0000000..0e1f2d7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsClearEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsClearEvent.ts
new file mode 100644
index 0000000..b383680
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsClearEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsEvent.ts
new file mode 100644
index 0000000..8299daf
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts
new file mode 100644
index 0000000..5b59c12
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/RoomRightsOwnerEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/index.ts
new file mode 100644
index 0000000..9569969
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/access/rights/index.ts
@@ -0,0 +1,3 @@
+export * from './RoomRightsClearEvent';
+export * from './RoomRightsEvent';
+export * from './RoomRightsOwnerEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotCommandConfigurationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotCommandConfigurationEvent.ts
new file mode 100644
index 0000000..2361f35
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotCommandConfigurationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts
new file mode 100644
index 0000000..d9d9fde
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotForceOpenContextMenuEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotSkillListUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotSkillListUpdateEvent.ts
new file mode 100644
index 0000000..19408ee
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/BotSkillListUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/index.ts
new file mode 100644
index 0000000..cae047b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/bots/index.ts
@@ -0,0 +1,3 @@
+export * from './BotCommandConfigurationEvent';
+export * from './BotForceOpenContextMenuEvent';
+export * from './BotSkillListUpdateEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomChatSettingsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomChatSettingsEvent.ts
new file mode 100644
index 0000000..50b4828
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomChatSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts
new file mode 100644
index 0000000..535fe0d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomEntryInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomScoreEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomScoreEvent.ts
new file mode 100644
index 0000000..70561d1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/RoomScoreEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/data/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/index.ts
new file mode 100644
index 0000000..e0187f0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/data/index.ts
@@ -0,0 +1,3 @@
+export * from './RoomChatSettingsEvent';
+export * from './RoomEntryInfoMessageEvent';
+export * from './RoomScoreEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts
new file mode 100644
index 0000000..18c4639
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/FavoriteMembershipUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts
new file mode 100644
index 0000000..a040c57
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsDataUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsRollingEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsRollingEvent.ts
new file mode 100644
index 0000000..6d96622
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/ObjectsRollingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/index.ts
new file mode 100644
index 0000000..24ceed5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/engine/index.ts
@@ -0,0 +1,3 @@
+export * from './FavoriteMembershipUpdateMessageEvent';
+export * from './ObjectsDataUpdateEvent';
+export * from './ObjectsRollingEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts
new file mode 100644
index 0000000..e61ec8d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/CustomUserNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/DiceValueMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/DiceValueMessageEvent.ts
new file mode 100644
index 0000000..53a0593
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/DiceValueMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts
new file mode 100644
index 0000000..c62d36d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurniRentOrBuyoutOfferMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureAliasesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureAliasesEvent.ts
new file mode 100644
index 0000000..a42fe46
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureAliasesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureDataEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureDataEvent.ts
new file mode 100644
index 0000000..4b3dc06
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts
new file mode 100644
index 0000000..784e625
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/FurnitureStackHeightEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts
new file mode 100644
index 0000000..761b30e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/GroupFurniContextMenuInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts
new file mode 100644
index 0000000..fd43849
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/ItemDataUpdateMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts
new file mode 100644
index 0000000..e7bf208
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFinishedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts
new file mode 100644
index 0000000..34316d6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniFriendConfirmedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts
new file mode 100644
index 0000000..f1b65c5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/LoveLockFurniStartEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts
new file mode 100644
index 0000000..35ac593
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/OneWayDoorStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts
new file mode 100644
index 0000000..248f101
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts
new file mode 100644
index 0000000..3a66e9d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceRentOkMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts
new file mode 100644
index 0000000..02d3d0b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RentableSpaceStatusMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts
new file mode 100644
index 0000000..03d9e4b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RequestSpamWallPostItMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts
new file mode 100644
index 0000000..dab41b9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomDimmerPresetsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts
new file mode 100644
index 0000000..64c303a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/RoomMessageNotificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts
new file mode 100644
index 0000000..a4b946c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/WelcomeGiftStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts
new file mode 100644
index 0000000..c606f9f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorAddEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts
new file mode 100644
index 0000000..0aa41ba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts
new file mode 100644
index 0000000..0da0907
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts
new file mode 100644
index 0000000..df99117
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/FurnitureFloorUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/floor/index.ts
new file mode 100644
index 0000000..4b0cb67
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/index.ts
new file mode 100644
index 0000000..3926d97
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts
new file mode 100644
index 0000000..4e79e1a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallAddEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts
new file mode 100644
index 0000000..95345c5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts
new file mode 100644
index 0000000..2435688
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts
new file mode 100644
index 0000000..ca6412e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/FurnitureWallUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/wall/index.ts
new file mode 100644
index 0000000..3065491
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts
new file mode 100644
index 0000000..412f630
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeControlVideoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts
new file mode 100644
index 0000000..73b715f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayPlaylistsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts
new file mode 100644
index 0000000..88835e9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/YoutubeDisplayVideoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/index.ts
new file mode 100644
index 0000000..4bb22a3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/furniture/youtube/index.ts
@@ -0,0 +1,3 @@
+export * from './YoutubeControlVideoMessageEvent';
+export * from './YoutubeDisplayPlaylistsEvent';
+export * from './YoutubeDisplayVideoMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/index.ts
new file mode 100644
index 0000000..81b327b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/FloorHeightMapEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/FloorHeightMapEvent.ts
new file mode 100644
index 0000000..d175061
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/FloorHeightMapEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts
new file mode 100644
index 0000000..445b0ae
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomEntryTileMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapEvent.ts
new file mode 100644
index 0000000..f736a30
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts
new file mode 100644
index 0000000..0cb80e1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomHeightMapUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts
new file mode 100644
index 0000000..6d288ed
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomOccupiedTilesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomPaintEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomPaintEvent.ts
new file mode 100644
index 0000000..62dc931
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomPaintEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomReadyMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomReadyMessageEvent.ts
new file mode 100644
index 0000000..820b527
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomReadyMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts
new file mode 100644
index 0000000..2af794d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/RoomVisualizationSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/mapping/index.ts
new file mode 100644
index 0000000..1ada5b8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetBreedingResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetBreedingResultEvent.ts
new file mode 100644
index 0000000..978082b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetBreedingResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetExperienceEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetExperienceEvent.ts
new file mode 100644
index 0000000..afb2f43
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetExperienceEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetFigureUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetFigureUpdateEvent.ts
new file mode 100644
index 0000000..a394202
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetFigureUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetInfoEvent.ts
new file mode 100644
index 0000000..83af268
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetStatusUpdateEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetStatusUpdateEvent.ts
new file mode 100644
index 0000000..063b6c0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/PetStatusUpdateEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/pet/index.ts
new file mode 100644
index 0000000..e43bd92
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouArePlayingGameEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouArePlayingGameEvent.ts
new file mode 100644
index 0000000..624fff2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouArePlayingGameEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts
new file mode 100644
index 0000000..510a74a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/YouAreSpectatorMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/session/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/index.ts
new file mode 100644
index 0000000..0ac722b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/session/index.ts
@@ -0,0 +1,2 @@
+export * from './YouArePlayingGameEvent';
+export * from './YouAreSpectatorMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitDanceEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitDanceEvent.ts
new file mode 100644
index 0000000..a91c329
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitDanceEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEffectEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEffectEvent.ts
new file mode 100644
index 0000000..42033bc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEffectEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEvent.ts
new file mode 100644
index 0000000..0b2aa79
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitExpressionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitExpressionEvent.ts
new file mode 100644
index 0000000..3448627
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitExpressionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemEvent.ts
new file mode 100644
index 0000000..32f0f0e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts
new file mode 100644
index 0000000..339c68f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitHandItemReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitIdleEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitIdleEvent.ts
new file mode 100644
index 0000000..a36d51d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitIdleEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitInfoEvent.ts
new file mode 100644
index 0000000..5220132
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitNumberEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitNumberEvent.ts
new file mode 100644
index 0000000..c5e4dcc
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitNumberEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitRemoveEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitRemoveEvent.ts
new file mode 100644
index 0000000..fb4d91d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitStatusEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitStatusEvent.ts
new file mode 100644
index 0000000..d4c5b9f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/RoomUnitStatusEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/FloodControlEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/FloodControlEvent.ts
new file mode 100644
index 0000000..b1bcee5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/FloodControlEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RemainingMuteEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RemainingMuteEvent.ts
new file mode 100644
index 0000000..381d72b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RemainingMuteEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts
new file mode 100644
index 0000000..e13b98c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts
new file mode 100644
index 0000000..fce5ce2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatShoutEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts
new file mode 100644
index 0000000..48ddb25
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitChatWhisperEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts
new file mode 100644
index 0000000..0f3a373
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/RoomUnitTypingEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/chat/index.ts
new file mode 100644
index 0000000..6ba41a2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/room/unit/index.ts
new file mode 100644
index 0000000..2592685
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniActionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniActionEvent.ts
new file mode 100644
index 0000000..7c0c528
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniActionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniConditionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniConditionEvent.ts
new file mode 100644
index 0000000..29a7f20
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniConditionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniTriggerEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniTriggerEvent.ts
new file mode 100644
index 0000000..3c15db6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredFurniTriggerEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredOpenEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredOpenEvent.ts
new file mode 100644
index 0000000..ef5b564
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredOpenEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts
new file mode 100644
index 0000000..fe7f998
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredRewardResultMessageEvent.ts
@@ -0,0 +1,19 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredSaveSuccessEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredSaveSuccessEvent.ts
new file mode 100644
index 0000000..e0a93a5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredSaveSuccessEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredValidationErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredValidationErrorEvent.ts
new file mode 100644
index 0000000..4f94d15
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/WiredValidationErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomevents/index.ts
new file mode 100644
index 0000000..0775d57
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts
new file mode 100644
index 0000000..672665a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/BannedUsersFromRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerAddedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerAddedEvent.ts
new file mode 100644
index 0000000..b94be07
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerAddedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts
new file mode 100644
index 0000000..d819b89
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllerRemovedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllersEvent.ts
new file mode 100644
index 0000000..23f5778
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/FlatControllersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/MuteAllInRoomEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/MuteAllInRoomEvent.ts
new file mode 100644
index 0000000..e5b0a9d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/MuteAllInRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/NoSuchFlatEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/NoSuchFlatEvent.ts
new file mode 100644
index 0000000..7f98b55
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/NoSuchFlatEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsDataEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsDataEvent.ts
new file mode 100644
index 0000000..c3b0744
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsDataEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts
new file mode 100644
index 0000000..8a0717d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts
new file mode 100644
index 0000000..65a1a0e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSaveErrorEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts
new file mode 100644
index 0000000..0623a85
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/RoomSettingsSavedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts
new file mode 100644
index 0000000..77e6bea
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/ShowEnforceRoomCategoryDialogEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts
new file mode 100644
index 0000000..7f45344
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/UserUnbannedFromRoomEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/roomsettings/index.ts
new file mode 100644
index 0000000..63327aa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/security/AuthenticatedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/security/AuthenticatedEvent.ts
new file mode 100644
index 0000000..2951c8e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/security/AuthenticatedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/security/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/security/index.ts
new file mode 100644
index 0000000..01a887c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/security/index.ts
@@ -0,0 +1 @@
+export * from './AuthenticatedEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts
new file mode 100644
index 0000000..c26ac25
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxPlayListFullMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts
new file mode 100644
index 0000000..d644867
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/JukeboxSongDisksMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/NowPlayingMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/NowPlayingMessageEvent.ts
new file mode 100644
index 0000000..610f392
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/NowPlayingMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/OfficialSongIdMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/OfficialSongIdMessageEvent.ts
new file mode 100644
index 0000000..aa9fbc1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/OfficialSongIdMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListMessageEvent.ts
new file mode 100644
index 0000000..bae8e8a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListSongAddedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListSongAddedMessageEvent.ts
new file mode 100644
index 0000000..84226f2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/PlayListSongAddedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/TraxSongInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/TraxSongInfoMessageEvent.ts
new file mode 100644
index 0000000..b6f69c2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/TraxSongInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts
new file mode 100644
index 0000000..4b4fcf6
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/sound/UserSongDisksInventoryMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/sound/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/sound/index.ts
new file mode 100644
index 0000000..24744f7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentLevelUpEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentLevelUpEvent.ts
new file mode 100644
index 0000000..6f6fcb0
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentLevelUpEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackLevelMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackLevelMessageEvent.ts
new file mode 100644
index 0000000..6fa90e1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackLevelMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackMessageEvent.ts
new file mode 100644
index 0000000..5f23177
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/talent/TalentTrackMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/talent/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/talent/index.ts
new file mode 100644
index 0000000..a05161d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/talent/index.ts
@@ -0,0 +1,3 @@
+export * from './TalentLevelUpEvent';
+export * from './TalentTrackLevelMessageEvent';
+export * from './TalentTrackMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts
new file mode 100644
index 0000000..6ef3e0a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/AccountSafetyLockStatusChangeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/ApproveNameMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/ApproveNameMessageEvent.ts
new file mode 100644
index 0000000..e623d61
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/ApproveNameMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/ChangeEmailResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/ChangeEmailResultEvent.ts
new file mode 100644
index 0000000..2a2e5bb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/ChangeEmailResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/EmailStatusResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/EmailStatusResultEvent.ts
new file mode 100644
index 0000000..2bdba56
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/EmailStatusResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts
new file mode 100644
index 0000000..148c29d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/ExtendedProfileChangedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupDetailsChangedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupDetailsChangedMessageEvent.ts
new file mode 100644
index 0000000..7001d7f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupDetailsChangedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts
new file mode 100644
index 0000000..4165aa1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/GroupMembershipRequestedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildEditFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildEditFailedMessageEvent.ts
new file mode 100644
index 0000000..6c25082
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildEditFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts
new file mode 100644
index 0000000..d94b89f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMemberMgmtFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent.ts
new file mode 100644
index 0000000..1638e10
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupBadgesMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupBadgesMessageEvent.ts
new file mode 100644
index 0000000..58f5d0d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupBadgesMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts
new file mode 100644
index 0000000..f0823bd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/HabboGroupJoinFailedMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoreResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoreResultEvent.ts
new file mode 100644
index 0000000..8b1fa48
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoreResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoredUsersEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoredUsersEvent.ts
new file mode 100644
index 0000000..c796988
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/IgnoredUsersEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/InClientLinkEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/InClientLinkEvent.ts
new file mode 100644
index 0000000..8218641
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/InClientLinkEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/MemberData.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/MemberData.ts
new file mode 100644
index 0000000..0c7f176
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/MemberData.ts
@@ -0,0 +1,70 @@
+import { IMessageDataWrapper } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/PetRespectNoficationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/PetRespectNoficationEvent.ts
new file mode 100644
index 0000000..b74bffe
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/PetRespectNoficationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/PetSupplementedNotificationEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/PetSupplementedNotificationEvent.ts
new file mode 100644
index 0000000..6a297e8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/PetSupplementedNotificationEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/RespectReceivedEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/RespectReceivedEvent.ts
new file mode 100644
index 0000000..f471295
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/RespectReceivedEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts
new file mode 100644
index 0000000..36b4bf5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/ScrSendKickbackInfoMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts
new file mode 100644
index 0000000..5561866
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/WelcomeGiftChangeEmailResultEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/access/UserPermissionsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/access/UserPermissionsEvent.ts
new file mode 100644
index 0000000..18615df
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/access/UserPermissionsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/access/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/access/index.ts
new file mode 100644
index 0000000..51901c3
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/access/index.ts
@@ -0,0 +1 @@
+export * from './UserPermissionsEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/user/data/RelationshipStatusInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/RelationshipStatusInfoEvent.ts
new file mode 100644
index 0000000..dd8e9af
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/RelationshipStatusInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserCurrentBadgesEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserCurrentBadgesEvent.ts
new file mode 100644
index 0000000..8231d90
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserCurrentBadgesEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserInfoEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserInfoEvent.ts
new file mode 100644
index 0000000..2cc8a57
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserInfoEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserNameChangeMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserNameChangeMessageEvent.ts
new file mode 100644
index 0000000..0614584
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserNameChangeMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserProfileEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserProfileEvent.ts
new file mode 100644
index 0000000..f8605a4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserProfileEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserSettingsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserSettingsEvent.ts
new file mode 100644
index 0000000..9b99632
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserSettingsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserTagsMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserTagsMessageEvent.ts
new file mode 100644
index 0000000..0aa1cb5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/UserTagsMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/data/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/data/index.ts
new file mode 100644
index 0000000..5994aa9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/user/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/index.ts
new file mode 100644
index 0000000..f6f8642
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCreditsEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCreditsEvent.ts
new file mode 100644
index 0000000..ea15f85
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCreditsEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts
new file mode 100644
index 0000000..864b97d
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/UserCurrencyEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/index.ts
new file mode 100644
index 0000000..f178ba7
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/currency/index.ts
@@ -0,0 +1,2 @@
+export * from './UserCreditsEvent';
+export * from './UserCurrencyEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/index.ts
new file mode 100644
index 0000000..e25bf08
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/index.ts
@@ -0,0 +1,2 @@
+export * from './currency';
+export * from './subscription';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts
new file mode 100644
index 0000000..5a014a9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/UserSubscriptionEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../../api';
+import { MessageEvent } from '../../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/index.ts
new file mode 100644
index 0000000..3d8e4a1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/inventory/subscription/index.ts
@@ -0,0 +1 @@
+export * from './UserSubscriptionEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts
new file mode 100644
index 0000000..0db5671
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/UserWardrobePageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../../api';
+import { MessageEvent } from '../../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/index.ts
new file mode 100644
index 0000000..179e41c
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/user/wardrobe/index.ts
@@ -0,0 +1 @@
+export * from './UserWardrobePageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/UserClassificationMessageEvent.ts b/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/UserClassificationMessageEvent.ts
new file mode 100644
index 0000000..6924bb4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/UserClassificationMessageEvent.ts
@@ -0,0 +1,16 @@
+import { IMessageEvent } from '../../../../../api';
+import { MessageEvent } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/index.ts b/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/index.ts
new file mode 100644
index 0000000..f56a235
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/incoming/userclassification/index.ts
@@ -0,0 +1 @@
+export * from './UserClassificationMessageEvent';
diff --git a/submodules/renderer/src/nitro/communication/messages/index.ts b/submodules/renderer/src/nitro/communication/messages/index.ts
new file mode 100644
index 0000000..ab2c88e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/index.ts
@@ -0,0 +1,3 @@
+export * from './incoming';
+export * from './outgoing';
+export * from './parser';
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/OutgoingHeader.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/OutgoingHeader.ts
new file mode 100644
index 0000000..4917a51
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts
new file mode 100644
index 0000000..1891b75
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/GetInterstitialMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class GetInterstitialMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts
new file mode 100644
index 0000000..d2ee6f2
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/InterstitialShownMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class InterstitialShownMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts
new file mode 100644
index 0000000..4abb88b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/RequestAchievementsMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class RequestAchievementsMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/index.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/index.ts
new file mode 100644
index 0000000..20e10fa
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/advertisement/index.ts
@@ -0,0 +1,3 @@
+export * from './GetInterstitialMessageComposer';
+export * from './InterstitialShownMessageComposer';
+export * from './RequestAchievementsMessageComposer';
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts
new file mode 100644
index 0000000..a441b7e
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/ChangeUserNameMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/CheckUserNameMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/CheckUserNameMessageComposer.ts
new file mode 100644
index 0000000..954f48f
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/CheckUserNameMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/GetWardrobeMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/GetWardrobeMessageComposer.ts
new file mode 100644
index 0000000..a7917ba
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/GetWardrobeMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts
new file mode 100644
index 0000000..877bae8
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/SaveWardrobeOutfitMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/index.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/index.ts
new file mode 100644
index 0000000..fc2f210
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/avatar/index.ts
@@ -0,0 +1,4 @@
+export * from './ChangeUserNameMessageComposer';
+export * from './CheckUserNameMessageComposer';
+export * from './GetWardrobeMessageComposer';
+export * from './SaveWardrobeOutfitMessageComposer';
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts
new file mode 100644
index 0000000..47e0411
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PhotoCompetitionMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class PhotoCompetitionMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PublishPhotoMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PublishPhotoMessageComposer.ts
new file mode 100644
index 0000000..a4f485a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PublishPhotoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class PublishPhotoMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PurchasePhotoMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PurchasePhotoMessageComposer.ts
new file mode 100644
index 0000000..96caeeb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/PurchasePhotoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RenderRoomMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RenderRoomMessageComposer.ts
new file mode 100644
index 0000000..940b731
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RenderRoomMessageComposer.ts
@@ -0,0 +1,43 @@
+import { RenderTexture } from '@pixi/core';
+import { IMessageComposer } from '../../../../../api';
+import { TextureUtils } from '../../../../../pixi-proxy';
+
+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 assignBitmap(texture: RenderTexture): void
+ {
+ const url = 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/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RenderRoomThumbnailMessageComposer.ts
new file mode 100644
index 0000000..78a2bf4
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RequestCameraConfigurationComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RequestCameraConfigurationComposer.ts
new file mode 100644
index 0000000..3d33db9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/RequestCameraConfigurationComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class RequestCameraConfigurationComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/camera/index.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/camera/index.ts
new file mode 100644
index 0000000..626c1cd
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/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/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts
new file mode 100644
index 0000000..357c9f9
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorAsStaffComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts
new file mode 100644
index 0000000..52d0dcb
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/OpenCampaignCalendarDoorComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/index.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/index.ts
new file mode 100644
index 0000000..2ecdb09
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/campaign/index.ts
@@ -0,0 +1,2 @@
+export * from './OpenCampaignCalendarDoorAsStaffComposer';
+export * from './OpenCampaignCalendarDoorComposer';
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts
new file mode 100644
index 0000000..30e3b6b
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceRoomItemMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts
new file mode 100644
index 0000000..c78e82a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubPlaceWallItemMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts
new file mode 100644
index 0000000..32d8619
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/BuildersClubQueryFurniCountMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts
new file mode 100644
index 0000000..b337eb5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBonusRareInfoMessageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class GetBonusRareInfoMessageComposer implements IMessageComposer>
+{
+ private _data: ConstructorParameters;
+
+ constructor()
+ {
+ this._data = [];
+ }
+
+ public getMessageArray()
+ {
+ return this._data;
+ }
+
+ public dispose(): void
+ {
+ return;
+ }
+}
diff --git a/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts
new file mode 100644
index 0000000..01e9ee1
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetBundleDiscountRulesetComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogIndexComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogIndexComposer.ts
new file mode 100644
index 0000000..b81e4e5
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogIndexComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageComposer.ts
new file mode 100644
index 0000000..70ccf9a
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../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/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts
new file mode 100644
index 0000000..2f32445
--- /dev/null
+++ b/submodules/renderer/src/nitro/communication/messages/outgoing/catalog/GetCatalogPageExpirationComposer.ts
@@ -0,0 +1,21 @@
+import { IMessageComposer } from '../../../../../api';
+
+export class GetCatalogPageExpirationComposer implements IMessageComposer